0001    //
0002    //  HttpParser.swift
0003    //  Swifter
0004    // 
0005    //  Copyright (c) 2014-2016 Damian KoĊ‚akowski. All rights reserved.
0006    //
0007    
0008    #if os(Linux)
0009        import Glibc
0010    #else
0011        import Foundation
0012    #endif
0013    
0014    enum HttpParserError
HttpParser.swift:26
            throw HttpParserError.InvalidStatusLine(statusLine)
: ErrorType { 0015 case InvalidStatusLine
HttpParser.swift:26
            throw HttpParserError.InvalidStatusLine(statusLine)
(String) 0016 } 0017 0018 public class HttpParser
HttpServerIO.swift:56
        let parser = HttpParser()
{ 0019 0020 public init
HttpServerIO.swift:56
        let parser = HttpParser()
() { } 0021 0022 public func readHttpRequest
HttpServerIO.swift:57
        while let request = try? parser.readHttpRequest(socket) {
(socket: Socket) throws -> HttpRequest { 0023 let statusLine = try socket.readLine() 0024 let statusLineTokens = statusLine.split(" ") 0025 if statusLineTokens.count < 3 { 0026 throw HttpParserError.InvalidStatusLine(statusLine) 0027 } 0028 let request = HttpRequest() 0029 request.method = statusLineTokens[0] 0030 request.path = statusLineTokens[1] 0031 request.queryParams = extractQueryParams(request.path) 0032 request.headers = try readHeaders(socket) 0033 if let contentLength = request.headers["content-length"], let contentLengthValue = Int(contentLength) { 0034 request.body = try readBody(socket, size: contentLengthValue) 0035 } 0036 return request 0037 } 0038 0039 private func extractQueryParams
HttpParser.swift:31
        request.queryParams = extractQueryParams(request.path)
(url: String) -> [(String, String)] { 0040 guard let query = url.split("?").last else { 0041 return [] 0042 } 0043 return query.split("&").reduce([(String, String)]()) { (c, s) -> [(String, String)] in 0044 let tokens = s.split(1, separator: "=") 0045 if let name = tokens.first, value = tokens.last { 0046 return c + [(name.removePercentEncoding(), value.removePercentEncoding())] 0047 } 0048 return c 0049 } 0050 } 0051 0052 private func readBody
HttpParser.swift:34
            request.body = try readBody(socket, size: contentLengthValue)
(socket: Socket, size: Int) throws -> [UInt8] { 0053 var body = [UInt8]() 0054 for _ in 0..<size { body.append(try socket.read()) } 0055 return body 0056 } 0057 0058 private func readHeaders
HttpParser.swift:32
        request.headers = try readHeaders(socket)
(socket: Socket) throws -> [String: String] { 0059 var headers = [String: String]() 0060 repeat { 0061 let headerLine = try socket.readLine() 0062 if headerLine.isEmpty { 0063 return headers 0064 } 0065 let headerTokens = headerLine.split(1, separator: ":") 0066 if let name = headerTokens.first, value = headerTokens.last { 0067 headers[name.lowercaseString] = value.trim() 0068 } 0069 } while true 0070 } 0071 0072 func supportsKeepAlive
HttpServerIO.swift:63
            var keepConnection = parser.supportsKeepAlive(request.headers)
(headers: [String: String]) -> Bool { 0073 if let value = headers["connection"] { 0074 return "keep-alive" == value.trim() 0075 } 0076 return false 0077 } 0078 } 0079