1
0
Эх сурвалжийг харах

Swifter sends correctly binary files ( images, etc. ).

Damian Kołakowski 11 жил өмнө
parent
commit
1102e0cce7

+ 3 - 3
Common/DemoServer.swift

@@ -41,7 +41,7 @@ func demoServer(publicDir: String?) -> HttpServer {
     server["/long"] = { request in
         var longResponse = ""
         for k in 0..<1000 { longResponse += "(\(k)),->" }
-        return .OK(.RAW(longResponse))
+        return .OK(.HTML(longResponse))
     }
     server["/demo"] = { request in
         return .OK(.HTML("<center><h2>Hello Swift</h2>" +
@@ -52,8 +52,8 @@ func demoServer(publicDir: String?) -> HttpServer {
         switch request.method.uppercaseString {
             case "GET":
                 if let rootDir = publicDir {
-                    if let html = String(contentsOfFile:"\(rootDir)/login.html", encoding: NSUTF8StringEncoding, error: nil){
-                        return .OK(.RAW(html))
+                    if let html = NSData(contentsOfFile:"\(rootDir)/login.html") {
+                        return .RAW(200, html)
                     } else {
                         return .NotFound
                     }

+ 2 - 2
Common/HttpHandlers.swift

@@ -14,8 +14,8 @@ class HttpHandlers {
         return { request in
             if let localPath = request.capturedUrlGroups.first {
                 let filesPath = dir.stringByExpandingTildeInPath.stringByAppendingPathComponent(localPath)
-                if let fileBody = String(contentsOfFile: filesPath, encoding: NSASCIIStringEncoding, error: nil) {
-                    return HttpResponse.OK(.RAW(fileBody))
+                if let fileBody = NSData(contentsOfFile: filesPath) {
+                    return HttpResponse.RAW(200, fileBody)
                 }
             }
             return HttpResponse.NotFound

+ 9 - 8
Common/HttpResponse.swift

@@ -13,8 +13,8 @@ enum HttpResponseBody {
     case JSON(AnyObject)
     case XML(AnyObject)
     case PLIST(AnyObject)
-    case RAW(String)
     case HTML(String)
+    case RAW(String)
     
     func data() -> String? {
         switch self {
@@ -39,8 +39,8 @@ enum HttpResponseBody {
                 return "Serialisation error: \(serializationError)"
             }
             return "Invalid object to serialise."
-        case .RAW(let data):
-            return data
+        case .RAW(let body):
+            return body
         case .HTML(let body):
             return "<html><body>\(body)</body></html>"
         }
@@ -53,7 +53,7 @@ enum HttpResponse {
     case MovedPermanently(String)
     case BadRequest, Unauthorized, Forbidden, NotFound
     case InternalServerError
-    case Raw(Int,String)
+    case RAW(Int, NSData)
     
     func statusCode() -> Int {
         switch self {
@@ -66,7 +66,7 @@ enum HttpResponse {
         case .Forbidden             : return 403
         case .NotFound              : return 404
         case .InternalServerError   : return 500
-        case .Raw(let code, _)      : return code
+        case .RAW(let code, _)      : return code
         }
     }
     
@@ -81,7 +81,7 @@ enum HttpResponse {
         case .Forbidden             : return "Forbidden"
         case .NotFound              : return "Not Found"
         case .InternalServerError   : return "Internal Server Error"
-        case .Raw(_,_)              : return "Custom"
+        case .RAW(_,_)              : return "Custom"
         }
     }
     
@@ -92,9 +92,10 @@ enum HttpResponse {
         }
     }
     
-    func body() -> String? {
+    func body() -> NSData? {
         switch self {
-        case .OK(let body)      : return body.data()
+        case .OK(let body)      : return body.data()?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
+        case .RAW(_, let data)  : return data
         default                 : return nil
         }
     }

+ 8 - 12
Common/HttpServer.swift

@@ -84,24 +84,20 @@ class HttpServer
     
     class func writeResponse(socket: CInt, response: HttpResponse, keepAlive: Bool) {
         Socket.writeStringUTF8(socket, string: "HTTP/1.1 \(response.statusCode()) \(response.reasonPhrase())\r\n")
-        let messageBody = response.body()
-        if let body = messageBody {
-            if let nsdata = body.dataUsingEncoding(NSUTF8StringEncoding) {
-                Socket.writeStringUTF8(socket, string: "Content-Length: \(nsdata.length)\r\n")
-            }
+        if let body = response.body() {
+            Socket.writeStringASCII(socket, string: "Content-Length: \(body.length)\r\n")
         } else {
-            Socket.writeStringUTF8(socket, string: "Content-Length: 0\r\n")
+            Socket.writeStringASCII(socket, string: "Content-Length: 0\r\n")
         }
         if keepAlive {
-            Socket.writeStringUTF8(socket, string: "Connection: keep-alive\r\n")
+            Socket.writeStringASCII(socket, string: "Connection: keep-alive\r\n")
         }
-        //Socket.writeStringUTF8(socket, string: "Content-Type: text/html; charset=UTF-8\r\n")
         for (name, value) in response.headers() {
-            Socket.writeStringUTF8(socket, string: "\(name): \(value)\r\n")
+            Socket.writeStringASCII(socket, string: "\(name): \(value)\r\n")
         }
-        Socket.writeStringUTF8(socket, string: "\r\n")
-        if let body = messageBody {
-            Socket.writeStringUTF8(socket, string: body)
+        Socket.writeStringASCII(socket, string: "\r\n")
+        if let body = response.body() {
+            Socket.writeData(socket, data: body)
         }
     }
     

+ 25 - 14
Common/Socket.swift

@@ -50,20 +50,31 @@ struct Socket {
         return s
     }
     
-    static func writeStringUTF8(socket: CInt, string: String, error:NSErrorPointer = nil) -> Bool {
-        var sent = 0;
-        if let nsdata = string.dataUsingEncoding(NSUTF8StringEncoding)
-		{
-			let unsafePointer = UnsafePointer<UInt8>(nsdata.bytes)
-			while ( sent < nsdata.length ) {
-				let s = write(socket, unsafePointer + sent, UInt(nsdata.length - sent))
-				if ( s <= 0 ) {
-					if error != nil { error.memory = socketLastError("write(\(string)) failed.") }
-					return false
-				}
-				sent += s
-			}
-		}
+    static func writeStringUTF8(socket: CInt, string: String, error: NSErrorPointer = nil) -> Bool {
+        if let nsdata = string.dataUsingEncoding(NSUTF8StringEncoding) {
+            writeData(socket, data: nsdata, error: error)
+        }
+        return true
+    }
+    
+    static func writeStringASCII(socket: CInt, string: String, error: NSErrorPointer = nil) -> Bool {
+        if let nsdata = string.dataUsingEncoding(NSASCIIStringEncoding) {
+            writeData(socket, data: nsdata, error: error)
+        }
+        return true
+    }
+    
+    static func writeData(socket: CInt, data: NSData, error:NSErrorPointer = nil) -> Bool {
+        var sent = 0
+        let unsafePointer = UnsafePointer<UInt8>(data.bytes)
+        while ( sent < data.length ) {
+            let s = write(socket, unsafePointer + sent, UInt(data.length - sent))
+            if ( s <= 0 ) {
+                if error != nil { error.memory = socketLastError("write(...) failed.") }
+                return false
+            }
+            sent += s
+        }
         return true
     }
     

+ 2 - 0
Swifter.xcodeproj/project.pbxproj

@@ -10,6 +10,7 @@
 		7C6A510E1A149859004924B5 /* ActiveRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6A510D1A149859004924B5 /* ActiveRecord.swift */; };
 		7C6A510F1A149859004924B5 /* ActiveRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6A510D1A149859004924B5 /* ActiveRecord.swift */; };
 		7C71C5B01A1D52F800682BF0 /* login.html in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98630C061A1C9A9D00478D08 /* login.html */; };
+		7C71C5B11A1EC49B00682BF0 /* logo.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7CB102DF1A17381D00CBA3B4 /* logo.png */; };
 		7C839B7419422CFF003A6950 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C839B7319422CFF003A6950 /* AppDelegate.swift */; };
 		7C839B7619422CFF003A6950 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C839B7519422CFF003A6950 /* ViewController.swift */; };
 		7C839B7919422CFF003A6950 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C839B7719422CFF003A6950 /* Main.storyboard */; };
@@ -42,6 +43,7 @@
 			dstPath = "";
 			dstSubfolderSpec = 7;
 			files = (
+				7C71C5B11A1EC49B00682BF0 /* logo.png in CopyFiles */,
 				7C71C5B01A1D52F800682BF0 /* login.html in CopyFiles */,
 				7CA4815919A2EF560030B30D /* test.json in CopyFiles */,
 			);

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


+ 110 - 0
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -559,5 +559,115 @@
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/HttpHandlers.swift"
+            timestampString = "438224056.870481"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "14"
+            endingLineNumber = "14"
+            landmarkName = "directory(_:)"
+            landmarkType = "5">
+            <Locations>
+               <Location
+                  shouldBeEnabled = "No"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "SwifterOSX.HttpHandlers.directory (SwifterOSX.HttpHandlers.Type)(Swift.String) -&gt; (SwifterOSX.HttpRequest) -&gt; SwifterOSX.HttpResponse"
+                  moduleName = "SwifterOSX"
+                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/HttpHandlers.swift"
+                  timestampString = "438224155.861229"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "14"
+                  endingLineNumber = "14"
+                  offsetFromSymbolStart = "122">
+               </Location>
+               <Location
+                  shouldBeEnabled = "No"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "SwifterOSX.HttpHandlers.(directory (SwifterOSX.HttpHandlers.Type) -&gt; (Swift.String) -&gt; (SwifterOSX.HttpRequest) -&gt; SwifterOSX.HttpResponse).(closure #1)"
+                  moduleName = "SwifterOSX"
+                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/HttpHandlers.swift"
+                  timestampString = "438224155.861392"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "14"
+                  endingLineNumber = "14"
+                  offsetFromSymbolStart = "163">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/HttpServer.swift"
+            timestampString = "438247447.382034"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "86"
+            endingLineNumber = "86"
+            landmarkName = "writeResponse(_:response:keepAlive:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/HttpServer.swift"
+            timestampString = "438249249.036323"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "87"
+            endingLineNumber = "87"
+            landmarkName = "writeResponse(_:response:keepAlive:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/HttpHandlers.swift"
+            timestampString = "438247582.598149"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "18"
+            endingLineNumber = "18"
+            landmarkName = "directory(_:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/Socket.swift"
+            timestampString = "438247668.960213"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "55"
+            endingLineNumber = "55"
+            landmarkName = "writeStringUTF8(_:string:error:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>