Quellcode durchsuchen

Coding style + add way to unregister a path

Julien Chaumond vor 10 Jahren
Ursprung
Commit
87c3da1eb6
2 geänderte Dateien mit 23 neuen und 11 gelöschten Zeilen
  1. 10 3
      Sources/Swifter/HttpRouter.swift
  2. 13 8
      Sources/Swifter/HttpServer.swift

+ 10 - 3
Sources/Swifter/HttpRouter.swift

@@ -15,11 +15,18 @@ public class HttpRouter {
     }
     
     public func register(path: String, handler: HttpServer.Handler) {
-        handlers.append((path.split("/"), handler));
+        handlers.append((path.split("/"), handler))
         handlers.sortInPlace { $0.0.pattern.count < $0.1.pattern.count }
     }
     
-    public func select(url:String) -> ([String:String], HttpServer.Handler)? {
+    public func unregister(path: String) {
+        let p = path.split("/")
+        handlers = handlers.filter { (pattern, handler) -> Bool in
+            return pattern != p
+        }
+    }
+    
+    public func select(url: String) -> ([String: String], HttpServer.Handler)? {
         let urlTokens = url.split("/")
         for (pattern, handler) in handlers {
             if let params = matchParams(pattern, valueTokens: urlTokens) {
@@ -38,7 +45,7 @@ public class HttpRouter {
             let patternToken = patternTokens[index]
             let valueToken = valueTokens[index]
             if patternToken.isEmpty {
-                if  patternToken != valueToken {
+                if patternToken != valueToken {
                     return nil
                 }
             }

+ 13 - 8
Sources/Swifter/HttpServer.swift

@@ -6,8 +6,8 @@
 
 import Foundation
 
-public class HttpServer
-{
+public class HttpServer {
+    
     static let VERSION = "1.0.2";
     
     public typealias Handler = HttpRequest -> HttpResponse
@@ -20,22 +20,27 @@ public class HttpServer
     
     public init() { }
     
-    public subscript (path: String) -> Handler? {
+    public subscript(path: String) -> Handler? {
         set {
-            router.register(path, handler: newValue!)
+            if let newValue = newValue {
+                router.register(path, handler: newValue)
+            }
+            else {
+                router.unregister(path)
+            }
         }
         get {
             return nil
         }
     }
     
-    public var routes:[String] {
+    public var routes: [String] {
         return router.routes()
     }
     
     public func start(listenPort: in_port_t = 8080) throws {
-        self.stop()
-        self.listenSocket = try Socket.tcpSocketForListen(listenPort)
+        stop()
+        listenSocket = try Socket.tcpSocketForListen(listenPort)
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
             while let socket = try? self.listenSocket.acceptClientSocket() {
                 HttpServer.lock(self.clientSocketsLock) {
@@ -72,7 +77,7 @@ public class HttpServer
     }
 
     public func stop() {
-        self.listenSocket.release()
+        listenSocket.release()
         HttpServer.lock(self.clientSocketsLock) {
             for socket in self.clientSockets {
                 socket.shutdwn()