0001    //
0002    //  HttpHandlers+Files.swift
0003    //  Swifter
0004    //
0005    //  Copyright (c) 2014-2016 Damian KoĊ‚akowski. All rights reserved.
0006    //
0007    
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 }