1
0

HttpServer.swift 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // HttpServer.swift
  3. // Swifter
  4. //
  5. // Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. open class HttpServer: HttpServerIO {
  9. public static let VERSION: String = {
  10. #if os(Linux)
  11. return "1.4.7"
  12. #else
  13. let bundle = Bundle(for: HttpServer.self)
  14. guard let version = bundle.infoDictionary?["CFBundleShortVersionString"] as? String else { return "Unspecified" }
  15. return version
  16. #endif
  17. }()
  18. private let router = HttpRouter()
  19. public override init() {
  20. self.DELETE = MethodRoute(method: "DELETE", router: router)
  21. self.PATCH = MethodRoute(method: "PATCH", router: router)
  22. self.HEAD = MethodRoute(method: "HEAD", router: router)
  23. self.POST = MethodRoute(method: "POST", router: router)
  24. self.GET = MethodRoute(method: "GET", router: router)
  25. self.PUT = MethodRoute(method: "PUT", router: router)
  26. self.delete = MethodRoute(method: "DELETE", router: router)
  27. self.patch = MethodRoute(method: "PATCH", router: router)
  28. self.head = MethodRoute(method: "HEAD", router: router)
  29. self.post = MethodRoute(method: "POST", router: router)
  30. self.get = MethodRoute(method: "GET", router: router)
  31. self.put = MethodRoute(method: "PUT", router: router)
  32. }
  33. public var DELETE, PATCH, HEAD, POST, GET, PUT: MethodRoute
  34. public var delete, patch, head, post, get, put: MethodRoute
  35. public subscript(path: String) -> ((HttpRequest) -> HttpResponse)? {
  36. set {
  37. router.register(nil, path: path, handler: newValue)
  38. }
  39. get { return nil }
  40. }
  41. public var routes: [String] {
  42. return router.routes()
  43. }
  44. public var notFoundHandler: ((HttpRequest) -> HttpResponse)?
  45. public var middleware = [(HttpRequest) -> HttpResponse?]()
  46. override open func dispatch(_ request: HttpRequest) -> ([String: String], (HttpRequest) -> HttpResponse) {
  47. for layer in middleware {
  48. if let response = layer(request) {
  49. return ([:], { _ in response })
  50. }
  51. }
  52. if let result = router.route(request.method, path: request.path) {
  53. return result
  54. }
  55. if let notFoundHandler = self.notFoundHandler {
  56. return ([:], notFoundHandler)
  57. }
  58. return super.dispatch(request)
  59. }
  60. public struct MethodRoute {
  61. public let method: String
  62. public let router: HttpRouter
  63. public subscript(path: String) -> ((HttpRequest) -> HttpResponse)? {
  64. set {
  65. router.register(method, path: path, handler: newValue)
  66. }
  67. get { return nil }
  68. }
  69. }
  70. }