Skip to content

Instantly share code, notes, and snippets.

@nidx
Created May 22, 2018 18:58
Show Gist options
  • Select an option

  • Save nidx/2c2b03daaafe2aeba09f115c148cd0f1 to your computer and use it in GitHub Desktop.

Select an option

Save nidx/2c2b03daaafe2aeba09f115c148cd0f1 to your computer and use it in GitHub Desktop.
My Hack around range headers with swifter
import Foundation
import Swifter
public func fileHttpResponseWithRange(r: HttpRequest, data: Data) -> HttpResponse {
powerRanger:if let rangeHeader = r.headers["range"] {
let rangeExpression = try! NSRegularExpression(pattern: "bytes=(\\d*)-(\\d*)", options: .caseInsensitive)
let matches = rangeExpression.matches(in: rangeHeader, options: .anchored, range: NSRange(location: 0, length: rangeHeader.characters.count))
guard let match = matches.first, match.numberOfRanges == 3 else {
break powerRanger
}
let rangeStartString = (rangeHeader as NSString).substring(with: match.rangeAt(1))
let rangeEndString = (rangeHeader as NSString).substring(with: match.rangeAt(2))
guard let rangeStart = Int(rangeStartString), let rangeEnd = Int(rangeEndString) else {
break powerRanger
}
let subData = data.subdata(in: rangeStart..<(rangeEnd + 1))
let headers = ["Content-Range": "bytes \(rangeStartString)-\(rangeEndString)/\((data.count))"]
return .raw(206, "OK", headers, { writer in
try? writer.write(subData)
})
}
return .raw(200, "OK", [:], { writer in
try? writer.write(data)
})
}
public func shareFilesFromDirectoryWithRange(_ directoryPath: String, defaults: [String] = ["index.html", "default.html"]) -> ((HttpRequest) -> HttpResponse) {
return { r in
guard let fileRelativePath = r.params.first else {
return .notFound
}
if fileRelativePath.value.isEmpty {
for path in defaults {
if let file = try? (directoryPath + String.pathSeparator + path).openForReading() {
return .raw(200, "OK", [:], { writer in
try? writer.write(file)
file.close()
})
}
}
}
guard let fileExists = try? (directoryPath + String.pathSeparator + fileRelativePath.value).exists() else {
return .notFound
}
if fileExists {
guard let fileBody = NSData(contentsOfFile: directoryPath + String.pathSeparator + fileRelativePath.value) else {
return .internalServerError
}
return fileHttpResponseWithRange(r: r, data: fileBody as Data)
}
return .notFound
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment