Files.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //
  2. // HttpHandlers+Files.swift
  3. // Swifter
  4. //
  5. // Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. public func shareFile(_ path: String) -> ((HttpRequest) -> HttpResponse) {
  9. return { _ in
  10. if let file = try? path.openForReading() {
  11. return .raw(200, "OK", [:], { writer in
  12. try? writer.write(file)
  13. file.close()
  14. })
  15. }
  16. return .notFound
  17. }
  18. }
  19. public func shareFilesFromDirectory(_ directoryPath: String, defaults: [String] = ["index.html", "default.html"]) -> ((HttpRequest) -> HttpResponse) {
  20. return { request in
  21. guard let fileRelativePath = request.params.first else {
  22. return .notFound
  23. }
  24. if fileRelativePath.value.isEmpty {
  25. for path in defaults {
  26. if let file = try? (directoryPath + String.pathSeparator + path).openForReading() {
  27. return .raw(200, "OK", [:], { writer in
  28. try? writer.write(file)
  29. file.close()
  30. })
  31. }
  32. }
  33. }
  34. let filePath = directoryPath + String.pathSeparator + fileRelativePath.value
  35. if let file = try? filePath.openForReading() {
  36. let mimeType = fileRelativePath.value.mimeType()
  37. var responseHeader: [String: String] = ["Content-Type": mimeType]
  38. if let attr = try? FileManager.default.attributesOfItem(atPath: filePath),
  39. let fileSize = attr[FileAttributeKey.size] as? UInt64 {
  40. responseHeader["Content-Length"] = String(fileSize)
  41. }
  42. return .raw(200, "OK", responseHeader, { writer in
  43. try? writer.write(file)
  44. file.close()
  45. })
  46. }
  47. return .notFound
  48. }
  49. }
  50. public func directoryBrowser(_ dir: String) -> ((HttpRequest) -> HttpResponse) {
  51. return { request in
  52. guard let (_, value) = request.params.first else {
  53. return HttpResponse.notFound
  54. }
  55. let filePath = dir + String.pathSeparator + value
  56. do {
  57. guard try filePath.exists() else {
  58. return .notFound
  59. }
  60. if try filePath.directory() {
  61. var files = try filePath.files()
  62. files.sort(by: {$0.lowercased() < $1.lowercased()})
  63. return scopes {
  64. html {
  65. body {
  66. table(files) { file in
  67. tr {
  68. td {
  69. a {
  70. href = request.path + "/" + file
  71. inner = file
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }
  78. }(request)
  79. } else {
  80. guard let file = try? filePath.openForReading() else {
  81. return .notFound
  82. }
  83. return .raw(200, "OK", [:], { writer in
  84. try? writer.write(file)
  85. file.close()
  86. })
  87. }
  88. } catch {
  89. return HttpResponse.internalServerError
  90. }
  91. }
  92. }