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
Reader.swift:64
            throw ReaderError.GenericError(error: errno)
: ErrorType { 0032 case GenericError
Reader.swift:64
            throw ReaderError.GenericError(error: errno)
(error: Int32) 0033 } 0034 0035 protocol Reader
HTTPRequestParser.swift:33
    func parse<R: Reader where R.Entry == Int8>(reader: R) throws -> HTTPRequest
HTTPRequestParser.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 {
{ 0036 0037 typealias Entry
HTTPRequestParser.swift:33
    func parse<R: Reader where R.Entry == Int8>(reader: R) throws -> HTTPRequest
HTTPRequestParser.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]
0038 0039 func read() throws -> Entry? 0040 0041 func read
Reader.swift:145
            let chunk = try reader.read(batch)
(maxLength: Int) throws -> [Entry] 0042 0043 } 0044 0045 class SocketReader
HTTPServer.swift:73
            let reader = SocketReader(socket: Socket(raw: client))
: Reader { 0046 0047 typealias Entry = Int8 0048 0049 let socket
Reader.swift:52
        self.socket = socket
Reader.swift:62
        let size = recv(socket.raw, buffer, maxLength, 0)
: Socket 0050 0051 init
HTTPServer.swift:73
            let reader = SocketReader(socket: Socket(raw: client))
(socket: Socket) { 0052 self.socket = socket 0053 } 0054 0055 func read() throws -> Int8? { 0056 return try read(1).first 0057 } 0058 0059 func read
Reader.swift:56
        return try read(1).first
(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:83
        self.buffer = buffer
Reader.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])
: [Int8] 0081 0082 init(buffer: [Int8]) { 0083 self.buffer = buffer 0084 } 0085 0086 func read
Reader.swift:97
            if let byte = try self.read() {
() 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:125
            if buffer[i] == LF {
= Int8(10) 0107 0108 class BufferedReader
HTTPRequestParser.swift:49
        let bufferedReader = BufferedReader(reader: reader)
<R
Reader.swift:112
    let reader: R
Reader.swift:114
    init(reader: R) {
: Reader where R.Entry == Int8>: Reader { 0109 0110 typealias Entry = [Int8] 0111 0112 let reader
Reader.swift:115
        self.reader = reader
Reader.swift:145
            let chunk = try reader.read(batch)
: R 0113 0114 init
HTTPRequestParser.swift:49
        let bufferedReader = BufferedReader(reader: reader)
(reader: R) { 0115 self.reader = reader 0116 } 0117 0118 var buffer
Reader.swift:123
        let size = buffer.count
Reader.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 = buffer
Reader.swift:159
            buffer.removeAll()
= [Int8]() 0119 0120 var reading
Reader.swift:144
        while reading {
Reader.swift:147
                reading = false
Reader.swift:150
                reading = false
= true 0121 0122 func flush
Reader.swift:140
        if let line = flush() {
Reader.swift:153
            if let line = flush() {
() -> [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
HTTPRequestParser.swift:58
        while let line = try bufferedReader.read() {
Reader.swift:168
            if let line = try read() {
() 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