Преглед на файлове

Added support for PackageManager ( Sources dir, Package.swift ).
NSData replaced by [Uint8] ( linux ).
Removed usage of "String::dataUsingEncoding(...)" ( linux ).

Damian Kołakowski преди 10 години
родител
ревизия
3d194021c3

+ 5 - 0
Package.swift

@@ -0,0 +1,5 @@
+import PackageDescription
+
+let package = Package(
+    name: "Swifter"
+)

+ 4 - 2
Common/DemoServer.swift → Sources/Swifter/DemoServer.swift

@@ -61,7 +61,9 @@ public func demoServer(publicDir: String?) -> HttpServer {
             case "GET":
                 if let rootDir = publicDir {
                     if let html = NSData(contentsOfFile:"\(rootDir)/login.html") {
-                        return HttpResponse.RAW(200, "OK", nil, html)
+                        var array = [UInt8](count: html.length, repeatedValue: 0)
+                        html.getBytes(&array, length: html.length)
+                        return HttpResponse.RAW(200, "OK", nil, array)
                     } else {
                         return .NotFound
                     }
@@ -76,7 +78,7 @@ public func demoServer(publicDir: String?) -> HttpServer {
     }
     
     server["/raw"] = { request in
-        return HttpResponse.RAW(200, "OK", ["XXX-Custom-Header": "value"], "Sample Response".dataUsingEncoding(NSUTF8StringEncoding)!)
+        return HttpResponse.RAW(200, "OK", ["XXX-Custom-Header": "value"], [UInt8]("Sample Response".utf8))
     }
     
     server["/"] = { request in

+ 13 - 5
Common/HttpHandlers.swift → Sources/Swifter/HttpHandlers.swift

@@ -41,14 +41,16 @@ public class HttpHandlers {
                 let endStr = (rangeHeader as NSString).substringWithRange(match.rangeAtIndex(2))
                 
                 guard let start = Int(startStr), end = Int(endStr) else {
-                    return HttpResponse.RAW(200, "OK", nil, fileBody)
+                    var array = [UInt8](count: fileBody.length, repeatedValue: 0)
+                    fileBody.getBytes(&array, length: fileBody.length)
+                    return HttpResponse.RAW(200, "OK", nil, array)
                 }
                 
                 let length = end - start
                 let range = NSRange(location: start, length: length + 1)
                 
                 guard range.location + range.length <= fileBody.length else {
-                    return HttpResponse.RAW(416, "Requested range not satisfiable", nil, NSData())
+                    return HttpResponse.RAW(416, "Requested range not satisfiable", nil, nil)
                 }
                 
                 let subData = fileBody.subdataWithRange(range)
@@ -57,11 +59,15 @@ public class HttpHandlers {
                     "Content-Range" : "bytes \(startStr)-\(endStr)/\(fileBody.length)"
                 ]
                 
-                return HttpResponse.RAW(206, "Partial Content", headers, subData)
+                var array = [UInt8](count: subData.length, repeatedValue: 0)
+                subData.getBytes(&array, length: subData.length)
+                return HttpResponse.RAW(206, "Partial Content", headers, array)
                 
             }
             else {
-                return HttpResponse.RAW(200, "OK", nil, fileBody)
+                var array = [UInt8](count: fileBody.length, repeatedValue: 0)
+                fileBody.getBytes(&array, length: fileBody.length)
+                return HttpResponse.RAW(200, "OK", nil, array)
             }
             
         }
@@ -86,7 +92,9 @@ public class HttpHandlers {
                         }
                     } else {
                         if let fileBody = NSData(contentsOfFile: filePath) {
-                            return HttpResponse.RAW(200, "OK", nil, fileBody)
+                            var array = [UInt8](count: fileBody.length, repeatedValue: 0)
+                            fileBody.getBytes(&array, length: fileBody.length)
+                            return HttpResponse.RAW(200, "OK", nil, array)
                         }
                     }
                 }

+ 0 - 0
Common/HttpParser.swift → Sources/Swifter/HttpParser.swift


+ 0 - 0
Common/HttpRequest.swift → Sources/Swifter/HttpRequest.swift


+ 17 - 17
Common/HttpResponse.swift → Sources/Swifter/HttpResponse.swift

@@ -80,30 +80,30 @@ public enum HttpResponseBody {
     case Text(String)
     case Custom(Serializer, Any)
     
-    func data() -> String? {
+    func data() -> [UInt8]? {
         do {
             switch self {
-                
             case .Json(let object):
-                return try JSONSerializer.serialize(object)
-                
+                let serialised = try JSONSerializer.serialize(object)
+                return [UInt8](serialised.utf8)
             case .Xml(let object):
-                return try XMLSerializer.serialize(object)
-                
+                let serialised = try XMLSerializer.serialize(object)
+                return [UInt8](serialised.utf8)
             case .Plist(let object):
-                return try PLISTSerializer.serialize(object)
-                
+                let serialised = try PLISTSerializer.serialize(object)
+                return [UInt8](serialised.utf8)
             case .Text(let body):
-                return body
-                
+                let serialised = body
+                return [UInt8](serialised.utf8)
             case .Html(let body):
-                return "<html><meta charset=\"UTF-8\"><body>\(body)</body></html>"
-                
+                let serialised = "<html><meta charset=\"UTF-8\"><body>\(body)</body></html>"
+                return [UInt8](serialised.utf8)
             case .Custom(let serializer, let object):
-                return try serializer.serialize(object)
+                let serialised = try serializer.serialize(object)
+                return [UInt8](serialised.utf8)
             }
         } catch {
-            return "Serialisation error: \(error)"
+            return [UInt8]("Serialisation error: \(error)".utf8)
         }
     }
 }
@@ -114,7 +114,7 @@ public enum HttpResponse {
     case MovedPermanently(String)
     case BadRequest, Unauthorized, Forbidden, NotFound
     case InternalServerError
-    case RAW(Int, String, [String:String]?, NSData)
+    case RAW(Int, String, [String:String]?, [UInt8]?)
     
     func statusCode() -> Int {
         switch self {
@@ -175,9 +175,9 @@ public enum HttpResponse {
         return headers
     }
     
-    func body() -> NSData? {
+    func body() -> [UInt8]? {
         switch self {
-        case .OK(let body)          : return body.data()?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
+        case .OK(let body)          : return body.data()
         case .RAW(_,_,_, let data)  : return data
         default                     : return nil
         }

+ 7 - 7
Common/HttpServer.swift → Sources/Swifter/HttpServer.swift

@@ -129,20 +129,20 @@ public class HttpServer
     }
     
     private class func respond(socket: Socket, response: HttpResponse, keepAlive: Bool) throws {
-        try socket.writeASCII("HTTP/1.1 \(response.statusCode()) \(response.reasonPhrase())\r\n")
+        try socket.writeUTF8("HTTP/1.1 \(response.statusCode()) \(response.reasonPhrase())\r\n")
         
-        let length = response.body()?.length ?? 0
-        try socket.writeASCII("Content-Length: \(length)\r\n")
+        let length = response.body()?.count ?? 0
+        try socket.writeUTF8("Content-Length: \(length)\r\n")
         
         if keepAlive {
-            try socket.writeASCII("Connection: keep-alive\r\n")
+            try socket.writeUTF8("Connection: keep-alive\r\n")
         }
         for (name, value) in response.headers() {
-            try socket.writeASCII("\(name): \(value)\r\n")
+            try socket.writeUTF8("\(name): \(value)\r\n")
         }
-        try socket.writeASCII("\r\n")
+        try socket.writeUTF8("\r\n")
         if let body = response.body() {
-            try socket.writeData(body)
+            try socket.writeUInt8(body)
         }
     }
 }

+ 18 - 24
Common/Socket.swift → Sources/Swifter/Socket.swift

@@ -4,7 +4,11 @@
 //  Copyright (c) 2015 Damian Kołakowski. All rights reserved.
 //
 
-import Foundation
+#if os(Linux)
+    import Glibc
+#else
+    import Foundation
+#endif
 
 /* Low level routines for POSIX sockets */
 
@@ -24,6 +28,7 @@ enum SocketError: ErrorType {
 public class Socket : Hashable {
     
     public class func tcpSocketForListen(port: in_port_t = 8080, maxPendingConnection: Int32 = SOMAXCONN) throws -> Socket {
+
         let socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0)
         if socketFileDescriptor == -1 {
             throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())
@@ -88,30 +93,19 @@ public class Socket : Hashable {
     }
     
     public func writeUTF8(string: String) throws {
-        try self.writeString(string, withEncoding: NSUTF8StringEncoding)
-    }
-    
-    public func writeASCII(string: String) throws {
-        try self.writeString(string, withEncoding: NSASCIIStringEncoding)
-    }
-    
-    public func writeString(string: String, withEncoding encoding: NSStringEncoding) throws {
-        if let nsdata = string.dataUsingEncoding(encoding) {
-            try self.writeData(nsdata)
-        } else {
-            throw SocketError.WriteFailed("dataUsingEncoding(\(encoding)) failed")
-        }
-    }
-    
-    public func writeData(data: NSData) throws {
-        var sent = 0
-        let unsafePointer = UnsafePointer<UInt8>(data.bytes)
-        while sent < data.length {
-            let s = write(self.socketFileDescriptor, unsafePointer + sent, Int(data.length - sent))
-            if s <= 0 {
-                throw SocketError.WriteFailed(Socket.descriptionOfLastError())
+        try writeUInt8([UInt8](string.utf8))
+    }
+    
+    public func writeUInt8(data: [UInt8]) throws {
+        try data.withUnsafeBufferPointer { pointer in
+            var sent = 0
+            while sent < data.count {
+                let s = write(self.socketFileDescriptor, pointer.baseAddress + sent, Int(data.count - sent))
+                if s <= 0 {
+                    throw SocketError.WriteFailed(Socket.descriptionOfLastError())
+                }
+                sent += s
             }
-            sent += s
         }
     }
     

+ 88 - 64
Swifter.xcodeproj/project.pbxproj

@@ -9,29 +9,8 @@
 /* Begin PBXBuildFile section */
 		18E610A71BD6397D00B7D17A /* SwiftyJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E610A51BD6397D00B7D17A /* SwiftyJSON.swift */; };
 		7AE893EA1C05127900A29F63 /* SwifteriOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AE893E91C05127900A29F63 /* SwifteriOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		7AE893EF1C05128800A29F63 /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4815A19A2F6A60030B30D /* HttpRequest.swift */; };
-		7AE893F01C05128800A29F63 /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814A19A2EED00030B30D /* HttpParser.swift */; };
-		7AE893F11C05128800A29F63 /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814B19A2EED00030B30D /* HttpResponse.swift */; };
-		7AE893F21C05128800A29F63 /* HttpHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CB102D91A1664B200CBA3B4 /* HttpHandlers.swift */; };
-		7AE893F31C05128800A29F63 /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814C19A2EED00030B30D /* HttpServer.swift */; };
-		7AE893F41C05128800A29F63 /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814D19A2EED00030B30D /* Socket.swift */; };
-		7AE893F51C05128800A29F63 /* DemoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CB102DC1A167FFA00CBA3B4 /* DemoServer.swift */; };
 		7AE893FE1C0512C400A29F63 /* SwifterMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AE893FD1C0512C400A29F63 /* SwifterMac.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		7AE894031C0512D900A29F63 /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4815A19A2F6A60030B30D /* HttpRequest.swift */; };
