Bladeren bron

File system related handler moved to +files extension.

Damian Kołakowski 10 jaren geleden
bovenliggende
commit
f8d72d29dc

+ 104 - 0
Sources/HttpHandlers+Files.swift

@@ -0,0 +1,104 @@
+//
+//  HttpHandlers+Files.swift
+//  Swifter
+//
+//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.
+//
+
+import Foundation
+
+extension HttpHandlers {
+    
+    private static let rangePrefix = "bytes="
+    
+    public class func directory(dir: String) -> (HttpRequest -> HttpResponse) {
+        return { r in
+            
+            guard let localPath = r.params.first else {
+                return HttpResponse.NotFound
+            }
+            
+            let filesPath = dir + "/" + localPath.1
+            
+            guard let fileBody = NSData(contentsOfFile: filesPath) else {
+                return HttpResponse.NotFound
+            }
+            
+            if let rangeHeader = r.headers["range"] {
+                
+                guard rangeHeader.hasPrefix(HttpHandlers.rangePrefix) else {
+                    return HttpResponse.BadRequest
+                }
+                
+                #if os(Linux)
+                    let rangeString = rangeHeader.substringFromIndex(HttpHandlers.rangePrefix.characters.count)
+                #else
+                    let rangeString = rangeHeader.substringFromIndex(rangeHeader.startIndex.advancedBy(HttpHandlers.rangePrefix.characters.count))
+                #endif
+                let rangeStringExploded = rangeString.split("-")
+                
+                guard rangeStringExploded.count == 2 else {
+                    return HttpResponse.BadRequest
+                }
+                
+                let startStr = rangeStringExploded[0]
+                let endStr   = rangeStringExploded[1]
+                
+                guard let start = Int(startStr), end = Int(endStr) else {
+                    var array = [UInt8](count: fileBody.length, repeatedValue: 0)
+                    fileBody.getBytes(&array, length: fileBody.length)
+                    return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
+                }
+                
+                let chunkLength = end - start
+                let chunkRange = NSRange(location: start, length: chunkLength + 1)
+                
+                guard chunkRange.location + chunkRange.length <= fileBody.length else {
+                    return HttpResponse.RAW(416, "Requested range not satisfiable", nil, nil)
+                }
+                
+                let chunk = fileBody.subdataWithRange(chunkRange)
+                
+                let headers = [ "Content-Range" : "bytes \(startStr)-\(endStr)/\(fileBody.length)" ]
+                
+                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) })
+            }
+        }
+    }
+    
+    public class func directoryBrowser(dir: String) -> ( HttpRequest -> HttpResponse ) {
+        return { r in
+            if let (_, value) = r.params.first {
+                let filePath = dir + "/" + value
+                let fileManager = NSFileManager.defaultManager()
+                var isDir: ObjCBool = false
+                if fileManager.fileExistsAtPath(filePath, isDirectory: &isDir) {
+                    if isDir {
+                        do {
+                            let files = try fileManager.contentsOfDirectoryAtPath(filePath)
+                            var response = "<h3>\(filePath)</h3></br><table>"
+                            response += files.map({ "<tr><td><a href=\"\(r.path)/\($0)\">\($0)</a></td></tr>"}).joinWithSeparator("")
+                            response += "</table>"
+                            return HttpResponse.OK(.Html(response))
+                        } catch {
+                            return HttpResponse.NotFound
+                        }
+                    } else {
+                        if let fileBody = NSData(contentsOfFile: filePath) {
+                            var array = [UInt8](count: fileBody.length, repeatedValue: 0)
+                            fileBody.getBytes(&array, length: fileBody.length)
+                            return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
+                        }
+                    }
+                }
+            }
+            return HttpResponse.NotFound
+        }
+    }
+}

+ 1 - 94
Sources/HttpHandlers.swift

@@ -8,98 +8,5 @@
 import Foundation
 
 public class HttpHandlers {
-    
-    private static let rangePrefix = "bytes="
-    
-    
-    public class func directory(dir: String) -> (HttpRequest -> HttpResponse) {
-        return { r in
-            
-            guard let localPath = r.params.first else {
-                return HttpResponse.NotFound
-            }
-            
-            let filesPath = dir + "/" + localPath.1
-            
-            guard let fileBody = NSData(contentsOfFile: filesPath) else {
-                return HttpResponse.NotFound
-            }
-            
-            if let rangeHeader = r.headers["range"] {
-                
-                guard rangeHeader.hasPrefix(HttpHandlers.rangePrefix) else {
-                    return HttpResponse.BadRequest
-                }
-                
-#if os(Linux)
-                let rangeString = rangeHeader.substringFromIndex(HttpHandlers.rangePrefix.characters.count)
-#else
-                let rangeString = rangeHeader.substringFromIndex(rangeHeader.startIndex.advancedBy(HttpHandlers.rangePrefix.characters.count))
-#endif
-                let rangeStringExploded = rangeString.split("-")
-                
-                guard rangeStringExploded.count == 2 else {
-                    return HttpResponse.BadRequest
-                }
-                
-                let startStr = rangeStringExploded[0]
-                let endStr   = rangeStringExploded[1]
-                
-                guard let start = Int(startStr), end = Int(endStr) else {
-                    var array = [UInt8](count: fileBody.length, repeatedValue: 0)
-                    fileBody.getBytes(&array, length: fileBody.length)
-                    return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
-                }
-                
-                let chunkLength = end - start
-                let chunkRange = NSRange(location: start, length: chunkLength + 1)
-                
-                guard chunkRange.location + chunkRange.length <= fileBody.length else {
-                    return HttpResponse.RAW(416, "Requested range not satisfiable", nil, nil)
-                }
-                
-                let chunk = fileBody.subdataWithRange(chunkRange)
-                
-                let headers = [ "Content-Range" : "bytes \(startStr)-\(endStr)/\(fileBody.length)" ]
-                
-                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) })
-            }
-        }
-    }
-    
-    public class func directoryBrowser(dir: String) -> ( HttpRequest -> HttpResponse ) {
-        return { r in
-            if let (_, value) = r.params.first {
-                let filePath = dir + "/" + value
-                let fileManager = NSFileManager.defaultManager()
-                var isDir: ObjCBool = false
-                if fileManager.fileExistsAtPath(filePath, isDirectory: &isDir) {
-                    if isDir {
-                        do {
-                            let files = try fileManager.contentsOfDirectoryAtPath(filePath)
-                            var response = "<h3>\(filePath)</h3></br><table>"
-                            response += files.map({ "<tr><td><a href=\"\(r.path)/\($0)\">\($0)</a></td></tr>"}).joinWithSeparator("")
-                            response += "</table>"
-                            return HttpResponse.OK(.Html(response))
-                        } catch {
-                            return HttpResponse.NotFound
-                        }
-                    } else {
-                        if let fileBody = NSData(contentsOfFile: filePath) {
-                            var array = [UInt8](count: fileBody.length, repeatedValue: 0)
-                            fileBody.getBytes(&array, length: fileBody.length)
-                            return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
-                        }
-                    }
-                }
-            }
-            return HttpResponse.NotFound
-        }
-    }
+
 }

