HttpRouter.swift 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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 select(url:String) -> ([String:String], HttpServer.Handler)? {
  17. let urlTokens = url.split("/")
  18. for (pattern, handler) in handlers {
  19. if let params = matchParams(pattern, valueTokens: urlTokens) {
  20. return (params, handler)
  21. }
  22. }
  23. return nil
  24. }
  25. public func matchParams(patternTokens: [String], valueTokens: [String]) -> [String: String]? {
  26. var params = [String: String]()
  27. for index in 0..<valueTokens.count {
  28. if index >= patternTokens.count {
  29. return nil
  30. }
  31. let patternToken = patternTokens[index]
  32. let valueToken = valueTokens[index]
  33. if patternToken.isEmpty {
  34. if patternToken != valueToken {
  35. return nil
  36. }
  37. }
  38. if patternToken.characters.first == ":" {
  39. params[patternToken.substringFromIndex(patternToken.characters.startIndex.successor())] = valueToken
  40. } else {
  41. if patternToken != valueToken {
  42. return nil
  43. }
  44. }
  45. }
  46. return params
  47. }
  48. }