Răsfoiți Sursa

Updated to pass through responseData for the response

Christopher Luu 11 ani în urmă
părinte
comite
0fde3dc302
2 a modificat fișierele cu 20 adăugiri și 10 ștergeri
  1. 16 6
      Swifter/HttpParser.swift
  2. 4 4
      Swifter/HttpServer.swift

+ 16 - 6
Swifter/HttpParser.swift

@@ -13,7 +13,7 @@ class HttpParser {
         return NSError.errorWithDomain("HTTP_PARSER", code: 0, userInfo:[NSLocalizedFailureReasonErrorKey : reason])
     }
     
-    func nextHttpRequest(socket: CInt, error:NSErrorPointer = nil) -> (String, String, Dictionary<String, String>)? {
+    func nextHttpRequest(socket: CInt, error:NSErrorPointer = nil) -> (String, String, Dictionary<String, String>, NSData?)? {
         if let statusLine = nextLine(socket, error: error) {
             let statusTokens = split(statusLine, { $0 == " " })
             println(statusTokens)
@@ -24,7 +24,17 @@ class HttpParser {
             let method = statusTokens[0]
             let path = statusTokens[1]
             if let headers = nextHeaders(socket, error: error) {
-                return (path, method, headers)
+				var responseString = ""
+                while let line = nextLine(socket, error: error)
+                {
+                    if line.isEmpty {
+                        break
+                    }
+                    responseString += line
+                }
+				NSLog(responseString)
+				let responseData = responseString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
+                return (path, method, headers, responseData)
             }
         }
         return nil
@@ -56,9 +66,9 @@ class HttpParser {
     var recvBufferOffset: Int = 0
     
     func nextUInt8(socket: CInt) -> Int {
-        if ( recvBufferSize == 0 || recvBufferSize == recvBufferOffset ) {
+        if ( recvBufferSize == 0 ) {
             recvBufferOffset = 0
-            recvBufferSize = recv(socket, &recvBuffer, UInt(recvBuffer.count), 0)
+            recvBufferSize = recv(socket, &recvBuffer, UInt(recvBuffer.count), MSG_EOF)
             if ( recvBufferSize <= 0 ) { return recvBufferSize }
         }
         let returnValue = recvBuffer[recvBufferOffset]
@@ -72,8 +82,8 @@ class HttpParser {
         do {
             n = nextUInt8(socket)
             if ( n > 13 /* CR */ ) { characters.append(Character(UnicodeScalar(n))) }
-        } while ( n > 0 && n != 10 /* NL */ );
-        if ( n == -1 ) {
+        } while ( n > 0 && n != 10 /* NL */);
+        if ( n == -1 && characters.isEmpty ) {
             if error != nil { error.memory = Socket.socketLastError("recv(...) failed.") }
             return nil
         }

+ 4 - 4
Swifter/HttpServer.swift

@@ -9,7 +9,7 @@ import Foundation
 
 class HttpServer
 {
-    typealias Handler = (String, String, Dictionary<String,String>) -> HttpResponse
+    typealias Handler = (String, String, Dictionary<String,String>, NSData?) -> HttpResponse
     
     var handlers: [(expression: NSRegularExpression, handler: Handler)] = []
     var acceptSocket: CInt = -1
@@ -42,7 +42,7 @@ class HttpServer
         }
         set ( directoryPath ) {
             if let regex = NSRegularExpression.regularExpressionWithPattern(path, options: expressionOptions, error: nil) {
-                handlers.append(expression: regex, handler: { (method, path, headers) in
+                handlers.append(expression: regex, handler: { (method, path, headers, responseData) in
                     let result = regex.firstMatchInString(path, options: self.matchingOptions, range: NSMakeRange(0, path.lengthOfBytesUsingEncoding(NSASCIIStringEncoding)))
 					let myPath: NSString = path
 					let filesPath = directoryPath.stringByAppendingPathComponent(myPath.substringWithRange(result.rangeAtIndex(1)))
@@ -69,10 +69,10 @@ class HttpServer
                 while let socket = Socket.acceptClientSocket(self.acceptSocket) {
                     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
                         let parser = HttpParser()
-                        while let (path, method, headers) = parser.nextHttpRequest(socket) {
+                        while let (path, method, headers, responseData) = parser.nextHttpRequest(socket) {
                             let keepAlive = parser.supportsKeepAlive(headers)
                             if let handler: Handler = self[path] {
-                                HttpServer.writeResponse(socket, response: handler(method, path, headers), keepAlive: keepAlive)
+                                HttpServer.writeResponse(socket, response: handler(method, path, headers, responseData), keepAlive: keepAlive)
                             } else {
                                 HttpServer.writeResponse(socket, response: HttpResponse.NotFound, keepAlive: keepAlive)
                             }