+ 6 - 0
Swifter.xcodeproj/project.pbxproj

@@ -40,6 +40,8 @@
 		7CA4815819A2EF2B0030B30D /* test.json in Resources */ = {isa = PBXBuildFile; fileRef = 7CA4815719A2EF2B0030B30D /* test.json */; };
 		7CA4815919A2EF560030B30D /* test.json in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7CA4815719A2EF2B0030B30D /* test.json */; };
 		7CB102E01A17381D00CBA3B4 /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 7CB102DF1A17381D00CBA3B4 /* logo.png */; };
+		7CC0F8C91C50136B00B65A94 /* HttpHandlers+Files.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0F8C81C50136B00B65A94 /* HttpHandlers+Files.swift */; };
+		7CC0F8CA1C50136B00B65A94 /* HttpHandlers+Files.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0F8C81C50136B00B65A94 /* HttpHandlers+Files.swift */; };
 		7CDAB8131BE2A1D400C8A977 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7CDAB80D1BE2A1D400C8A977 /* Main.storyboard */; };
 		7CDAB8141BE2A1D400C8A977 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7CDAB80F1BE2A1D400C8A977 /* Images.xcassets */; };
 		7CDAB8161BE2A1D400C8A977 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAB8111BE2A1D400C8A977 /* ViewController.swift */; };
@@ -104,6 +106,7 @@
 		7CA4813D19A2EA8D0030B30D /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
 		7CA4815719A2EF2B0030B30D /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = "<group>"; };
 		7CB102DF1A17381D00CBA3B4 /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = "<group>"; };
+		7CC0F8C81C50136B00B65A94 /* HttpHandlers+Files.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HttpHandlers+Files.swift"; sourceTree = "<group>"; };
 		7CDAB80C1BE2A1D400C8A977 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		7CDAB80E1BE2A1D400C8A977 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		7CDAB80F1BE2A1D400C8A977 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
@@ -225,6 +228,7 @@
 			isa = PBXGroup;
 			children = (
 				7C73C6941C2619E100AEF6CA /* DemoServer.swift */,
+				7CC0F8C81C50136B00B65A94 /* HttpHandlers+Files.swift */,
 				7C73C6951C2619E100AEF6CA /* HttpHandlers.swift */,
 				7C73C6961C2619E100AEF6CA /* HttpParser.swift */,
 				7C73C6971C2619E100AEF6CA /* HttpRequest.swift */,
@@ -422,6 +426,7 @@
 				7C73C6B01C261A2100AEF6CA /* HttpServer.swift in Sources */,
 				7C73C6B11C261A2100AEF6CA /* HttpServerIO.swift in Sources */,
 				7C73C6B21C261A2100AEF6CA /* Socket.swift in Sources */,
+				7CC0F8C91C50136B00B65A94 /* HttpHandlers+Files.swift in Sources */,
 				7C73C6B31C261A2100AEF6CA /* String+Misc.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -439,6 +444,7 @@
 				7C73C6BB1C261A2600AEF6CA /* HttpServer.swift in Sources */,
 				7C73C6BC1C261A2600AEF6CA /* HttpServerIO.swift in Sources */,
 				7C73C6BD1C261A2600AEF6CA /* Socket.swift in Sources */,
+				7CC0F8CA1C50136B00B65A94 /* HttpHandlers+Files.swift in Sources */,
 				7C73C6BE1C261A2600AEF6CA /* String+Misc.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

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


+ 0 - 64
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -1582,38 +1582,6 @@
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "Sources/HttpHandlers.swift"
-            timestampString = "475004924.489602"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "81"
-            endingLineNumber = "81"
-            landmarkName = "directoryBrowser(_:)"
-            landmarkType = "5">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "Sources/HttpHandlers.swift"
-            timestampString = "475004924.489602"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "82"
-            endingLineNumber = "82"
-            landmarkName = "directoryBrowser(_:)"
-            landmarkType = "5">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
@@ -1692,38 +1660,6 @@
             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