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: ErrorType { 0015 case InvalidStatusLine
HttpParser.swift:26 throw HttpParserError.InvalidStatusLine(statusLine)(String) 0016 } 0017 0018 public class HttpParser
HttpParser.swift:26 throw HttpParserError.InvalidStatusLine(statusLine){ 0019 0020 public init
HttpServerIO.swift:56 let parser = HttpParser()() { } 0021 0022 public func readHttpRequest
HttpServerIO.swift:56 let parser = HttpParser()(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
HttpServerIO.swift:57 while let request = try? parser.readHttpRequest(socket) {(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:31 request.queryParams = extractQueryParams(request.path)(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:34 request.body = try readBody(socket, size: contentLengthValue)(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
HttpParser.swift:32 request.headers = try readHeaders(socket)(headers: [String: String]) -> Bool { 0073 if let value = headers["connection"] { 0074 return "keep-alive" == value.trim() 0075 } 0076 return false 0077 } 0078 } 0079
HttpServerIO.swift:63 var keepConnection = parser.supportsKeepAlive(request.headers)