-		7AE894041C0512D900A29F63 /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814A19A2EED00030B30D /* HttpParser.swift */; };
-		7AE894051C0512D900A29F63 /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814B19A2EED00030B30D /* HttpResponse.swift */; };
-		7AE894061C0512D900A29F63 /* HttpHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CB102D91A1664B200CBA3B4 /* HttpHandlers.swift */; };
-		7AE894071C0512D900A29F63 /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814C19A2EED00030B30D /* HttpServer.swift */; };
-		7AE894081C0512D900A29F63 /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814D19A2EED00030B30D /* Socket.swift */; };
-		7AE894091C0512D900A29F63 /* DemoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CB102DC1A167FFA00CBA3B4 /* DemoServer.swift */; };
 		7AE8940D1C05151100A29F63 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7AE8940C1C05151100A29F63 /* Launch Screen.storyboard */; };
-		7AE894111C05171800A29F63 /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4815A19A2F6A60030B30D /* HttpRequest.swift */; };
-		7AE894121C05171800A29F63 /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814A19A2EED00030B30D /* HttpParser.swift */; };
-		7AE894131C05171800A29F63 /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814B19A2EED00030B30D /* HttpResponse.swift */; };
-		7AE894141C05171800A29F63 /* HttpHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CB102D91A1664B200CBA3B4 /* HttpHandlers.swift */; };
-		7AE894151C05171800A29F63 /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814C19A2EED00030B30D /* HttpServer.swift */; };
-		7AE894161C05171800A29F63 /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814D19A2EED00030B30D /* Socket.swift */; };
-		7AE894171C05171800A29F63 /* DemoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CB102DC1A167FFA00CBA3B4 /* DemoServer.swift */; };
 		7C71C5B01A1D52F800682BF0 /* login.html in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98630C061A1C9A9D00478D08 /* login.html */; };
 		7C71C5B11A1EC49B00682BF0 /* logo.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7CB102DF1A17381D00CBA3B4 /* logo.png */; };
 		7CA4813E19A2EA8D0030B30D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4813D19A2EA8D0030B30D /* main.swift */; };
@@ -42,6 +21,34 @@
 		7CDAB8131BE2A1D400C8A977 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7CDAB80D1BE2A1D400C8A977 /* Main.storyboard */; };
 		7CDAB8141BE2A1D400C8A977 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7CDAB80F1BE2A1D400C8A977 /* Images.xcassets */; };
 		7CDAB8161BE2A1D400C8A977 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAB8111BE2A1D400C8A977 /* ViewController.swift */; };
+		7CEAF8531C14B29B003252DE /* DemoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84C1C14B29B003252DE /* DemoServer.swift */; };
+		7CEAF8541C14B29B003252DE /* DemoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84C1C14B29B003252DE /* DemoServer.swift */; };
+		7CEAF8551C14B29B003252DE /* DemoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84C1C14B29B003252DE /* DemoServer.swift */; };
+		7CEAF8561C14B29B003252DE /* DemoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84C1C14B29B003252DE /* DemoServer.swift */; };
+		7CEAF8571C14B29B003252DE /* HttpHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84D1C14B29B003252DE /* HttpHandlers.swift */; };
+		7CEAF8581C14B29B003252DE /* HttpHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84D1C14B29B003252DE /* HttpHandlers.swift */; };
+		7CEAF8591C14B29B003252DE /* HttpHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84D1C14B29B003252DE /* HttpHandlers.swift */; };
+		7CEAF85A1C14B29B003252DE /* HttpHandlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84D1C14B29B003252DE /* HttpHandlers.swift */; };
+		7CEAF85B1C14B29B003252DE /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84E1C14B29B003252DE /* HttpParser.swift */; };
+		7CEAF85C1C14B29B003252DE /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84E1C14B29B003252DE /* HttpParser.swift */; };
+		7CEAF85D1C14B29B003252DE /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84E1C14B29B003252DE /* HttpParser.swift */; };
+		7CEAF85E1C14B29B003252DE /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84E1C14B29B003252DE /* HttpParser.swift */; };
+		7CEAF85F1C14B29B003252DE /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84F1C14B29B003252DE /* HttpRequest.swift */; };
+		7CEAF8601C14B29B003252DE /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84F1C14B29B003252DE /* HttpRequest.swift */; };
+		7CEAF8611C14B29B003252DE /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84F1C14B29B003252DE /* HttpRequest.swift */; };
+		7CEAF8621C14B29B003252DE /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF84F1C14B29B003252DE /* HttpRequest.swift */; };
+		7CEAF8631C14B29B003252DE /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8501C14B29B003252DE /* HttpResponse.swift */; };
+		7CEAF8641C14B29B003252DE /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8501C14B29B003252DE /* HttpResponse.swift */; };
+		7CEAF8651C14B29B003252DE /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8501C14B29B003252DE /* HttpResponse.swift */; };
+		7CEAF8661C14B29B003252DE /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8501C14B29B003252DE /* HttpResponse.swift */; };
+		7CEAF8671C14B29B003252DE /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8511C14B29B003252DE /* HttpServer.swift */; };
+		7CEAF8681C14B29B003252DE /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8511C14B29B003252DE /* HttpServer.swift */; };
+		7CEAF8691C14B29B003252DE /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8511C14B29B003252DE /* HttpServer.swift */; };
+		7CEAF86A1C14B29B003252DE /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8511C14B29B003252DE /* HttpServer.swift */; };
+		7CEAF86B1C14B29B003252DE /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8521C14B29B003252DE /* Socket.swift */; };
+		7CEAF86C1C14B29B003252DE /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8521C14B29B003252DE /* Socket.swift */; };
+		7CEAF86D1C14B29B003252DE /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8521C14B29B003252DE /* Socket.swift */; };
+		7CEAF86E1C14B29B003252DE /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF8521C14B29B003252DE /* Socket.swift */; };
 		98630C071A1C9A9D00478D08 /* login.html in Resources */ = {isa = PBXBuildFile; fileRef = 98630C061A1C9A9D00478D08 /* login.html */; };
 /* End PBXBuildFile section */
 
@@ -89,20 +96,21 @@
 		7C839B6E19422CFF003A6950 /* SwifterSampleiOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwifterSampleiOS.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		7CA4813B19A2EA8D0030B30D /* SwifterSampleOSX */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SwifterSampleOSX; sourceTree = BUILT_PRODUCTS_DIR; };
 		7CA4813D19A2EA8D0030B30D /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
-		7CA4814A19A2EED00030B30D /* HttpParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpParser.swift; sourceTree = "<group>"; };
-		7CA4814B19A2EED00030B30D /* HttpResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpResponse.swift; sourceTree = "<group>"; };
-		7CA4814C19A2EED00030B30D /* HttpServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpServer.swift; sourceTree = "<group>"; };
-		7CA4814D19A2EED00030B30D /* Socket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Socket.swift; sourceTree = "<group>"; };
 		7CA4815719A2EF2B0030B30D /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = "<group>"; };
-		7CA4815A19A2F6A60030B30D /* HttpRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpRequest.swift; sourceTree = "<group>"; };
-		7CB102D91A1664B200CBA3B4 /* HttpHandlers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpHandlers.swift; sourceTree = "<group>"; };
-		7CB102DC1A167FFA00CBA3B4 /* DemoServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoServer.swift; sourceTree = "<group>"; };
 		7CB102DF1A17381D00CBA3B4 /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = "<group>"; };
 		7CDAB80C1BE2A1D400C8A977 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		7CDAB80E1BE2A1D400C8A977 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		7CDAB80F1BE2A1D400C8A977 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
 		7CDAB8101BE2A1D400C8A977 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		7CDAB8111BE2A1D400C8A977 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
+		7CEAF84C1C14B29B003252DE /* DemoServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoServer.swift; sourceTree = "<group>"; };
+		7CEAF84D1C14B29B003252DE /* HttpHandlers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpHandlers.swift; sourceTree = "<group>"; };
+		7CEAF84E1C14B29B003252DE /* HttpParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpParser.swift; sourceTree = "<group>"; };
+		7CEAF84F1C14B29B003252DE /* HttpRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpRequest.swift; sourceTree = "<group>"; };
+		7CEAF8501C14B29B003252DE /* HttpResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpResponse.swift; sourceTree = "<group>"; };
+		7CEAF8511C14B29B003252DE /* HttpServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpServer.swift; sourceTree = "<group>"; };
+		7CEAF8521C14B29B003252DE /* Socket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Socket.swift; sourceTree = "<group>"; };
+		7CEAF86F1C14B2B5003252DE /* Package.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
 		98630C061A1C9A9D00478D08 /* login.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = login.html; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -159,7 +167,8 @@
 		7C839B6519422CFF003A6950 = {
 			isa = PBXGroup;
 			children = (
-				7CA4814919A2EED00030B30D /* Common */,
+				7CEAF86F1C14B2B5003252DE /* Package.swift */,
+				7CEAF84A1C14B29B003252DE /* Sources */,
 				7C839B6F19422CFF003A6950 /* Products */,
 				7CA4815619A2EF2B0030B30D /* Resources */,
 				7AE893FC1C0512C400A29F63 /* SwifterMac */,
@@ -189,20 +198,6 @@
 			path = SwifterSampleOSX;
 			sourceTree = "<group>";
 		};
