123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- //
- // HttpHandlers+Files.swift
- // Swifter
- //
- // Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.
- //
- import Foundation
- public func shareFile(_ path: String) -> ((HttpRequest) -> HttpResponse) {
- return { _ in
- if let file = try? path.openForReading() {
- let mimeType = path.mimeType()
- var responseHeader: [String: String] = ["Content-Type": mimeType]
-
- if let attr = try? FileManager.default.attributesOfItem(atPath: path),
- let fileSize = attr[FileAttributeKey.size] as? UInt64 {
- responseHeader["Content-Length"] = String(fileSize)
- }
- return .raw(200, "OK", responseHeader, { writer in
- try? writer.write(file)
- file.close()
- })
- }
- return .notFound()
- }
- }
- public func shareFilesFromDirectory(_ directoryPath: String, defaults: [String] = ["index.html", "default.html"]) -> ((HttpRequest) -> HttpResponse) {
- return { request in
- guard let fileRelativePath = request.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()
- })
- }
- }
- }
- let filePath = directoryPath + String.pathSeparator + fileRelativePath.value
- if let file = try? filePath.openForReading() {
- let mimeType = fileRelativePath.value.mimeType()
- var responseHeader: [String: String] = ["Content-Type": mimeType]
- if let attr = try? FileManager.default.attributesOfItem(atPath: filePath),
- let fileSize = attr[FileAttributeKey.size] as? UInt64 {
- responseHeader["Content-Length"] = String(fileSize)
- }
- return .raw(200, "OK", responseHeader, { writer in
- try? writer.write(file)
- file.close()
- })
- }
- return .notFound()
- }
- }
- public func directoryBrowser(_ dir: String) -> ((HttpRequest) -> HttpResponse) {
- return { request in
- guard let (_, value) = request.params.first else {
- return .notFound()
- }
- let filePath = dir + String.pathSeparator + value
- do {
- guard try filePath.exists() else {
- return .notFound()
- }
- if try filePath.directory() {
- var files = try filePath.files()
- files.sort(by: {$0.lowercased() < $1.lowercased()})
- return scopes {
- html {
- body {
- table(files) { file in
- tr {
- td {
- a {
- href = request.path + "/" + file
- inner = file
- }
- }
- }
- }
- }
- }
- }(request)
- } else {
- guard let file = try? filePath.openForReading() else {
- return .notFound()
- }
- return .raw(200, "OK", [:], { writer in
- try? writer.write(file)
- file.close()
- })
- }
- } catch {
- return HttpResponse.internalServerError(.text("Internal Server Error"))
- }
- }
- }
|