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
ResponseParser.swift:63
    let context: ResponseContext
ResponseParser.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 {
= UnsafeMutablePointer<ResponseParserContext> 0029 0030 struct ResponseParserContext
ResponseParser.swift:28
typealias ResponseContext = UnsafeMutablePointer<ResponseParserContext>
ResponseParser.swift:69
        context.initialize(ResponseParserContext { response in
{ 0031 var statusCode
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
: Int = 0 0032 var reasonPhrase
ResponseParser.swift:200
            status: Status(statusCode: $0.statusCode, reasonPhrase: $0.reasonPhrase),
ResponseParser.swift:211
        $0.reasonPhrase = ""
: String = "" 0033 var version
ResponseParser.swift:185
        $0.version = (Int(parser.memory.http_major), Int(parser.memory.http_minor))
ResponseParser.swift:212
        $0.version = (0, 0)
: (major: Int, minor: Int) = (0, 0) 0034 var headers
ResponseParser.swift:165
            let previousHeaderValue = $0.headers[headerName] ?? ""
ResponseParser.swift:213
        $0.headers = [:]
: Headers = [:] 0035 var cookies
ResponseParser.swift:138
                $0.cookies.insert(cookie)
ResponseParser.swift:177
                $0.cookies.insert(cookie)
ResponseParser.swift:214
        $0.cookies = []
: Cookies = [] 0036 var body: Data = [] 0037 0038 var buildingCookieValue
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 = ""
= "" 0039 var buildingHeaderField
ResponseParser.swift:150
        if $0.buildingHeaderField != "" {
ResponseParser.swift:151
            $0.currentHeaderField = $0.buildingHeaderField
ResponseParser.swift:154
        $0.buildingHeaderField = ""
ResponseParser.swift:182
        $0.buildingHeaderField = ""
= "" 0040 var currentHeaderField
ResponseParser.swift:151
            $0.currentHeaderField = $0.buildingHeaderField
ResponseParser.swift:155
        let headerField = $0.currentHeaderField
ResponseParser.swift:183
        $0.currentHeaderField = ""
= "" 0041 var completion
ResponseParser.swift:44
        self.completion = completion
: Response -> Void 0042 0043 init
ResponseParser.swift:69
        context.initialize(ResponseParserContext { response in
(completion: Response -> Void) { 0044 self.completion = completion 0045 } 0046 } 0047 0048 var responseSettings
ResponseParser.swift:95
        let bytesParsed = http_parser_execute(&parser, &responseSettings, buffer, data.count)
: 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:113
extension ResponseParser {
: ResponseParserType { 0063 let context
ResponseParser.swift:68
        context = ResponseContext.alloc(1)
ResponseParser.swift:69
        context.initialize(ResponseParserContext { response in
ResponseParser.swift:77
        context.destroy()
ResponseParser.swift:78
        context.dealloc(1)
ResponseParser.swift:83
        parser.data = UnsafeMutablePointer<Void>(context)
: ResponseContext 0064 var parser
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))
= http_parser() 0065 var response
ResponseParser.swift:70
            self.response = response
ResponseParser.swift:87
        defer { response = nil }
ResponseParser.swift:105
        if response != nil {
: 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:73
        resetParser()
ResponseParser.swift:98
            resetParser()
ResponseParser.swift:106
            resetParser()
() { 0082 http_parser_init(&parser, HTTP_RESPONSE) 0083 parser.data = UnsafeMutablePointer<Void>(context) 0084 } 0085 0086 public func parse(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
ResponseParser.swift:86
    public func parse(data: Data) throws -> Response? {
(convertible: DataConvertible) throws -> Response? { 0115 return try parse(convertible.data) 0116 } 0117 } 0118 0119 func onResponseStatus
ResponseParser.swift:52
    settings.on_status           = onResponseStatus
(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:53
    settings.on_header_field     = onResponseHeaderField
(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:54
    settings.on_header_value     = onResponseHeaderValue
(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:55
    settings.on_headers_complete = onResponseHeadersComplete
(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:56
    settings.on_body             = onResponseBody
(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:57
    settings.on_message_complete = onResponseMessageComplete
(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