0001    //
0002    // Based on HttpParser from Swifter (https://github.com/glock45/swifter) by Damian KoĊ‚akowski.
0003    //
0004    
0005    #if os(Linux)
0006        import Glibc
0007    #endif
0008    
0009    import Foundation
0010    
0011    class SocketParser
SocketServer.swift:97
        let parser = SocketParser()
{ 0012 0013 enum Error
SocketParser.swift:31
                throw Error.InvalidRequest
: ErrorType { 0014 case InvalidRequest
SocketParser.swift:31
                throw Error.InvalidRequest
0015 } 0016 0017 class RequestLine
SocketParser.swift:41
        let requestLine = try RequestLine(string: socket.readLine())
{ 0018 let method
SocketParser.swift:27
                self.method = .Unknown
SocketParser.swift:34
            self.method = Request.Method(rawValue: requestLineWords[0]) ?? .Unknown
SocketParser.swift:60
        return Request(method: requestLine.method, path: requestLine.path, address: address, headers: headers, body: body)
: Request.Method 0019 let path
SocketParser.swift:28
                self.path = ""
SocketParser.swift:35
            self.path = requestLineWords[1]
SocketParser.swift:60
        return Request(method: requestLine.method, path: requestLine.path, address: address, headers: headers, body: body)
: String 0020 let version
SocketParser.swift:29
                self.version = ""
SocketParser.swift:36
            self.version = requestLineWords[2]
: String 0021 0022 init
SocketParser.swift:41
        let requestLine = try RequestLine(string: socket.readLine())
(string: String) throws { 0023 let requestLineWords = string.split(" ") 0024 0025 //requestLine should be 3 words, like `GET /index.html HTTP/1.1` 0026 if requestLineWords.count < 3 { 0027 self.method = .Unknown 0028 self.path = "" 0029 self.version = "" 0030 0031 throw Error.InvalidRequest 0032 } 0033 0034 self.method = Request.Method(rawValue: requestLineWords[0]) ?? .Unknown 0035 self.path = requestLineWords[1] 0036 self.version = requestLineWords[2] 0037 } 0038 } 0039 0040 func readHttpRequest
SocketServer.swift:99
        while let request = try? parser.readHttpRequest(socket) {
(socket: Socket) throws -> Request { 0041 let requestLine = try RequestLine(string: socket.readLine()) 0042 0043 //var data = self.extractQueryParams(path) 0044 let headers = try self.readHeaders(socket) 0045 0046 //try to get the ip address of the incoming request (like 127.0.0.1) 0047 let address = try? socket.peername() 0048 0049 0050 0051 var body: [UInt8] = [] 0052 if 0053 let contentLength = headers["content-length"], 0054 let contentLengthValue = Int(contentLength) { 0055 0056 body = try readBody(socket, size: contentLengthValue) 0057 } 0058 0059 0060 return Request(method: requestLine.method, path: requestLine.path, address: address, headers: headers, body: body) 0061 } 0062 0063 /** 0064 Reads the `Socket` until the desired 0065 size is reached. 0066 */ 0067 private func readBody
SocketParser.swift:56
            body = try readBody(socket, size: contentLengthValue)
(socket: Socket, size: Int) throws -> [UInt8] { 0068 var body = [UInt8]() 0069 var counter = 0 0070 0071 while counter < size { 0072 body.append(try socket.read()) 0073 counter += 1 0074 } 0075 return body 0076 } 0077 0078 /** 0079 Reads the `Socket` line by line extracting 0080 header pairs until an empty line is reached. 0081 */ 0082 private func readHeaders
SocketParser.swift:44
        let headers = try self.readHeaders(socket)
(socket: Socket) throws -> [String: String] { 0083 var requestHeaders = [String: String]() 0084 0085 while true { 0086 let headerLine = try socket.readLine() 0087 if headerLine.isEmpty { 0088 return requestHeaders 0089 } 0090 0091 let headerTokens = headerLine.split(1, separator: ":") 0092 if let name = headerTokens.first, value = headerTokens.last { 0093 requestHeaders[name.lowercaseString] = value.trim() 0094 } 0095 } 0096 } 0097 0098 0099 } 0100