0001 // ResponseSerializer.swift 0002 // 0003 // The MIT License (MIT) 0004 // 0005 // Copyright (c) 2015 Zewo 0006 // 0007 // Permission is hereby granted, free of charge, to any person obtaining a copy 0008 // of this software and associated documentation files (the "Software"), to deal 0009 // in the Software without restriction, including without limitation the rights 0010 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0011 // copies of the Software, and to permit persons to whom the Software is 0012 // furnished to do so, subject to the following conditions: 0013 // 0014 // The above copyright notice and this permission notice shall be included in all 0015 // copies or substantial portions of the Software. 0016 // 0017 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0018 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0019 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0020 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0021 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0022 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 0023 // SOFTWARE. 0024 0025 @_exported import Stream 0026 0027 public struct ResponseSerializer: ResponseSerializerType { 0028 public init() {} 0029 0030 public func serialize(response: Response, @noescape send: Data throws -> Void) throws { 0031 let newLine: Data = [13, 10] 0032 0033 try send("HTTP/\(response.version.major).\(response.version.minor) \(response.statusCode) \(response.reasonPhrase)".data) 0034 try send(newLine) 0035 0036 for (name, value) in response.headers { 0037 try send("\(name): \(value)".data) 0038 try send(newLine) 0039 } 0040 0041 for cookie in response.cookies { 0042 try send("Set-Cookie: \(cookie.description)".data) 0043 try send(newLine) 0044 } 0045 0046 try send(newLine) 0047 0048 switch response.body { 0049 case .Buffer(let data): 0050 try send(data) 0051 case .Stream(let bodyStream): 0052 while !bodyStream.closed { 0053 let data = try bodyStream.receive() 0054 try send(String(data.count, radix: 16).data) 0055 try send(newLine) 0056 try send(data) 0057 try send(newLine) 0058 } 0059 0060 try send("0".data) 0061 try send(newLine) 0062 try send(newLine) 0063 } 0064 } 0065 } 0066