瀏覽代碼

Introduced HttpRequest object.

Damian Kołakowski 11 年之前
父節點
當前提交
4cabd9e992

+ 3 - 3
Common/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) -> HttpRequest? { //(String, String, Dictionary<String, String>)? {
         if let statusLine = nextLine(socket, error: error) {
             let statusTokens = split(statusLine, { $0 == " " })
             println(statusTokens)
@@ -24,7 +24,7 @@ class HttpParser {
             let method = statusTokens[0]
             let path = statusTokens[1]
             if let headers = nextHeaders(socket, error: error) {
-                return (path, method, headers)
+                return HttpRequest(url: path, method: method, headers: headers)
             }
         }
         return nil
@@ -51,7 +51,7 @@ class HttpParser {
         return nil
     }
 
-    var recvBuffer: [UInt8] = [UInt8](count: 1024, repeatedValue: 0)
+    var recvBuffer = [UInt8](count: 1024, repeatedValue: 0)
     var recvBufferSize: Int = 0
     var recvBufferOffset: Int = 0
     

+ 15 - 0
Common/HttpRequest.swift

@@ -0,0 +1,15 @@
+//
+//  HttpRequest.swift
+//  Swifter
+//
+//  Created by Damian Kolakowski on 19/08/14.
+//  Copyright (c) 2014 Damian Kołakowski. All rights reserved.
+//
+
+import Foundation
+
+struct HttpRequest {
+    let url: String
+    let method: String
+    let headers: Dictionary<String, String>
+}

+ 8 - 8
Common/HttpServer.swift

@@ -9,7 +9,7 @@ import Foundation
 
 class HttpServer
 {
-    typealias Handler = (String, String, Dictionary<String,String>) -> HttpResponse
+    typealias Handler = HttpRequest -> HttpResponse
     
     var handlers: [(expression: NSRegularExpression, handler: Handler)] = []
     var acceptSocket: CInt = -1
@@ -42,9 +42,9 @@ class HttpServer
         }
         set ( directoryPath ) {
             if let regex = NSRegularExpression.regularExpressionWithPattern(path, options: expressionOptions, error: nil) {
-                handlers.append(expression: regex, handler: { (method, path, headers) in
-                    let result = regex.firstMatchInString(path, options: self.matchingOptions, range: NSMakeRange(0, path.lengthOfBytesUsingEncoding(NSASCIIStringEncoding)))
-					let nsPath: NSString = path
+                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
                         .stringByAppendingPathComponent(nsPath.substringWithRange(result.rangeAtIndex(1)))
 					if let fileBody = String.stringWithContentsOfFile(filesPath, encoding: NSASCIIStringEncoding, error: nil) {
@@ -70,10 +70,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) {
-                            let keepAlive = parser.supportsKeepAlive(headers)
-                            if let handler: Handler = self[path] {
-                                HttpServer.writeResponse(socket, response: handler(method, path, headers), keepAlive: keepAlive)
+                        while let request = parser.nextHttpRequest(socket) {
+                            let keepAlive = parser.supportsKeepAlive(request.headers)
+                            if let handler: Handler = self[request.url] {
+                                HttpServer.writeResponse(socket, response: handler(request), keepAlive: keepAlive)
                             } else {
                                 HttpServer.writeResponse(socket, response: HttpResponse.NotFound, keepAlive: keepAlive)
                             }

+ 7 - 0
Swifter.xcodeproj/project.pbxproj

@@ -22,6 +22,8 @@
 		7CA4815519A2EED00030B30D /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814D19A2EED00030B30D /* Socket.swift */; };
 		7CA4815819A2EF2B0030B30D /* test.json in Resources */ = {isa = PBXBuildFile; fileRef = 7CA4815719A2EF2B0030B30D /* test.json */; };
 		7CA4815919A2EF560030B30D /* test.json in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7CA4815719A2EF2B0030B30D /* test.json */; };
+		7CA4815B19A2F6A60030B30D /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4815A19A2F6A60030B30D /* HttpRequest.swift */; };
+		7CA4815C19A2F6A60030B30D /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4815A19A2F6A60030B30D /* HttpRequest.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -51,6 +53,7 @@
 		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>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -122,6 +125,7 @@
 		7CA4814919A2EED00030B30D /* Common */ = {
 			isa = PBXGroup;
 			children = (
+				7CA4815A19A2F6A60030B30D /* HttpRequest.swift */,
 				7CA4814A19A2EED00030B30D /* HttpParser.swift */,
 				7CA4814B19A2EED00030B30D /* HttpResponse.swift */,
 				7CA4814C19A2EED00030B30D /* HttpServer.swift */,
@@ -234,6 +238,7 @@
 				7CA4815419A2EED00030B30D /* Socket.swift in Sources */,
 				7CA4815219A2EED00030B30D /* HttpServer.swift in Sources */,
 				7CA4814E19A2EED00030B30D /* HttpParser.swift in Sources */,
+				7CA4815B19A2F6A60030B30D /* HttpRequest.swift in Sources */,
 				7C839B7419422CFF003A6950 /* AppDelegate.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -247,6 +252,7 @@
 				7CA4815519A2EED00030B30D /* Socket.swift in Sources */,
 				7CA4815319A2EED00030B30D /* HttpServer.swift in Sources */,
 				7CA4813E19A2EA8D0030B30D /* main.swift in Sources */,
+				7CA4815C19A2F6A60030B30D /* HttpRequest.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -420,6 +426,7 @@
 				7CA4814019A2EA8D0030B30D /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
 		};
 /* End XCConfigurationList section */
 	};

二進制
Swifter.xcodeproj/project.xcworkspace/xcuserdata/damiankolakowski.xcuserdatad/UserInterfaceState.xcuserstate


+ 47 - 1
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -246,7 +246,7 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Common/HttpServer.swift"
-            timestampString = "430108882.465714"
+            timestampString = "430111339.558837"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "46"
@@ -255,5 +255,51 @@
             landmarkType = "3">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/HttpResponse.swift"
+            timestampString = "430110038.828632"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "35"
+            endingLineNumber = "35"
+            landmarkName = "data()"
+            landmarkType = "5">
+            <Locations>
+               <Location
+                  shouldBeEnabled = "No"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "SwifterOSX.HttpResponseBody.data (SwifterOSX.HttpResponseBody)() -&gt; Swift.Optional&lt;Swift.String&gt;"
+                  moduleName = "SwifterOSX"
+                  urlString = "file:///Users/damiankolakowski/Desktop/Swifter/Common/HttpResponse.swift"
+                  timestampString = "430110038.833456"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "35"
+                  endingLineNumber = "35"
+                  offsetFromSymbolStart = "3084">
+               </Location>
+               <Location
+                  shouldBeEnabled = "No"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "SwifterOSX.HttpResponseBody.data (SwifterOSX.HttpResponseBody)() -&gt; Swift.Optional&lt;Swift.String&gt;"
+                  moduleName = "SwifterOSX"
+                  urlString = "file:///Users/damiankolakowski/Desktop/Swifter/Common/HttpResponse.swift"
+                  timestampString = "430110038.833645"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "35"
+                  endingLineNumber = "35"
+                  offsetFromSymbolStart = "3643">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>

+ 8 - 8
Swifter/AppDelegate.swift

@@ -19,31 +19,31 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         if let resDir = NSBundle.mainBundle().resourcePath {
             server["/resources/(.+)"] = resDir
         }
-        server["/test"] = { (method, url, headers) in
+        server["/test"] = { request in
             var headersInfo = ""
-            for (name, value) in headers {
+            for (name, value) in request.headers {
                 headersInfo += "\(name) : \(value)<br>"
             }
-            let response = "<html><body>Url: \(url)<br>Method: \(method)<br>\(headersInfo)</body></html>"
+            let response = "<html><body>Url: \(request.url)<br>Method: \(request.method)<br>\(headersInfo)</body></html>"
             return .OK(.RAW(response))
         }
-        server["/json"] = { (method, url, headers) in
+        server["/json"] = { request in
             return .OK(.JSON(["posts" : [[ "id" : 1, "message" : "hello world"],[ "id" : 2, "message" : "sample message"]], "new_updates" : false]))
         }
-        server["/redirect"] = { (method, url, headers) in
+        server["/redirect"] = { request in
             return .MovedPermanently("http://www.google.com")
         }
-        server["/long"] = { (method, url, headers) in
+        server["/long"] = { request in
             var longResponse = ""
             for k in 0..<1000 { longResponse += "(\(k)),->" }
             return .OK(.RAW(longResponse))
         }
-        server["/demo"] = { (method, url, headers) in
+        server["/demo"] = { request in
             return .OK(.RAW("<html><body><center><h2>Hello Swift</h2>" +
                 "<img src=\"https://devimages.apple.com.edgekey.net/swift/images/swift-hero_2x.png\"/><br>" +
                 "<h4>\(UIDevice().name), \(UIDevice().systemVersion)</h4></center></body></html>"))
         }
-        server["/"] = { (method, url, headers) in
+        server["/"] = { request in
             var listPage = "<html><body>Available services:<br><ul>"
             for item in self.server.routes() {
                 listPage += "<li><a href=\"\(item)\">\(item)</a></li>"

+ 8 - 8
SwifterOSX/main.swift

@@ -12,31 +12,31 @@ let server: HttpServer = HttpServer()
 
 server["/resources/(.+)"] = "~/"
 
-server["/test"] = { (method, url, headers) in
+server["/test"] = { request in
     var headersInfo = ""
-    for (name, value) in headers {
+    for (name, value) in request.headers {
         headersInfo += "\(name) : \(value)<br>"
     }
-    let response = "<html><body>Url: \(url)<br>Method: \(method)<br>\(headersInfo)</body></html>"
+    let response = "<html><body>Url: \(request.url)<br>Method: \(request.method)<br>\(headersInfo)</body></html>"
     return .OK(.RAW(response))
 }
-server["/json"] = { (method, url, headers) in
+server["/json"] = { request in
     return .OK(.JSON(["posts" : [[ "id" : 1, "message" : "hello world"],[ "id" : 2, "message" : "sample message"]], "new_updates" : false]))
 }
-server["/redirect"] = { (method, url, headers) in
+server["/redirect"] = { request in
     return .MovedPermanently("http://www.google.com")
 }
-server["/long"] = { (method, url, headers) in
+server["/long"] = { request in
     var longResponse = ""
     for k in 0..<1000 { longResponse += "(\(k)),->" }
     return .OK(.RAW(longResponse))
 }
-server["/demo"] = { (method, url, headers) in
+server["/demo"] = { request in
     return .OK(.RAW("<html><body><center><h2>Hello Swift</h2>" +
         "<img src=\"https://devimages.apple.com.edgekey.net/swift/images/swift-hero_2x.png\"/><br>" +
         "<h4>\(NSHost.currentHost().localizedName)</h4></center></body></html>"))
 }
-server["/"] = { (method, url, headers) in
+server["/"] = { request in
     var listPage = "<html><body>Available services:<br><ul>"
     for item in server.routes() {
         listPage += "<li><a href=\"\(item)\">\(item)</a></li>"