Damian Kołakowski 10 роки тому
батько
коміт
a2f6583a33

+ 6 - 4
Sources/DemoServer.swift

@@ -8,6 +8,7 @@
 import Foundation
 
 public func demoServer(publicDir: String?) -> HttpServer {
+    
     let server = HttpServer()
     
     if let publicDir = publicDir {
@@ -104,6 +105,7 @@ public func demoServer(publicDir: String?) -> HttpServer {
     server["/wildcard/*/test/*/:param"] = { r in
         return .OK(.Html(r.path))
     }
+    
     server["/stream"] = { r in
         return HttpResponse.RAW(200, "OK", nil, { w in
             for i in 0...100 {
@@ -112,10 +114,10 @@ public func demoServer(publicDir: String?) -> HttpServer {
         })
     }
     
-    server["/websocket"] = HttpHandlers.websocket({ text in
-        print("Text message: \(text)")
-    }, { binary in
-        print("Binary message: \(binary)")
+    server["/websocket-echo"] = HttpHandlers.websocket({ (session, text) in
+        session.writeText(text)
+    }, { (session, binary) in
+        session.writeBinary(binary)
     })
     
     return server

+ 26 - 24
Sources/HttpHandlers+Files.swift

@@ -73,33 +73,35 @@ extension HttpHandlers {
         }
     }
     
-    public class func directoryBrowser(dir: String) -> ( HttpRequest -> HttpResponse ) {
+    public class func directoryBrowser(dir: String) -> (HttpRequest -> HttpResponse) {
         return { r in
-            if let (_, value) = r.params.first {
-                let filePath = dir + "/" + value
-                let fileManager = NSFileManager.defaultManager()
-                var isDir: ObjCBool = false
-                if fileManager.fileExistsAtPath(filePath, isDirectory: &isDir) {
-                    if isDir {
-                        do {
-                            let files = try fileManager.contentsOfDirectoryAtPath(filePath)
-                            var response = "<h3>\(filePath)</h3></br><table>"
-                            response += files.map({ "<tr><td><a href=\"\(r.path)/\($0)\">\($0)</a></td></tr>"}).joinWithSeparator("")
-                            response += "</table>"
-                            return HttpResponse.OK(.Html(response))
-                        } catch {
-                            return HttpResponse.NotFound
-                        }
-                    } else {
-                        if let fileBody = NSData(contentsOfFile: filePath) {
-                            var array = [UInt8](count: fileBody.length, repeatedValue: 0)
-                            fileBody.getBytes(&array, length: fileBody.length)
-                            return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
-                        }
-                    }
+            guard let (_, value) = r.params.first else {
+                return HttpResponse.NotFound
+            }
+            let filePath = dir + "/" + value
+            let fileManager = NSFileManager.defaultManager()
+            var isDir: ObjCBool = false
+            guard fileManager.fileExistsAtPath(filePath, isDirectory: &isDir) else {
+                return HttpResponse.NotFound
+            }
+            if isDir {
+                do {
+                    let files = try fileManager.contentsOfDirectoryAtPath(filePath)
+                    var response = "<h3>\(filePath)</h3></br><table>"
+                    response += files.map({ "<tr><td><a href=\"\(r.path)/\($0)\">\($0)</a></td></tr>"}).joinWithSeparator("")
+                    response += "</table>"
+                    return HttpResponse.OK(.Html(response))
+                } catch {
+                    return HttpResponse.NotFound
                 }
+            } else {
+                if let content = NSData(contentsOfFile: filePath) {
+                    var array = [UInt8](count: content.length, repeatedValue: 0)
+                    content.getBytes(&array, length: content.length)
+                    return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
+                }
+                return HttpResponse.NotFound
             }
-            return HttpResponse.NotFound
         }
     }
 }

+ 40 - 42
Sources/HttpHandlers+WebSockets.swift

@@ -9,7 +9,8 @@ import Foundation
 
 extension HttpHandlers {
     
-    public class func websocket(text:(String -> Void)?, _ binary:([UInt8] -> Void)?) -> (HttpRequest -> HttpResponse) {
+    public class func websocket(text:((WebSocketSession, String) -> Void)?, _ binary:
+        ((WebSocketSession, [UInt8]) -> Void)?) -> (HttpRequest -> HttpResponse) {
         return { r in
             guard r.headers["upgrade"] == "websocket" else {
                 return .BadRequest(.Text("Invalid value of 'Upgrade' header: \(r.headers["upgrade"])"))
@@ -26,11 +27,11 @@ extension HttpHandlers {
                     switch frame.opcode {
                     case .TEXT:
                         if let handleText = text {
-                            handleText(String.fromUInt8(frame.payload))
+                            handleText(session, String.fromUInt8(frame.payload))
                         }
                     case .BINARY:
                         if let handleBinary = binary {
-                            handleBinary(frame.payload)
+                            handleBinary(session, frame.payload)
                         }
                     default: break
                     }
@@ -61,63 +62,60 @@ extension HttpHandlers {
         }
         
         public func writeText(text: String) -> Void {
-            let finAndOpCode = encodeFinAndOpCode(true, op: OpCode.TEXT)
-            let maskAndLngth = encodeLengthAndMaskFlag(UInt64(text.utf8.count), false)
-            do {
-                try socket.writeUInt8([finAndOpCode])
-                try socket.writeUInt8(maskAndLngth)
-                try socket.writeUInt8([UInt8](text.utf8))
-            } catch {
-                print(error)
-            }
+            self.writeFrame([UInt8](text.utf8), OpCode.TEXT)
         }
     
         public func writeBinary(binary: [UInt8]) -> Void {
-            let finAndOpCode = encodeFinAndOpCode(true, op: OpCode.BINARY)
-            let maskAndLngth = encodeLengthAndMaskFlag(UInt64(binary.count), false)
+            self.writeFrame(binary, OpCode.BINARY)
+        }
+        
+        private func writeFrame(data: [UInt8], _ op: OpCode, _ fin: Bool = true) {
+            let finAndOpCode = encodeFinAndOpCode(fin, op: op)
+            let maskAndLngth = encodeLengthAndMaskFlag(UInt64(data.count), false)
             do {
                 try self.socket.writeUInt8([finAndOpCode])
                 try self.socket.writeUInt8(maskAndLngth)
-                try self.socket.writeUInt8(binary)
+                try self.socket.writeUInt8(data)
             } catch {
                 print(error)
             }
         }
         
         private func encodeFinAndOpCode(fin: Bool, op: OpCode) -> UInt8 {
-            var b = UInt8(fin ? 0x80 : 0x00);
+            var encodedByte = UInt8(fin ? 0x80 : 0x00);
             switch op {
-            case .CONTINUE : b |= 0x00 & 0x0F;
-            case .TEXT     : b |= 0x01 & 0x0F;
-            case .BINARY   : b |= 0x02 & 0x0F;
-            case .CLOSE    : b |= 0x08 & 0x0F;
-            case .PING     : b |= 0x09 & 0x0F;
-            case .PONG     : b |= 0x0A & 0x0F;
+            case .CONTINUE : encodedByte |= 0x00 & 0x0F;
+            case .TEXT     : encodedByte |= 0x01 & 0x0F;
+            case .BINARY   : encodedByte |= 0x02 & 0x0F;
+            case .CLOSE    : encodedByte |= 0x08 & 0x0F;
+            case .PING     : encodedByte |= 0x09 & 0x0F;
+            case .PONG     : encodedByte |= 0x0A & 0x0F;
             }
-            return b
+            return encodedByte
         }
         
         private func encodeLengthAndMaskFlag(len: UInt64, _ masked: Bool) -> [UInt8] {
-            let b: UInt8 = masked ? 0x80 : 0x00;
-            var buffer = [UInt8]()
-            if (len > 0xFF_FF) {
-                buffer.append(b | 0x7F);
-                buffer.append(UInt8(len >> 56) & 0xFF);
-                buffer.append(UInt8(len >> 48) & 0xFF);
-                buffer.append(UInt8(len >> 40) & 0xFF);
-                buffer.append(UInt8(len >> 32) & 0xFF);
-                buffer.append(UInt8(len >> 24) & 0xFF);
-                buffer.append(UInt8(len >> 16) & 0xFF);
-                buffer.append(UInt8(len >> 8 ) & 0xFF);
-                buffer.append(UInt8(len & 0xFF));
-            } else if (len >= 0x7E) {
-                buffer.append(b | 0x7E);
-                buffer.append(UInt8(len >> 8));
-                buffer.append(UInt8(len & 0xFF));
-            } else {
-                buffer.append(b | UInt8(len));
+            let encodedLngth = UInt8(masked ? 0x80 : 0x00)
+            var encodedBytes = [UInt8]()
+            switch len {
+            case 0...0x7D:
+                encodedBytes.append(encodedLngth | UInt8(len));
+            case 0x7E...0xFF_FF:
+                encodedBytes.append(encodedLngth | 0x7E);
+                encodedBytes.append(UInt8(len >> 8));
+                encodedBytes.append(UInt8(len & 0xFF));
+            default:
+                encodedBytes.append(encodedLngth | 0x7F);
+                encodedBytes.append(UInt8(len >> 56) & 0xFF);
+                encodedBytes.append(UInt8(len >> 48) & 0xFF);
+                encodedBytes.append(UInt8(len >> 40) & 0xFF);
+                encodedBytes.append(UInt8(len >> 32) & 0xFF);
+                encodedBytes.append(UInt8(len >> 24) & 0xFF);
+                encodedBytes.append(UInt8(len >> 16) & 0xFF);
+                encodedBytes.append(UInt8(len >> 8 ) & 0xFF);
+                encodedBytes.append(UInt8(len & 0xFF));
             }
-            return buffer
+            return encodedBytes
         }
         
         public func readFrame(socket: Socket) throws -> Frame {

+ 4 - 8
Sources/HttpParser.swift

@@ -49,24 +49,20 @@ class HttpParser {
     
     private func readBody(socket: Socket, size: Int) throws -> [UInt8] {
         var body = [UInt8]()
-        var counter = 0
-        while counter < size {
-            body.append(try socket.read())
-            counter += 1
-        }
+        for _ in 1...size { body.append(try socket.read()) }
         return body
     }
     
     private func readHeaders(socket: Socket) throws -> [String: String] {
-        var requestHeaders = [String: String]()
+        var headers = [String: String]()
         repeat {
             let headerLine = try socket.readLine()
             if headerLine.isEmpty {
-                return requestHeaders
+                return headers
             }
             let headerTokens = headerLine.split(1, separator: ":")
             if let name = headerTokens.first, value = headerTokens.last {
-                requestHeaders[name.lowercaseString] = value.trim()
+                headers[name.lowercaseString] = value.trim()
             }
         } while true
     }

+ 8 - 8
Sources/HttpRequest.swift

@@ -25,7 +25,7 @@ public class HttpRequest {
         guard let contentType = contentTypeHeaderTokens.first where contentType == "application/x-www-form-urlencoded" else {
             return []
         }
-        return String.fromUInt8(body).split("&").map { (param: String) -> (String, String) in
+        return String.fromUInt8(body).split("&").map { param -> (String, String) in
             let tokens = param.split("=")
             if let name = tokens.first, value = tokens.last where tokens.count == 2 {
                 return (name.replace("+", new: " ").removePercentEncoding(),
@@ -41,22 +41,22 @@ public class HttpRequest {
         public let body: [UInt8]
         
         public var name: String? {
-            return valueFor("content-disposition", parameterName: "name")?.unquote()
+            return valueFor("content-disposition", parameter: "name")?.unquote()
         }
         
         public var fileName: String? {
-            return valueFor("content-disposition", parameterName: "filename")?.unquote()
+            return valueFor("content-disposition", parameter: "filename")?.unquote()
         }
         
-        private func valueFor(headerName: String, parameterName: String) -> String? {
-            return headers.reduce([String]()) { (currentResults: [String], header: (key: String, value: String)) -> [String] in
+        private func valueFor(headerName: String, parameter: String) -> String? {
+            return headers.reduce([String]()) { (combined, header: (key: String, value: String)) -> [String] in
                 guard header.key == headerName else {
-                    return currentResults
+                    return combined
                 }
                 let headerValueParams = header.value.split(";").map { $0.trim() }
-                return headerValueParams.reduce(currentResults, combine: { (results:[String], token: String) -> [String] in
+                return headerValueParams.reduce(combined, combine: { (results, token) -> [String] in
                     let parameterTokens = token.split(1, separator: "=")
-                    if parameterTokens.first == parameterName, let value = parameterTokens.last {
+                    if parameterTokens.first == parameter, let value = parameterTokens.last {
                         return results + [value]
                     }
                     return results

+ 2 - 2
Sources/HttpResponse.swift

@@ -23,7 +23,7 @@ public enum HttpResponseBody {
     case Text(String)
     case Custom(Any, (Any) throws -> String)
     
-    func content() -> (Int, ((HttpResponseBodyWriter) throws -> Void)?) {
+    func content() -> (Int, (HttpResponseBodyWriter throws -> Void)?) {
         do {
             switch self {
             case .Json(let object):
@@ -129,7 +129,7 @@ public enum HttpResponse {
         return headers
     }
     
-    func content() -> (length: Int, writeClosure: ((HttpResponseBodyWriter) throws -> Void)?) {
+    func content() -> (length: Int, write: (HttpResponseBodyWriter throws -> Void)?) {
         switch self {
         case .OK(let body)             : return body.content()
         case .BadRequest(let body)     : return body?.content() ?? (-1, nil)

+ 1 - 1
Sources/HttpRouter.swift

@@ -26,7 +26,7 @@ public class HttpRouter {
     
     private func routesForNode(node: Node, prefix: String = "") -> [String] {
         var result = [String]()
-        if node.handler != nil {
+        if let _ = node.handler {
             result.append(prefix)
         }
         for (key, child) in node.nodes {

+ 16 - 16
Sources/HttpServerIO.swift

@@ -37,7 +37,21 @@ public class HttpServerIO {
         }
     }
     
-    public func handleConnection(socket: Socket) {
+    public func stop() {
+        listenSocket.release()
+        lock(self.clientSocketsLock) {
+            for socket in self.clientSockets {
+                socket.shutdwn()
+            }
+            self.clientSockets.removeAll(keepCapacity: true)
+        }
+    }
+    
+    public func dispatch(method: String, path: String) -> ([String: String], HttpRequest -> HttpResponse) {
+        return ([:], { _ in HttpResponse.NotFound })
+    }
+    
+    private func handleConnection(socket: Socket) {
         let address = try? socket.peername()
         let parser = HttpParser()
         while let request = try? parser.readHttpRequest(socket) {
@@ -62,20 +76,6 @@ public class HttpServerIO {
         socket.release()
     }
     
-    public func dispatch(method: String, path: String) -> ([String: String], HttpRequest -> HttpResponse) {
-        return ([:], { _ in HttpResponse.NotFound })
-    }
-    
-    public func stop() {
-        listenSocket.release()
-        lock(self.clientSocketsLock) {
-            for socket in self.clientSockets {
-                socket.shutdwn()
-            }
-            self.clientSockets.removeAll(keepCapacity: true)
-        }
-    }
-    
     private func lock(handle: NSLock, closure: () -> ()) {
         handle.lock()
         closure()
@@ -112,7 +112,7 @@ public class HttpServerIO {
         
         try socket.writeUTF8("\r\n")
     
-        if let writeClosure = content.writeClosure {
+        if let writeClosure = content.write {
             let context = InnerWriteContext(socket: socket)
             try writeClosure(context)
         }

+ 1 - 1
Sources/String+SHA1.swift

@@ -37,7 +37,7 @@ extension String {
         
         let padBytesCount = ( message.count + 8 ) % 64
         
-        for _ in padBytesCount...63 { message.append(0x00) }
+        message.appendContentsOf([UInt8](count: 64 - padBytesCount, repeatedValue: 0))
         
         // append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.
         

BIN
Swifter.xcodeproj/project.xcworkspace/xcuserdata/damiankolakowski.xcuserdatad/UserInterfaceState.xcuserstate


+ 52 - 68
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -1477,11 +1477,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/DemoServer.swift"
-            timestampString = "475011147.040336"
+            timestampString = "475884681.54644"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "20"
-            endingLineNumber = "20"
+            startingLineNumber = "21"
+            endingLineNumber = "21"
             landmarkName = "demoServer(_:)"
             landmarkType = "7">
          </BreakpointContent>
@@ -1509,11 +1509,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/DemoServer.swift"
-            timestampString = "475011147.040336"
+            timestampString = "475884681.54644"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "59"
-            endingLineNumber = "59"
+            startingLineNumber = "60"
+            endingLineNumber = "60"
             landmarkName = "demoServer(_:)"
             landmarkType = "7">
          </BreakpointContent>
@@ -1530,7 +1530,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "52"
             endingLineNumber = "52"
-            landmarkName = "valueFor(_:parameterName:)"
+            landmarkName = "valueFor(_:parameter:)"
             landmarkType = "5">
             <Locations>
                <Location
@@ -1578,7 +1578,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "53"
             endingLineNumber = "53"
-            landmarkName = "valueFor(_:parameterName:)"
+            landmarkName = "valueFor(_:parameter:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -1605,11 +1605,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/DemoServer.swift"
-            timestampString = "475011147.040336"
+            timestampString = "475884681.54644"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "62"
-            endingLineNumber = "62"
+            startingLineNumber = "63"
+            endingLineNumber = "63"
             landmarkName = "demoServer(_:)"
             landmarkType = "7">
          </BreakpointContent>
@@ -1653,11 +1653,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "SwifterSampleOSX/main.swift"
-            timestampString = "475797519.716601"
+            timestampString = "475884681.54644"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "20"
-            endingLineNumber = "20">
+            startingLineNumber = "21"
+            endingLineNumber = "21">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -1699,11 +1699,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475876251.893112"
+            timestampString = "475885394.646408"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "157"
-            endingLineNumber = "157"
+            startingLineNumber = "155"
+            endingLineNumber = "155"
             landmarkName = "readFrame(_:)"
             landmarkType = "5">
             <Locations>
@@ -1747,13 +1747,13 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475876251.893112"
+            timestampString = "475885394.646408"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "163"
-            endingLineNumber = "163"
-            landmarkName = "HttpHandlers"
-            landmarkType = "3">
+            startingLineNumber = "161"
+            endingLineNumber = "161"
+            landmarkName = "readFrame(_:)"
+            landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -1763,11 +1763,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475876251.893112"
+            timestampString = "475885394.646408"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "156"
-            endingLineNumber = "156"
+            startingLineNumber = "154"
+            endingLineNumber = "154"
             landmarkName = "readFrame(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1779,11 +1779,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpParser.swift"
-            timestampString = "475104488.303962"
+            timestampString = "475883824.405509"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "61"
-            endingLineNumber = "61"
+            startingLineNumber = "57"
+            endingLineNumber = "57"
             landmarkName = "readHeaders(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1795,11 +1795,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpParser.swift"
-            timestampString = "475104968.40441"
+            timestampString = "475883824.405509"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "70"
-            endingLineNumber = "70"
+            startingLineNumber = "66"
+            endingLineNumber = "66"
             landmarkName = "readHeaders(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1859,11 +1859,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpParser.swift"
-            timestampString = "475105024.903632"
+            timestampString = "475883824.405509"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "65"
-            endingLineNumber = "65"
+            startingLineNumber = "61"
+            endingLineNumber = "61"
             landmarkName = "readHeaders(_:)"
             landmarkType = "5">
             <Locations>
@@ -1907,11 +1907,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpParser.swift"
-            timestampString = "475105132.910273"
+            timestampString = "475883824.405509"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "67"
-            endingLineNumber = "67"
+            startingLineNumber = "63"
+            endingLineNumber = "63"
             landmarkName = "readHeaders(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1923,11 +1923,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpParser.swift"
-            timestampString = "475105140.110048"
+            timestampString = "475883824.405509"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "60"
-            endingLineNumber = "60"
+            startingLineNumber = "56"
+            endingLineNumber = "56"
             landmarkName = "readHeaders(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1939,11 +1939,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475876251.893112"
+            timestampString = "475885394.646408"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "155"
-            endingLineNumber = "155"
+            startingLineNumber = "153"
+            endingLineNumber = "153"
             landmarkName = "readFrame(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -2193,11 +2193,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "SwifterSampleOSX/main.swift"
-            timestampString = "475797519.716601"
+            timestampString = "475884681.54644"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "13"
-            endingLineNumber = "13">
+            startingLineNumber = "14"
+            endingLineNumber = "14">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -2335,11 +2335,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475797167.424719"
+            timestampString = "475882441.345667"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "13"
-            endingLineNumber = "13"
+            startingLineNumber = "14"
+            endingLineNumber = "14"
             landmarkName = "websocket(_:_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -2351,30 +2351,14 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpServerIO.swift"
-            timestampString = "475787353.967887"
+            timestampString = "475883224.041257"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "49"
-            endingLineNumber = "49"
+            startingLineNumber = "63"
+            endingLineNumber = "63"
             landmarkName = "handleConnection(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            shouldBeEnabled = "No"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "Sources/HttpHandlers+WebSockets.swift"
-            timestampString = "475876297.816839"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "66"
-            endingLineNumber = "66"
-            landmarkName = "writeText(_:)"
-            landmarkType = "5">
-         </BreakpointContent>
-      </BreakpointProxy>
    </Breakpoints>
 </Bucket>

+ 1 - 0
SwifterSampleOSX/main.swift

@@ -7,6 +7,7 @@
 import Foundation
 import Swifter
 
+
 let server = demoServer(NSBundle.mainBundle().resourcePath!)
 
 do {