Просмотр исходного кода

Merge pull request #8 from nuudles/master

Added the ability to get the responseData for each response
Damian Kołakowski 11 лет назад
Родитель
Сommit
b13fd197ca
3 измененных файлов с 29 добавлено и 14 удалено
  1. 20 6
      Common/HttpParser.swift
  2. 1 0
      Common/HttpRequest.swift
  3. 8 8
      Common/HttpServer.swift

+ 20 - 6
Common/HttpParser.swift

@@ -12,7 +12,7 @@ class HttpParser {
     class func err(reason:String) -> NSError {
         return NSError.errorWithDomain("HTTP_PARSER", code: 0, userInfo:[NSLocalizedFailureReasonErrorKey : reason])
     }
-    
+
     func nextHttpRequest(socket: CInt, error:NSErrorPointer = nil) -> HttpRequest? { //(String, String, Dictionary<String, String>)? {
         if let statusLine = nextLine(socket, error: error) {
             let statusTokens = split(statusLine, { $0 == " " })
@@ -24,7 +24,17 @@ class HttpParser {
             let method = statusTokens[0]
             let path = statusTokens[1]
             if let headers = nextHeaders(socket, error: error) {
-                return HttpRequest(url: path, method: method, headers: headers)
+                var responseString = ""
+                while let line = nextLine(socket, error: error)
+                {
+                    if line.isEmpty {
+                        break
+                    }
+                    responseString += line
+                }
+                println(responseString)
+                let responseData = responseString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
+                return HttpRequest(url: path, method: method, headers: headers, responseData: responseData)
             }
         }
         return nil
@@ -56,10 +66,14 @@ class HttpParser {
     var recvBufferOffset: Int = 0
     
     func nextUInt8(socket: CInt) -> Int {
-        if ( recvBufferSize == 0 || recvBufferSize == recvBufferOffset ) {
+        if ( recvBufferSize == 0 || recvBufferOffset == recvBuffer.count ) {
             recvBufferOffset = 0
-            recvBufferSize = recv(socket, &recvBuffer, UInt(recvBuffer.count), 0)
+            recvBufferSize = recv(socket, &recvBuffer, UInt(recvBuffer.count), MSG_DONTWAIT)
             if ( recvBufferSize <= 0 ) { return recvBufferSize }
+            if recvBufferSize < recvBuffer.count
+            {
+                recvBuffer[recvBufferSize] = 0
+            }
         }
         let returnValue = recvBuffer[recvBufferOffset]
         recvBufferOffset++
@@ -72,8 +86,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
         }

+ 1 - 0
Common/HttpRequest.swift

@@ -12,4 +12,5 @@ struct HttpRequest {
     let url: String
     let method: String
     let headers: Dictionary<String, String>
+	let responseData: NSData?
 }

+ 8 - 8
Common/HttpServer.swift

@@ -44,12 +44,12 @@ class HttpServer
             if let regex = NSRegularExpression.regularExpressionWithPattern(path, options: expressionOptions, error: nil) {
                 handlers.append(expression: regex, handler: { request in
                     let result = regex.firstMatchInString(request.url, options: self.matchingOptions, range: NSMakeRange(0, request.url.lengthOfBytesUsingEncoding(NSASCIIStringEncoding)))
-					let nsPath: NSString = request.url
-					let filesPath = directoryPath.stringByExpandingTildeInPath
+                    let nsPath: NSString = request.url
+                    let filesPath = directoryPath.stringByExpandingTildeInPath
                         .stringByAppendingPathComponent(nsPath.substringWithRange(result.rangeAtIndex(1)))
-					if let fileBody = String.stringWithContentsOfFile(filesPath, encoding: NSASCIIStringEncoding, error: nil) {
-						return HttpResponse.OK(.RAW(fileBody))
-					}
+                    if let fileBody = String.stringWithContentsOfFile(filesPath, encoding: NSASCIIStringEncoding, error: nil) {
+                        return HttpResponse.OK(.RAW(fileBody))
+                    }
                     return HttpResponse.NotFound
                 })
             }
@@ -93,9 +93,9 @@ class HttpServer
         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 nsdata = body.dataUsingEncoding(NSUTF8StringEncoding) {
+                Socket.writeStringUTF8(socket, string: "Content-Length: \(nsdata.length)\r\n")
+            }
         } else {
             Socket.writeStringUTF8(socket, string: "Content-Length: 0\r\n")
         }