| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- //
- // HttpRouter.swift
- // Swifter
- // Copyright (c) 2015 Damian Kołakowski. All rights reserved.
- //
- import Foundation
- public class HttpRouter {
-
- private var handlers: [(pattern: [String], handler: HttpServer.Handler)] = []
-
- public func routes() -> [String] {
- return handlers.map { $0.pattern.joinWithSeparator("/") }
- }
-
- public func register(path: String, handler: HttpServer.Handler) {
- handlers.append((path.split("/"), handler))
- handlers.sortInPlace { $0.0.pattern.count < $0.1.pattern.count }
- }
-
- public func unregister(path: String) {
- let p = path.split("/")
- handlers = handlers.filter { (pattern, handler) -> Bool in
- return pattern != p
- }
- }
-
- public func select(url: String) -> ([String: String], HttpServer.Handler)? {
- let urlTokens = url.split("/")
- for (pattern, handler) in handlers {
- if let params = matchParams(pattern, valueTokens: urlTokens) {
- return (params, handler)
- }
- }
- return nil
- }
-
- public func matchParams(patternTokens: [String], valueTokens: [String]) -> [String: String]? {
- var params = [String: String]()
- for index in 0..<valueTokens.count {
- if index >= patternTokens.count {
- return nil
- }
- let patternToken = patternTokens[index]
- let valueToken = valueTokens[index]
- if patternToken.isEmpty {
- if patternToken != valueToken {
- return nil
- }
- }
- if patternToken.characters.first == ":" {
- params[patternToken.substringFromIndex(patternToken.characters.startIndex.successor())] = valueToken
- } else {
- if patternToken != valueToken {
- return nil
- }
- }
- }
- return params
- }
- }
|