Kaynağa Gözat

Middleware logic moved to HttpServer class.

Damian Kołakowski 10 yıl önce
ebeveyn
işleme
78ad4080da

+ 5 - 0
Sources/Swifter/DemoServer.swift

@@ -127,6 +127,11 @@ public func demoServer(_ publicDir: String) -> HttpServer {
         return .MovedPermanently("https://github.com/404")
     }
     
+    server.middleware.append({ r in
+        print("\(r.method) - \(r.path)")
+        return nil
+    })
+    
     server.GET["/scopes-demo"] = HttpHandlers.scopes {
         html {
             lang = "en"

+ 10 - 3
Sources/Swifter/HttpServer.swift

@@ -60,15 +60,22 @@ public class HttpServer: HttpServerIO {
     }
     
     public var notFoundHandler: ((HttpRequest) -> HttpResponse)?
+    
+    public var middleware = Array<(HttpRequest) -> HttpResponse?>()
 
-    override public func dispatch(_ method: String, path: String) -> ([String:String], (HttpRequest) -> HttpResponse) {
-        if let result = router.route(method, path: path) {
+    override public func dispatch(_ request: HttpRequest) -> ([String:String], (HttpRequest) -> HttpResponse) {
+        for layer in middleware {
+            if let response = layer(request) {
+                return ([:], { _ in response })
+            }
+        }
+        if let result = router.route(request.method, path: request.path) {
             return result
         }
         if let notFoundHandler = self.notFoundHandler {
             return ([:], notFoundHandler)
         }
-        return super.dispatch(method, path: path)
+        return super.dispatch(request)
     }
     
     public struct MethodRoute {

+ 7 - 20
Sources/Swifter/HttpServerIO.swift

@@ -17,8 +17,6 @@ public class HttpServerIO {
     private var listenSocket: Socket = Socket(socketFileDescriptor: -1)
     private var clientSockets: Set<Socket> = []
     private let clientSocketsLock = Lock()
-        
-    public var middleware = Array<(HttpRequest) -> HttpResponse?>()
     
     @available(OSX 10.10, *)
     public func start(_ listenPort: in_port_t = 8080, forceIPv4: Bool = false) throws {
@@ -50,7 +48,7 @@ public class HttpServerIO {
         }
     }
     
-    public func dispatch(_ method: String, path: String) -> ([String: String], (HttpRequest) -> HttpResponse) {
+    public func dispatch(_ request: HttpRequest) -> ([String: String], (HttpRequest) -> HttpResponse) {
         return ([:], { _ in HttpResponse.NotFound })
     }
     
@@ -58,21 +56,19 @@ public class HttpServerIO {
         let address = try? socket.peername()
         let parser = HttpParser()
         while let request = try? parser.readHttpRequest(socket) {
+            let request = request
+            let (params, handler) = self.dispatch(request)
             request.address = address
-            var response = askMiddlewareForResponse(request)
-            if response == nil {
-                let (params, handler) = self.dispatch(request.method, path: request.path)
-                request.params = params
-                response = handler(request)
-            }
+            request.params = params;
+            let response = handler(request)
             var keepConnection = parser.supportsKeepAlive(request.headers)
             do {
-                keepConnection = try self.respond(socket, response: response!, keepAlive: keepConnection)
+                keepConnection = try self.respond(socket, response: response, keepAlive: keepConnection)
             } catch {
                 print("Failed to send response: \(error)")
                 break
             }
-            if let session = response!.socketSession() {
+            if let session = response.socketSession() {
                 session(socket)
                 break
             }
@@ -80,15 +76,6 @@ public class HttpServerIO {
         }
         socket.release()
     }
-
-    private func askMiddlewareForResponse(_ request: HttpRequest) -> HttpResponse? {
-        for layer in middleware {
-            if let response = layer(request) {
-                return response
-            }
-        }
-        return nil
-    }
     
     private func lock(_ handle: Lock, closure: () -> ()) {
         handle.lock()