0001 /* 0002 The MIT License (MIT) 0003 0004 Copyright (c) 2015 Shun Takebayashi 0005 0006 Permission is hereby granted, free of charge, to any person obtaining a copy 0007 of this software and associated documentation files (the "Software"), to deal 0008 in the Software without restriction, including without limitation the rights 0009 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0010 copies of the Software, and to permit persons to whom the Software is 0011 furnished to do so, subject to the following conditions: 0012 0013 The above copyright notice and this permission notice shall be included in all 0014 copies or substantial portions of the Software. 0015 0016 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0017 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0018 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0019 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0020 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0021 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 0022 SOFTWARE. 0023 */ 0024 0025 #if os(OSX) 0026 import Darwin 0027 #elseif os(Linux) 0028 import Glibc 0029 #endif 0030 0031 enum ReaderError: ErrorType { 0032 case GenericError
Reader.swift:64 throw ReaderError.GenericError(error: errno)(error: Int32) 0033 } 0034 0035 protocol Reader
Reader.swift:64 throw ReaderError.GenericError(error: errno){ 0036 0037 typealias Entry
HTTPRequestParser.swift:33 func parse<R: Reader where R.Entry == Int8>(reader: R) throws -> HTTPRequestHTTPRequestParser.swift:48 func parse<R: Reader where R.Entry == Int8>(reader: R) throws -> HTTPRequest {Reader.swift:45 class SocketReader: Reader {Reader.swift:76 class BufferReader: Reader {Reader.swift:108 class BufferedReader<R: Reader where R.Entry == Int8>: Reader {0038 0039 func read() throws -> Entry? 0040 0041 func read
HTTPRequestParser.swift:33 func parse<R: Reader where R.Entry == Int8>(reader: R) throws -> HTTPRequestHTTPRequestParser.swift:48 func parse<R: Reader where R.Entry == Int8>(reader: R) throws -> HTTPRequest {Reader.swift:39 func read() throws -> Entry?Reader.swift:41 func read(maxLength: Int) throws -> [Entry](maxLength: Int) throws -> [Entry] 0042 0043 } 0044 0045 class SocketReader
Reader.swift:145 let chunk = try reader.read(batch): Reader { 0046 0047 typealias Entry = Int8 0048 0049 let socket
HTTPServer.swift:73 let reader = SocketReader(socket: Socket(raw: client)): Socket 0050 0051 init
Reader.swift:52 self.socket = socketReader.swift:62 let size = recv(socket.raw, buffer, maxLength, 0)(socket: Socket) { 0052 self.socket = socket 0053 } 0054 0055 func read() throws -> Int8? { 0056 return try read(1).first 0057 } 0058 0059 func read
HTTPServer.swift:73 let reader = SocketReader(socket: Socket(raw: client))(maxLength: Int) throws -> [Int8] { 0060 let buffer = UnsafeMutablePointer<Int8>.alloc(maxLength) 0061 memset(buffer, 0, maxLength) 0062 let size = recv(socket.raw, buffer, maxLength, 0) 0063 if size < 0 { 0064 throw ReaderError.GenericError(error: errno) 0065 } 0066 var bytes = [Int8]() 0067 for i in 0..<size { 0068 bytes.append(buffer[i]) 0069 } 0070 buffer.dealloc(maxLength) 0071 return bytes 0072 } 0073 0074 } 0075 0076 class BufferReader: Reader { 0077 0078 typealias Entry = Int8 0079 0080 var buffer
Reader.swift:56 return try read(1).first: [Int8] 0081 0082 init(buffer: [Int8]) { 0083 self.buffer = buffer 0084 } 0085 0086 func read
Reader.swift:83 self.buffer = bufferReader.swift:87 if let first = buffer.first {Reader.swift:88 buffer = [Int8](buffer[1..<buffer.endIndex])Reader.swift:88 buffer = [Int8](buffer[1..<buffer.endIndex])Reader.swift:88 buffer = [Int8](buffer[1..<buffer.endIndex])() throws -> Int8? { 0087 if let first = buffer.first { 0088 buffer = [Int8](buffer[1..<buffer.endIndex]) 0089 return first 0090 } 0091 return nil 0092 } 0093 0094 func read(maxLength: Int) throws -> [Int8] { 0095 var bytes = [Int8]() 0096 for _ in 0..<maxLength { 0097 if let byte = try self.read() { 0098 bytes.append(byte) 0099 } 0100 } 0101 return bytes 0102 } 0103 0104 } 0105 0106 let LF
Reader.swift:97 if let byte = try self.read() {= Int8(10) 0107 0108 class BufferedReader
Reader.swift:125 if buffer[i] == LF {<R
HTTPRequestParser.swift:49 let bufferedReader = BufferedReader(reader: reader): Reader where R.Entry == Int8>: Reader { 0109 0110 typealias Entry = [Int8] 0111 0112 let reader
Reader.swift:112 let reader: RReader.swift:114 init(reader: R) {: R 0113 0114 init
Reader.swift:115 self.reader = readerReader.swift:145 let chunk = try reader.read(batch)(reader: R) { 0115 self.reader = reader 0116 } 0117 0118 var buffer
HTTPRequestParser.swift:49 let bufferedReader = BufferedReader(reader: reader)= [Int8]() 0119 0120 var reading
Reader.swift:123 let size = buffer.countReader.swift:125 if buffer[i] == LF {Reader.swift:126 let line = [Int8](buffer[0...i])Reader.swift:128 buffer = []Reader.swift:131 buffer = [Int8](buffer[(i + 1)..<size])Reader.swift:131 buffer = [Int8](buffer[(i + 1)..<size])Reader.swift:152 buffer.appendContentsOf(chunk)Reader.swift:157 if buffer.count > 0 {Reader.swift:158 let line = bufferReader.swift:159 buffer.removeAll()= true 0121 0122 func flush
Reader.swift:144 while reading {Reader.swift:147 reading = falseReader.swift:150 reading = false() -> [Int8]? { 0123 let size = buffer.count 0124 for i in 0..<size { 0125 if buffer[i] == LF { 0126 let line = [Int8](buffer[0...i]) 0127 if i + 1 >= size { 0128 buffer = [] 0129 } 0130 else { 0131 buffer = [Int8](buffer[(i + 1)..<size]) 0132 } 0133 return line 0134 } 0135 } 0136 return nil 0137 } 0138 0139 func read
Reader.swift:140 if let line = flush() {Reader.swift:153 if let line = flush() {() throws -> [Int8]? { 0140 if let line = flush() { 0141 return line 0142 } 0143 let batch = 128 0144 while reading { 0145 let chunk = try reader.read(batch) 0146 if chunk.count == 0 { 0147 reading = false 0148 } 0149 else if chunk.count < batch { 0150 reading = false 0151 } 0152 buffer.appendContentsOf(chunk) 0153 if let line = flush() { 0154 return line 0155 } 0156 } 0157 if buffer.count > 0 { 0158 let line = buffer 0159 buffer.removeAll() 0160 return line 0161 } 0162 return nil 0163 } 0164 0165 func read(maxLength: Int) throws -> [[Int8]] { 0166 var lines = [[Int8]]() 0167 for _ in 0..<maxLength { 0168 if let line = try read() { 0169 lines.append(line) 0170 } 0171 else { 0172 break 0173 } 0174 } 0175 return lines 0176 } 0177 0178 } 0179
HTTPRequestParser.swift:58 while let line = try bufferedReader.read() {Reader.swift:168 if let line = try read() {