HttpRouter.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //
  2. // HttpRouter.swift
  3. // Swifter
  4. // Copyright (c) 2015 Damian Kołakowski. All rights reserved.
  5. //
  6. import Foundation
  7. public class HttpRouter {
  8. private var handlers: [(pattern: [String], handler: HttpServer.Handler)] = []
  9. public func routes() -> [String] {
  10. return handlers.map { $0.pattern.joinWithSeparator("/") }
  11. }
  12. public func register(path: String, handler: HttpServer.Handler) {
  13. handlers.append((path.split("/"), handler))
  14. handlers.sortInPlace { $0.0.pattern.count < $0.1.pattern.count }
  15. }
  16. public func unregister(path: String) {
  17. let p = path.split("/")
  18. handlers = handlers.filter { (pattern, handler) -> Bool in
  19. return pattern != p
  20. }
  21. }
  22. public func select(url: String) -> ([String: String], HttpServer.Handler)? {
  23. let urlTokens = url.split("/")
  24. for (pattern, handler) in handlers {
  25. if let params = matchParams(pattern, valueTokens: urlTokens) {
  26. return (params, handler)
  27. }
  28. }
  29. return nil
  30. }
  31. public func matchParams(patternTokens: [String], valueTokens: [String]) -> [String: String]? {
  32. var params = [String: String]()
  33. for index in 0..<valueTokens.count {
  34. if index >= patternTokens.count {
  35. return nil
  36. }
  37. let patternToken = patternTokens[index]
  38. let valueToken = valueTokens[index]
  39. if patternToken.isEmpty {
  40. if patternToken != valueToken {
  41. return nil
  42. }
  43. }
  44. if patternToken.characters.first == ":" {
  45. #if os(Linux)
  46. params[patternToken.substringFromIndex(1)] = valueToken
  47. #else
  48. params[patternToken.substringFromIndex(patternToken.characters.startIndex.successor())] = valueToken
  49. #endif
  50. } else {
  51. if patternToken != valueToken {
  52. return nil
  53. }
  54. }
  55. }
  56. return params
  57. }
  58. }