Selaa lähdekoodia

Router allows to consume ending path segments as a value for the last parameter.

Damian Kołakowski 10 vuotta sitten
vanhempi
sitoutus
25e9da7acb

+ 1 - 1
Sources/DemoServer.swift

@@ -13,7 +13,7 @@ public func demoServer(publicDir: String?) -> HttpServer {
         server["/resources/:file"] = HttpHandlers.directory(publicDir)
     }
     
-    server["/files/:path"] = HttpHandlers.directoryBrowser("~/")
+    server["/files/:path"] = HttpHandlers.directoryBrowser("/")
 
     server["/"] = { r in
         var listPage = "Available services:<br><ul>"

+ 17 - 20
Sources/HttpHandlers.swift

@@ -10,10 +10,11 @@ public class HttpHandlers {
     
     private static let rangePrefix = "bytes="
     
+    
     public class func directory(dir: String) -> (HttpRequest -> HttpResponse) {
-        return { request in
+        return { r in
             
-            guard let localPath = request.params.first else {
+            guard let localPath = r.params.first else {
                 return HttpResponse.NotFound
             }
             
@@ -23,7 +24,7 @@ public class HttpHandlers {
                 return HttpResponse.NotFound
             }
             
-            if let rangeHeader = request.headers["range"] {
+            if let rangeHeader = r.headers["range"] {
                 
                 guard rangeHeader.hasPrefix(HttpHandlers.rangePrefix) else {
                     return HttpResponse.BadRequest
@@ -35,6 +36,7 @@ public class HttpHandlers {
                 let rangeString = rangeHeader.substringFromIndex(rangeHeader.startIndex.advancedBy(HttpHandlers.rangePrefix.characters.count))
 #endif
                 let rangeStringExploded = rangeString.split("-")
+                
                 guard rangeStringExploded.count == 2 else {
                     return HttpResponse.BadRequest
                 }
@@ -48,30 +50,25 @@ public class HttpHandlers {
                     return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
                 }
                 
-                let length = end - start
-                let range = NSRange(location: start, length: length + 1)
+                let chunkLength = end - start
+                let chunkRange = NSRange(location: start, length: chunkLength + 1)
                 
-                guard range.location + range.length <= fileBody.length else {
+                guard chunkRange.location + chunkRange.length <= fileBody.length else {
                     return HttpResponse.RAW(416, "Requested range not satisfiable", nil, nil)
                 }
                 
-                let subData = fileBody.subdataWithRange(range)
+                let chunk = fileBody.subdataWithRange(chunkRange)
                 
-                let headers = [
-                    "Content-Range" : "bytes \(startStr)-\(endStr)/\(fileBody.length)"
-                ]
+                let headers = [ "Content-Range" : "bytes \(startStr)-\(endStr)/\(fileBody.length)" ]
                 
-                var array = [UInt8](count: subData.length, repeatedValue: 0)
-                subData.getBytes(&array, length: subData.length)
-                return HttpResponse.RAW(206, "Partial Content", headers, { $0.write(array) })
-                
-            }
-            else {
-                var array = [UInt8](count: fileBody.length, repeatedValue: 0)
-                fileBody.getBytes(&array, length: fileBody.length)
-                return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
+                var content = [UInt8](count: chunk.length, repeatedValue: 0)
+                chunk.getBytes(&content, length: chunk.length)
+                return HttpResponse.RAW(206, "Partial Content", headers, { $0.write(content) })
+            } else {
+                var content = [UInt8](count: fileBody.length, repeatedValue: 0)
+                fileBody.getBytes(&content, length: fileBody.length)
+                return HttpResponse.RAW(200, "OK", nil, { $0.write(content) })
             }
-            
         }
     }
     

+ 5 - 0
Sources/HttpRouter.swift

@@ -81,6 +81,11 @@ public class HttpRouter {
         }
         let variableNodes = node.nodes.filter { $0.0.characters.first == ":" }
         if let variableNode = variableNodes.first {
+            if variableNode.1.nodes.count == 0 {
+                // if it's the last element of the pattern and it's a variable, stop the routing.
+                params[variableNode.0] = pathToken + "/" + generator.joinWithSeparator("/")
+                return variableNode.1.handler
+            }
             params[variableNode.0] = pathToken
             return findHandler(&node.nodes[variableNode.0]!, params: &params, generator: &generator)
         }

+ 1 - 1
Sources/HttpServer.swift

@@ -24,7 +24,7 @@ public class HttpServer: HttpServerIO {
     }
     
     public var DELETE, UPDATE, HEAD, POST, GET, PUT : MethodRoute;
-    
+
     public subscript(path: String) -> (HttpRequest -> HttpResponse)? {
         set {
             router.register(nil, path: path, handler: newValue)

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


+ 56 - 8
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -1585,15 +1585,15 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            shouldBeEnabled = "No"
+            shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers.swift"
-            timestampString = "473260739.716478"
+            timestampString = "475004924.489602"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "80"
-            endingLineNumber = "80"
+            startingLineNumber = "81"
+            endingLineNumber = "81"
             landmarkName = "directoryBrowser(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1601,15 +1601,15 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            shouldBeEnabled = "No"
+            shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "Sources/HttpHandlers.swift"
-            timestampString = "473260841.9639"
+            timestampString = "475004924.489602"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "81"
-            endingLineNumber = "81"
+            startingLineNumber = "82"
+            endingLineNumber = "82"
             landmarkName = "directoryBrowser(_:)"
             landmarkType = "5">
          </BreakpointContent>
@@ -1692,5 +1692,53 @@
             endingLineNumber = "18">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Sources/HttpHandlers.swift"
+            timestampString = "475004915.267348"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "17"
+            endingLineNumber = "17"
+            landmarkName = "directory(_:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Sources/HttpHandlers.swift"
+            timestampString = "475004916.729181"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "21"
+            endingLineNumber = "21"
+            landmarkName = "directory(_:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Sources/HttpRouter.swift"
+            timestampString = "475005971.689848"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "85"
+            endingLineNumber = "85"
+            landmarkName = "findHandler(_:params:generator:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>