-		7CA4814919A2EED00030B30D /* Common */ = {
-			isa = PBXGroup;
-			children = (
-				7CB102DC1A167FFA00CBA3B4 /* DemoServer.swift */,
-				7CB102D91A1664B200CBA3B4 /* HttpHandlers.swift */,
-				7CA4814A19A2EED00030B30D /* HttpParser.swift */,
-				7CA4815A19A2F6A60030B30D /* HttpRequest.swift */,
-				7CA4814B19A2EED00030B30D /* HttpResponse.swift */,
-				7CA4814C19A2EED00030B30D /* HttpServer.swift */,
-				7CA4814D19A2EED00030B30D /* Socket.swift */,
-			);
-			path = Common;
-			sourceTree = "<group>";
-		};
 		7CA4815619A2EF2B0030B30D /* Resources */ = {
 			isa = PBXGroup;
 			children = (
@@ -226,6 +221,28 @@
 			path = SwifterSampleiOS;
 			sourceTree = "<group>";
 		};
+		7CEAF84A1C14B29B003252DE /* Sources */ = {
+			isa = PBXGroup;
+			children = (
+				7CEAF84B1C14B29B003252DE /* Swifter */,
+			);
+			path = Sources;
+			sourceTree = "<group>";
+		};
+		7CEAF84B1C14B29B003252DE /* Swifter */ = {
+			isa = PBXGroup;
+			children = (
+				7CEAF84C1C14B29B003252DE /* DemoServer.swift */,
+				7CEAF84D1C14B29B003252DE /* HttpHandlers.swift */,
+				7CEAF84E1C14B29B003252DE /* HttpParser.swift */,
+				7CEAF84F1C14B29B003252DE /* HttpRequest.swift */,
+				7CEAF8501C14B29B003252DE /* HttpResponse.swift */,
+				7CEAF8511C14B29B003252DE /* HttpServer.swift */,
+				7CEAF8521C14B29B003252DE /* Socket.swift */,
+			);
+			path = Swifter;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
@@ -400,13 +417,13 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				7AE893F11C05128800A29F63 /* HttpResponse.swift in Sources */,
-				7AE893F01C05128800A29F63 /* HttpParser.swift in Sources */,
-				7AE893F51C05128800A29F63 /* DemoServer.swift in Sources */,
-				7AE893F41C05128800A29F63 /* Socket.swift in Sources */,
-				7AE893F31C05128800A29F63 /* HttpServer.swift in Sources */,
-				7AE893F21C05128800A29F63 /* HttpHandlers.swift in Sources */,
-				7AE893EF1C05128800A29F63 /* HttpRequest.swift in Sources */,
+				7CEAF8651C14B29B003252DE /* HttpResponse.swift in Sources */,
+				7CEAF86D1C14B29B003252DE /* Socket.swift in Sources */,
+				7CEAF8591C14B29B003252DE /* HttpHandlers.swift in Sources */,
+				7CEAF8691C14B29B003252DE /* HttpServer.swift in Sources */,
+				7CEAF8611C14B29B003252DE /* HttpRequest.swift in Sources */,
+				7CEAF85D1C14B29B003252DE /* HttpParser.swift in Sources */,
+				7CEAF8551C14B29B003252DE /* DemoServer.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -414,13 +431,13 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				7AE894051C0512D900A29F63 /* HttpResponse.swift in Sources */,
-				7AE894041C0512D900A29F63 /* HttpParser.swift in Sources */,
-				7AE894091C0512D900A29F63 /* DemoServer.swift in Sources */,
-				7AE894081C0512D900A29F63 /* Socket.swift in Sources */,
-				7AE894071C0512D900A29F63 /* HttpServer.swift in Sources */,
-				7AE894061C0512D900A29F63 /* HttpHandlers.swift in Sources */,
-				7AE894031C0512D900A29F63 /* HttpRequest.swift in Sources */,
+				7CEAF8661C14B29B003252DE /* HttpResponse.swift in Sources */,
+				7CEAF86E1C14B29B003252DE /* Socket.swift in Sources */,
+				7CEAF85A1C14B29B003252DE /* HttpHandlers.swift in Sources */,
+				7CEAF86A1C14B29B003252DE /* HttpServer.swift in Sources */,
+				7CEAF8621C14B29B003252DE /* HttpRequest.swift in Sources */,
+				7CEAF85E1C14B29B003252DE /* HttpParser.swift in Sources */,
+				7CEAF8561C14B29B003252DE /* DemoServer.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -429,7 +446,14 @@
 			buildActionMask = 2147483647;
 			files = (
 				7CDAB8161BE2A1D400C8A977 /* ViewController.swift in Sources */,
+				7CEAF8531C14B29B003252DE /* DemoServer.swift in Sources */,
+				7CEAF8671C14B29B003252DE /* HttpServer.swift in Sources */,
+				7CEAF8571C14B29B003252DE /* HttpHandlers.swift in Sources */,
+				7CEAF85B1C14B29B003252DE /* HttpParser.swift in Sources */,
+				7CEAF86B1C14B29B003252DE /* Socket.swift in Sources */,
 				7CDAB8121BE2A1D400C8A977 /* AppDelegate.swift in Sources */,
+				7CEAF8631C14B29B003252DE /* HttpResponse.swift in Sources */,
+				7CEAF85F1C14B29B003252DE /* HttpRequest.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -437,15 +461,15 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				7AE894161C05171800A29F63 /* Socket.swift in Sources */,
-				7AE894171C05171800A29F63 /* DemoServer.swift in Sources */,
-				7AE894131C05171800A29F63 /* HttpResponse.swift in Sources */,
-				7AE894121C05171800A29F63 /* HttpParser.swift in Sources */,
-				7AE894141C05171800A29F63 /* HttpHandlers.swift in Sources */,
-				7AE894151C05171800A29F63 /* HttpServer.swift in Sources */,
 				7CA4813E19A2EA8D0030B30D /* main.swift in Sources */,
+				7CEAF8541C14B29B003252DE /* DemoServer.swift in Sources */,
+				7CEAF8681C14B29B003252DE /* HttpServer.swift in Sources */,
+				7CEAF8581C14B29B003252DE /* HttpHandlers.swift in Sources */,
+				7CEAF85C1C14B29B003252DE /* HttpParser.swift in Sources */,
+				7CEAF86C1C14B29B003252DE /* Socket.swift in Sources */,
 				18E610A71BD6397D00B7D17A /* SwiftyJSON.swift in Sources */,
-				7AE894111C05171800A29F63 /* HttpRequest.swift in Sources */,
+				7CEAF8641C14B29B003252DE /* HttpResponse.swift in Sources */,
+				7CEAF8601C14B29B003252DE /* HttpRequest.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

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


+ 3 - 3
Swifter.xcodeproj/xcshareddata/xcschemes/SwifterMac.xcscheme

@@ -15,7 +15,7 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "7AE893FA1C0512C400A29F63"
-               BuildableName = "SwifterMac.framework"
+               BuildableName = "Swifter.framework"
                BlueprintName = "SwifterMac"
                ReferencedContainer = "container:Swifter.xcodeproj">
             </BuildableReference>
@@ -46,7 +46,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "7AE893FA1C0512C400A29F63"
-            BuildableName = "SwifterMac.framework"
+            BuildableName = "Swifter.framework"
             BlueprintName = "SwifterMac"
             ReferencedContainer = "container:Swifter.xcodeproj">
          </BuildableReference>
@@ -64,7 +64,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "7AE893FA1C0512C400A29F63"
-            BuildableName = "SwifterMac.framework"
+            BuildableName = "Swifter.framework"
             BlueprintName = "SwifterMac"
             ReferencedContainer = "container:Swifter.xcodeproj">
          </BuildableReference>

+ 3 - 3
Swifter.xcodeproj/xcshareddata/xcschemes/SwifteriOS.xcscheme

@@ -15,7 +15,7 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "7AE893E61C05127900A29F63"
-               BuildableName = "SwifteriOS.framework"
+               BuildableName = "Swifter.framework"
                BlueprintName = "SwifteriOS"
                ReferencedContainer = "container:Swifter.xcodeproj">
             </BuildableReference>
@@ -46,7 +46,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "7AE893E61C05127900A29F63"
-            BuildableName = "SwifteriOS.framework"
+            BuildableName = "Swifter.framework"
             BlueprintName = "SwifteriOS"
             ReferencedContainer = "container:Swifter.xcodeproj">
          </BuildableReference>
@@ -64,7 +64,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "7AE893E61C05127900A29F63"
-            BuildableName = "SwifteriOS.framework"
+            BuildableName = "Swifter.framework"
             BlueprintName = "SwifteriOS"
             ReferencedContainer = "container:Swifter.xcodeproj">
          </BuildableReference>

+ 38 - 22
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -282,11 +282,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/DemoServer.swift"
-            timestampString = "467836520.415098"
+            timestampString = "471114399.614843"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "64"
-            endingLineNumber = "64"
+            startingLineNumber = "66"
+            endingLineNumber = "66"
             landmarkName = "demoServer(_:)"
             landmarkType = "7">
          </BreakpointContent>
@@ -298,11 +298,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/DemoServer.swift"
-            timestampString = "467836520.415098"
+            timestampString = "471114399.614843"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "72"
-            endingLineNumber = "72"
+            startingLineNumber = "74"
+            endingLineNumber = "74"
             landmarkName = "demoServer(_:)"
             landmarkType = "7">
          </BreakpointContent>
@@ -415,7 +415,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "36"
             endingLineNumber = "36"
-            landmarkName = "directoryBrowser(_:)"
+            landmarkName = "directory(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -426,12 +426,12 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpHandlers.swift"
-            timestampString = "468325248.961405"
+            timestampString = "471114399.614843"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "51"
-            endingLineNumber = "51"
-            landmarkName = "directoryBrowser(_:)"
+            startingLineNumber = "53"
+            endingLineNumber = "53"
+            landmarkName = "directory(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -442,12 +442,12 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpHandlers.swift"
-            timestampString = "468325248.961405"
+            timestampString = "471114399.614843"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "52"
-            endingLineNumber = "52"
-            landmarkName = "directoryBrowser(_:)"
+            startingLineNumber = "54"
+            endingLineNumber = "54"
+            landmarkName = "directory(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -463,7 +463,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "37"
             endingLineNumber = "37"
-            landmarkName = "directoryBrowser(_:)"
+            landmarkName = "directory(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -650,7 +650,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "34"
             endingLineNumber = "34"
-            landmarkName = "directoryBrowser(_:)"
+            landmarkName = "directory(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -709,11 +709,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/Socket.swift"
-            timestampString = "466971590.533081"
+            timestampString = "471114399.614843"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "65"
-            endingLineNumber = "65"
+            startingLineNumber = "69"
+            endingLineNumber = "69"
             landmarkName = "init(socketFileDescriptor:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -730,7 +730,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "35"
             endingLineNumber = "35"
-            landmarkName = "directoryBrowser(_:)"
+            landmarkName = "directory(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -762,7 +762,23 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "13"
             endingLineNumber = "13"
-            landmarkName = "file(_:)"
+            landmarkName = "HttpHandlers"
+            landmarkType = "3">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/Socket.swift"
+            timestampString = "471112991.713524"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "102"
+            endingLineNumber = "102"
+            landmarkName = "writeUInt8(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>

+ 8 - 8
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcschemes/SwifterOSX.xcscheme

@@ -15,8 +15,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "7CA4813A19A2EA8D0030B30D"
-               BuildableName = "SwifterOSX"
-               BlueprintName = "SwifterOSX"
+               BuildableName = "SwifterSampleOSX"
+               BlueprintName = "SwifterSampleOSX"
                ReferencedContainer = "container:Swifter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -33,8 +33,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "7CA4813A19A2EA8D0030B30D"
-            BuildableName = "SwifterOSX"
-            BlueprintName = "SwifterOSX"
+            BuildableName = "SwifterSampleOSX"
+            BlueprintName = "SwifterSampleOSX"
             ReferencedContainer = "container:Swifter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -56,8 +56,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "7CA4813A19A2EA8D0030B30D"
-            BuildableName = "SwifterOSX"
-            BlueprintName = "SwifterOSX"
+            BuildableName = "SwifterSampleOSX"
+            BlueprintName = "SwifterSampleOSX"
             ReferencedContainer = "container:Swifter.xcodeproj">
          </BuildableReference>
       </BuildableProductRunnable>
@@ -75,8 +75,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "7CA4813A19A2EA8D0030B30D"
-            BuildableName = "SwifterOSX"
-            BlueprintName = "SwifterOSX"
+            BuildableName = "SwifterSampleOSX"
+            BlueprintName = "SwifterSampleOSX"
             ReferencedContainer = "container:Swifter.xcodeproj">
          </BuildableReference>
       </BuildableProductRunnable>

+ 10 - 0
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -17,6 +17,16 @@
 	</dict>
 	<key>SuppressBuildableAutocreation</key>
 	<dict>
+		<key>7AE893E61C05127900A29F63</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>7AE893FA1C0512C400A29F63</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
 		<key>7C839B6D19422CFF003A6950</key>
 		<dict>
 			<key>primary</key>