0001 // RequestParser.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 import CHTTPParser 0026 @_exported import Data 0027 0028 typealias ResponseContext= UnsafeMutablePointer<ResponseParserContext> 0029 0030 struct ResponseParserContext
ResponseParser.swift:63 let context: ResponseContextResponseParser.swift:68 context = ResponseContext.alloc(1)ResponseParser.swift:120 return ResponseContext(parser.memory.data).withMemory {ResponseParser.swift:131 return ResponseContext(parser.memory.data).withMemory {ResponseParser.swift:149 return ResponseContext(parser.memory.data).withMemory {ResponseParser.swift:174 return ResponseContext(parser.memory.data).withMemory {ResponseParser.swift:191 return ResponseContext(parser.memory.data).withMemory {ResponseParser.swift:198 return ResponseContext(parser.memory.data).withMemory {{ 0031 var statusCode
ResponseParser.swift:28 typealias ResponseContext = UnsafeMutablePointer<ResponseParserContext>ResponseParser.swift:69 context.initialize(ResponseParserContext { response in: Int = 0 0032 var reasonPhrase
ResponseParser.swift:184 $0.statusCode = Int(parser.memory.status_code)ResponseParser.swift:200 status: Status(statusCode: $0.statusCode, reasonPhrase: $0.reasonPhrase),ResponseParser.swift:210 $0.statusCode = 0: String = "" 0033 var version
ResponseParser.swift:200 status: Status(statusCode: $0.statusCode, reasonPhrase: $0.reasonPhrase),ResponseParser.swift:211 $0.reasonPhrase = "": (major: Int, minor: Int) = (0, 0) 0034 var headers
ResponseParser.swift:185 $0.version = (Int(parser.memory.http_major), Int(parser.memory.http_minor))ResponseParser.swift:212 $0.version = (0, 0): Headers = [:] 0035 var cookies
ResponseParser.swift:165 let previousHeaderValue = $0.headers[headerName] ?? ""ResponseParser.swift:213 $0.headers = [:]: Cookies = [] 0036 var body: Data = [] 0037 0038 var buildingCookieValue
ResponseParser.swift:138 $0.cookies.insert(cookie)ResponseParser.swift:177 $0.cookies.insert(cookie)ResponseParser.swift:214 $0.cookies = []= "" 0039 var buildingHeaderField
ResponseParser.swift:136 if $0.buildingCookieValue != "" {ResponseParser.swift:137 if let cookie = try? Cookie.parseSetCookie($0.buildingCookieValue) {ResponseParser.swift:140 $0.buildingCookieValue = ""ResponseParser.swift:175 if $0.buildingCookieValue != "" {ResponseParser.swift:176 if let cookie = try? Cookie.parseSetCookie($0.buildingCookieValue) {ResponseParser.swift:181 $0.buildingCookieValue = ""= "" 0040 var currentHeaderField
ResponseParser.swift:150 if $0.buildingHeaderField != "" {ResponseParser.swift:151 $0.currentHeaderField = $0.buildingHeaderFieldResponseParser.swift:154 $0.buildingHeaderField = ""ResponseParser.swift:182 $0.buildingHeaderField = ""= "" 0041 var completion
ResponseParser.swift:151 $0.currentHeaderField = $0.buildingHeaderFieldResponseParser.swift:155 let headerField = $0.currentHeaderFieldResponseParser.swift:183 $0.currentHeaderField = "": Response -> Void 0042 0043 init
ResponseParser.swift:44 self.completion = completion(completion: Response -> Void) { 0044 self.completion = completion 0045 } 0046 } 0047 0048 var responseSettings
ResponseParser.swift:69 context.initialize(ResponseParserContext { response in: http_parser_settings = { 0049 var settings = http_parser_settings() 0050 http_parser_settings_init(&settings) 0051 0052 settings.on_status = onResponseStatus 0053 settings.on_header_field = onResponseHeaderField 0054 settings.on_header_value = onResponseHeaderValue 0055 settings.on_headers_complete = onResponseHeadersComplete 0056 settings.on_body = onResponseBody 0057 settings.on_message_complete = onResponseMessageComplete 0058 0059 return settings 0060 }() 0061 0062 public final class ResponseParser
ResponseParser.swift:95 let bytesParsed = http_parser_execute(&parser, &responseSettings, buffer, data.count): ResponseParserType { 0063 let context
ResponseParser.swift:113 extension ResponseParser {: ResponseContext 0064 var parser
ResponseParser.swift:68 context = ResponseContext.alloc(1)ResponseParser.swift:69 context.initialize(ResponseParserContext { response inResponseParser.swift:77 context.destroy()ResponseParser.swift:78 context.dealloc(1)ResponseParser.swift:83 parser.data = UnsafeMutablePointer<Void>(context)= http_parser() 0065 var response
ResponseParser.swift:82 http_parser_init(&parser, HTTP_RESPONSE)ResponseParser.swift:83 parser.data = UnsafeMutablePointer<Void>(context)ResponseParser.swift:99 let errorName = http_errno_name(http_errno(parser.http_errno))ResponseParser.swift:100 let errorDescription = http_errno_description(http_errno(parser.http_errno)): Response? 0066 0067 public init() { 0068 context = ResponseContext.alloc(1) 0069 context.initialize(ResponseParserContext { response in 0070 self.response = response 0071 }) 0072 0073 resetParser() 0074 } 0075 0076 deinit { 0077 context.destroy() 0078 context.dealloc(1) 0079 } 0080 0081 func resetParser
ResponseParser.swift:70 self.response = responseResponseParser.swift:87 defer { response = nil }ResponseParser.swift:105 if response != nil {() { 0082 http_parser_init(&parser, HTTP_RESPONSE) 0083 parser.data = UnsafeMutablePointer<Void>(context) 0084 } 0085 0086 public func parse
ResponseParser.swift:73 resetParser()ResponseParser.swift:98 resetParser()ResponseParser.swift:106 resetParser()(data: Data) throws -> Response? { 0087 defer { response = nil } 0088 0089 var data = data 0090 0091 let buffer = data.withUnsafeMutableBufferPointer { 0092 UnsafeMutablePointer<Int8>($0.baseAddress) 0093 } 0094 0095 let bytesParsed = http_parser_execute(&parser, &responseSettings, buffer, data.count) 0096 0097 if bytesParsed != data.count { 0098 resetParser() 0099 let errorName = http_errno_name(http_errno(parser.http_errno)) 0100 let errorDescription = http_errno_description(http_errno(parser.http_errno)) 0101 let error = ParseError(description: "\(String.fromCString(errorName)!): \(String.fromCString(errorDescription)!)") 0102 throw error 0103 } 0104 0105 if response != nil { 0106 resetParser() 0107 } 0108 0109 return response 0110 } 0111 } 0112 0113 extension ResponseParser { 0114 public func parse(convertible: DataConvertible) throws -> Response? { 0115 return try parse(convertible.data) 0116 } 0117 } 0118 0119 func onResponseStatus
ResponseParser.swift:114 public func parse(convertible: DataConvertible) throws -> Response? {(parser: Parser, data: UnsafePointer<Int8>, length: Int) -> Int32 { 0120 return ResponseContext(parser.memory.data).withMemory { 0121 guard let reasonPhrase = String(pointer: data, length: length) else { 0122 return 1 0123 } 0124 0125 $0.reasonPhrase += reasonPhrase 0126 return 0 0127 } 0128 } 0129 0130 func onResponseHeaderField
ResponseParser.swift:52 settings.on_status = onResponseStatus(parser: Parser, data: UnsafePointer<Int8>, length: Int) -> Int32 { 0131 return ResponseContext(parser.memory.data).withMemory { 0132 guard let headerField = String(pointer: data, length: length) else { 0133 return 1 0134 } 0135 0136 if $0.buildingCookieValue != "" { 0137 if let cookie = try? Cookie.parseSetCookie($0.buildingCookieValue) { 0138 $0.cookies.insert(cookie) 0139 } 0140 $0.buildingCookieValue = "" 0141 } 0142 0143 $0.buildingHeaderField += headerField 0144 return 0 0145 } 0146 } 0147 0148 func onResponseHeaderValue
ResponseParser.swift:53 settings.on_header_field = onResponseHeaderField(parser: Parser, data: UnsafePointer<Int8>, length: Int) -> Int32 { 0149 return ResponseContext(parser.memory.data).withMemory { 0150 if $0.buildingHeaderField != "" { 0151 $0.currentHeaderField = $0.buildingHeaderField 0152 } 0153 0154 $0.buildingHeaderField = "" 0155 let headerField = $0.currentHeaderField 0156 0157 guard let headerValue = String(pointer: data, length: length) else { 0158 return 1 0159 } 0160 0161 if headerField == "Set-Cookie" { 0162 $0.buildingCookieValue += headerValue 0163 } else { 0164 let headerName = HeaderName(headerField) 0165 let previousHeaderValue = $0.headers[headerName] ?? "" 0166 $0.headers[headerName] = previousHeaderValue + headerValue 0167 } 0168 0169 return 0 0170 } 0171 } 0172 0173 func onResponseHeadersComplete
ResponseParser.swift:54 settings.on_header_value = onResponseHeaderValue(parser: Parser) -> Int32 { 0174 return ResponseContext(parser.memory.data).withMemory { 0175 if $0.buildingCookieValue != "" { 0176 if let cookie = try? Cookie.parseSetCookie($0.buildingCookieValue) { 0177 $0.cookies.insert(cookie) 0178 } 0179 } 0180 0181 $0.buildingCookieValue = "" 0182 $0.buildingHeaderField = "" 0183 $0.currentHeaderField = "" 0184 $0.statusCode = Int(parser.memory.status_code) 0185 $0.version = (Int(parser.memory.http_major), Int(parser.memory.http_minor)) 0186 return 0 0187 } 0188 } 0189 0190 func onResponseBody
ResponseParser.swift:55 settings.on_headers_complete = onResponseHeadersComplete(parser: Parser, data: UnsafePointer<Int8>, length: Int) -> Int32 { 0191 return ResponseContext(parser.memory.data).withMemory { 0192 $0.body += Data(pointer: data, length: length) 0193 return 0 0194 } 0195 } 0196 0197 func onResponseMessageComplete
ResponseParser.swift:56 settings.on_body = onResponseBody(parser: Parser) -> Int32 { 0198 return ResponseContext(parser.memory.data).withMemory { 0199 let response = Response( 0200 status: Status(statusCode: $0.statusCode, reasonPhrase: $0.reasonPhrase), 0201 version: $0.version, 0202 headers: $0.headers, 0203 cookies: $0.cookies, 0204 body: .Buffer($0.body), 0205 upgrade: nil 0206 ) 0207 0208 $0.completion(response) 0209 0210 $0.statusCode = 0 0211 $0.reasonPhrase = "" 0212 $0.version = (0, 0) 0213 $0.headers = [:] 0214 $0.cookies = [] 0215 $0.body = [] 0216 return 0 0217 } 0218 } 0219
ResponseParser.swift:57 settings.on_message_complete = onResponseMessageComplete