0001
0008 import Foundation
0009
0010 extension HttpHandlers {
0011
0012 public class func shareFilesFromDirectory| DemoServer.swift:16 | server["/public/:path"] = HttpHandlers.shareFilesFromDirectory(publicDir) |
(directoryPath: String) -> (HttpRequest -> HttpResponse) {
0013 return { r in
0014 guard let fileRelativePath = r.params.first else {
0015 return .NotFound
0016 }
0017 let absolutePath = directoryPath + "/" + fileRelativePath.1
0018 guard let file = try? File.openForReading(absolutePath) else {
0019 return .NotFound
0020 }
0021 return .RAW(200, "OK", [:], { writer in
0022 var buffer = [UInt8](count: 64, repeatedValue: 0)
0023 while let count = try? file.read(&buffer) where count > 0 {
0024 writer.write(buffer[0..<count])
0025 }
0026 file.close()
0027 })
0028 }
0029 }
0030
0031 private static let rangePrefix| HttpHandlers+Files.swift:48 | guard rangeHeader.hasPrefix(HttpHandlers.rangePrefix) else { |
| HttpHandlers+Files.swift:55 | let rangeString = rangeHeader.substringFromIndex(rangeHeader.startIndex.advancedBy(HttpHandlers.rangePrefix.characters.count)) |
= "bytes="
0032
0033 public class func directory(dir: String) -> (HttpRequest -> HttpResponse) {
0034 return { r in
0035
0036 guard let localPath = r.params.first else {
0037 return HttpResponse.NotFound
0038 }
0039
0040 let filesPath = dir + "/" + localPath.1
0041
0042 guard let fileBody = NSData(contentsOfFile: filesPath) else {
0043 return HttpResponse.NotFound
0044 }
0045
0046 if let rangeHeader = r.headers["range"] {
0047
0048 guard rangeHeader.hasPrefix(HttpHandlers.rangePrefix) else {
0049 return .BadRequest(.Text("Invalid value of 'Range' header: \(r.headers["range"])"))
0050 }
0051
0052 #if os(Linux)
0053 let rangeString = rangeHeader.substringFromIndex(HttpHandlers.rangePrefix.characters.count)
0054 #else
0055 let rangeString = rangeHeader.substringFromIndex(rangeHeader.startIndex.advancedBy(HttpHandlers.rangePrefix.characters.count))
0056 #endif
0057
0058 let rangeStringExploded = rangeString.split("-")
0059
0060 guard rangeStringExploded.count == 2 else {
0061 return .BadRequest(.Text("Invalid value of 'Range' header: \(r.headers["range"])"))
0062 }
0063
0064 let startStr = rangeStringExploded[0]
0065 let endStr = rangeStringExploded[1]
0066
0067 guard let start = Int(startStr), end = Int(endStr) else {
0068 var array = [UInt8](count: fileBody.length, repeatedValue: 0)
0069 fileBody.getBytes(&array, length: fileBody.length)
0070 return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
0071 }
0072
0073 let chunkLength = end - start
0074 let chunkRange = NSRange(location: start, length: chunkLength + 1)
0075
0076 guard chunkRange.location + chunkRange.length <= fileBody.length else {
0077 return HttpResponse.RAW(416, "Requested range not satisfiable", nil, nil)
0078 }
0079
0080 let chunk = fileBody.subdataWithRange(chunkRange)
0081
0082 let headers = [ "Content-Range" : "bytes \(startStr)-\(endStr)/\(fileBody.length)" ]
0083
0084 var content = [UInt8](count: chunk.length, repeatedValue: 0)
0085 chunk.getBytes(&content, length: chunk.length)
0086 return HttpResponse.RAW(206, "Partial Content", headers, { $0.write(content) })
0087 } else {
0088 var content = [UInt8](count: fileBody.length, repeatedValue: 0)
0089 fileBody.getBytes(&content, length: fileBody.length)
0090 return HttpResponse.RAW(200, "OK", nil, { $0.write(content) })
0091 }
0092 }
0093 }
0094
0095 public class func directoryBrowser| DemoServer.swift:18 | server["/files/:path"] = HttpHandlers.directoryBrowser("/") |
(dir: String) -> (HttpRequest -> HttpResponse) {
0096 return { r in
0097 guard let (_, value) = r.params.first else {
0098 return HttpResponse.NotFound
0099 }
0100 let filePath = dir + "/" + value
0101 let fileManager = NSFileManager.defaultManager()
0102 var isDir: ObjCBool = false
0103 guard fileManager.fileExistsAtPath(filePath, isDirectory: &isDir) else {
0104 return HttpResponse.NotFound
0105 }
0106 if isDir {
0107 do {
0108 let files = try fileManager.contentsOfDirectoryAtPath(filePath)
0109 var response = "<h3>\(filePath)</h3></br><table>"
0110 response += files.map({ "<tr><td><a href=\"\(r.path)/\($0)\">\($0)</a></td></tr>"}).joinWithSeparator("")
0111 response += "</table>"
0112 return HttpResponse.OK(.Html(response))
0113 } catch {
0114 return HttpResponse.NotFound
0115 }
0116 } else {
0117 if let content = NSData(contentsOfFile: filePath) {
0118 var array = [UInt8](count: content.length, repeatedValue: 0)
0119 content.getBytes(&array, length: content.length)
0120 return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
0121 }
0122 return HttpResponse.NotFound
0123 }
0124 }
0125 }
0126 }