HttpRouter.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. params[patternToken.substringFromIndex(patternToken.characters.startIndex.successor())] = valueToken
  46. } else {
  47. if patternToken != valueToken {
  48. return nil
  49. }
  50. }
  51. }
  52. return params
  53. }
  54. }