Browse Source

Merge pull request #70 from julien-c/master

Router: add way to unregister a path
Damian Kołakowski 10 năm trước cách đây
mục cha
commit
fcb28c8058

+ 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()

+ 2 - 2
Sources/Swifter/Socket.swift

@@ -25,7 +25,7 @@ enum SocketError: ErrorType {
     case RecvFailed(String)
 }
 
-public class Socket : Hashable {
+public class Socket : Hashable, Equatable {
     
     public class func tcpSocketForListen(port: in_port_t = 8080, maxPendingConnection: Int32 = SOMAXCONN) throws -> Socket {
         
@@ -209,5 +209,5 @@ public class Socket : Hashable {
 
 
 public func ==(socket1: Socket, socket2: Socket) -> Bool {
-    return socket1.hashValue == socket2.hashValue
+    return socket1.socketFileDescriptor == socket2.socketFileDescriptor
 }