ソースを参照

Simplified client sockets accept loop.

Damian Kołakowski 12 年 前
コミット
f2ad3f0f79

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


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

@@ -30,7 +30,71 @@
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "20"
-            endingLineNumber = "20">
+            endingLineNumber = "20"
+            landmarkName = "application(_:didFinishLaunchingWithOptions:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Swifter/HttpParser.swift"
+            timestampString = "424733642.086281"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "18"
+            endingLineNumber = "18"
+            landmarkName = "nextHttpRequest(_:error:)"
+            landmarkType = "5">
+            <Locations>
+               <Location
+                  shouldBeEnabled = "No"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "Swifter.HttpParser.(nextHttpRequest (Swifter.HttpParser) -&gt; (Swift.Int32, error : Swift.AutoreleasingUnsafePointer&lt;Swift.Optional&lt;ObjectiveC.NSError&gt;&gt;) -&gt; Swift.Optional&lt;(Swift.String, Swift.Dictionary&lt;Swift.String, Swift.String&gt;)&gt;).(closure #1)"
+                  moduleName = "Swifter"
+                  urlString = "file:///Users/damiankolakowski/Desktop/Swifter/Swifter/HttpParser.swift"
+                  timestampString = "424733433.118798"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "18"
+                  endingLineNumber = "18"
+                  offsetFromSymbolStart = "19">
+               </Location>
+               <Location
+                  shouldBeEnabled = "No"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "reabstraction thunk helper from @callee_owned (@owned Swift.Character) -&gt; (@unowned Swift.Bool) to @callee_owned (@in Swift.Character) -&gt; (@out Swift.Bool)"
+                  moduleName = "Swifter"
+                  urlString = "file:///Users/damiankolakowski/Desktop/Swifter/Swifter/HttpParser.swift"
+                  timestampString = "424733433.119056"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "18"
+                  endingLineNumber = "18"
+                  offsetFromSymbolStart = "21">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Swifter/HttpParser.swift"
+            timestampString = "424734160.444636"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "25"
+            endingLineNumber = "25"
+            landmarkName = "nextHttpRequest(_:error:)"
+            landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
    </Breakpoints>

+ 1 - 1
Swifter/AppDelegate.swift

@@ -43,7 +43,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
                 "<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>" +
-                "<iframe src=\"/demo2\"></iframe><iframe src=\"/hello\"></iframe></body></html>"
+                "<iframe src=\"/routes\"></iframe><iframe src=\"/hello\"></iframe></body></html>"
             return .OK(demoPage)
         }
         

+ 4 - 2
Swifter/HttpParser.swift

@@ -13,16 +13,18 @@ class HttpParser {
         return NSError.errorWithDomain("HttpParser", code: 0, userInfo:[NSLocalizedFailureReasonErrorKey : reason])
     }
     
-    func nextHttpRequest(socket: CInt, error:NSErrorPointer = nil) -> (String, Dictionary<String, String>)? {
+    func nextHttpRequest(socket: CInt, error:NSErrorPointer = nil) -> (String, String, Dictionary<String, String>)? {
         if let statusLine = nextLine(socket, error: error) {
             let statusTokens = split(statusLine, { $0 == " " })
+            println(statusTokens)
             if ( statusTokens.count < 3 ) {
                 if error { error.memory = HttpParser.err("Invalid status line: \(statusLine)") }
                 return nil
             }
+            let method = statusTokens[0]
             let path = statusTokens[1]
             if let headers = nextHeaders(socket, error: error) {
-                return (path, headers)
+                return (path, method, headers)
             }
         }
         return nil

+ 17 - 17
Swifter/HttpServer.swift

@@ -13,6 +13,7 @@ enum Response {
     case MovedPermanently(String)
     case BadRequest, Unauthorized, Forbidden, NotFound
     case InternalServerError
+    case Custom(Int,String)
 
     func statusCode() -> Int {
         switch self {
@@ -25,6 +26,7 @@ enum Response {
         case .Forbidden             : return 403
         case .NotFound              : return 404
         case .InternalServerError   : return 500
+        case .Custom(let code, _)   : return code
         }
     }
 
@@ -39,6 +41,7 @@ enum Response {
         case .Forbidden             : return "Forbidden"
         case .NotFound              : return "Not Found"
         case .InternalServerError   : return "Internal Server Error"
+        case .Custom(_,_)           : return "Custom"
         }
     }
     
@@ -86,25 +89,22 @@ class HttpServer
         if let socket = Socket.tcpForListen(port: listenPort, error: error) {
             acceptSocket = socket
             dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
-                while ( self.acceptSocket != -1 ) {
-                    if let socket = Socket.acceptClientSocket(self.acceptSocket) {
-                        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
-                            let parser = HttpParser()
-                            while let (path, headers) = parser.nextHttpRequest(socket) {
-                                let keepAlive = parser.supportsKeepAlive(headers)
-                                if let handler = self.handlers[path] {
-                                    HttpServer.writeResponse(socket, response: handler(), keepAlive: keepAlive)
-                                } else {
-                                    HttpServer.writeResponse(socket, response: Response.NotFound, keepAlive: keepAlive)
-                                }
-                                if !keepAlive { break }
+                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 = self.handlers[path] {
+                                HttpServer.writeResponse(socket, response: handler(), keepAlive: keepAlive)
+                            } else {
+                                HttpServer.writeResponse(socket, response: Response.NotFound, keepAlive: keepAlive)
                             }
-                            Socket.release(socket)
-                        });
-                    } else {
-                        self.releaseAcceptSocket()
-                    }
+                            if !keepAlive { break }
+                        }
+                        Socket.release(socket)
+                    });
                 }
+                self.releaseAcceptSocket()
             });
             return true
         }