0001 // 0002 // HttpRouter.swift 0003 // Swifter 0004 // 0005 // Copyright (c) 2014-2016 Damian KoĊakowski. All rights reserved. 0006 // 0007 0008 import Foundation 0009 0010 public class HttpRouter{ 0011 0012 private class Node
HttpServer.swift:14 private let router = HttpRouter()HttpServer.swift:55 public let router: HttpRouter{ 0013 var nodes
HttpRouter.swift:13 var nodes = [String: Node]()HttpRouter.swift:17 private var rootNode = Node()HttpRouter.swift:27 private func routesForNode(node: Node, prefix: String = "") -> [String] {HttpRouter.swift:67 private func inflate(inout node: Node, inout generator: IndexingGenerator<[String]>) -> Node {HttpRouter.swift:67 private func inflate(inout node: Node, inout generator: IndexingGenerator<[String]>) -> Node {HttpRouter.swift:72 var nextNode = Node()HttpRouter.swift:79 private func findHandler(inout node: Node, inout params: [String: String], inout generator: IndexingGenerator<[String]>) -> (HttpRequest -> HttpResponse)? {= [String: Node]() 0014 var handler
HttpRouter.swift:21 for (_, child) in rootNode.nodes {HttpRouter.swift:32 for (key, child) in node.nodes {HttpRouter.swift:69 if let _ = node.nodes[pathSegment] {HttpRouter.swift:70 return inflate(&node.nodes[pathSegment]!, generator: &generator)HttpRouter.swift:73 node.nodes[pathSegment] = nextNodeHttpRouter.swift:83 let variableNodes = node.nodes.filter { $0.0.characters.first == ":" }HttpRouter.swift:85 if variableNode.1.nodes.count == 0 {HttpRouter.swift:97 return findHandler(&node.nodes[variableNode.0]!, params: ¶ms, generator: &generator)HttpRouter.swift:99 if let _ = node.nodes[pathToken] {HttpRouter.swift:100 return findHandler(&node.nodes[pathToken]!, params: ¶ms, generator: &generator)HttpRouter.swift:102 if let _ = node.nodes["*"] {HttpRouter.swift:103 return findHandler(&node.nodes["*"]!, params: ¶ms, generator: &generator): (HttpRequest -> HttpResponse)? = nil 0015 } 0016 0017 private var rootNode
HttpRouter.swift:29 if let _ = node.handler {HttpRouter.swift:46 inflate(&rootNode, generator: &pathSegmentsGenerator).handler = handlerHttpRouter.swift:81 return node.handlerHttpRouter.swift:94 return variableNode.1.handler= Node() 0018 0019 public func routes
HttpRouter.swift:21 for (_, child) in rootNode.nodes {HttpRouter.swift:46 inflate(&rootNode, generator: &pathSegmentsGenerator).handler = handlerHttpRouter.swift:54 if let handler = findHandler(&rootNode, params: ¶ms, generator: &pathSegmentsGenerator) {HttpRouter.swift:61 if let handler = findHandler(&rootNode, params: ¶ms, generator: &pathSegmentsGenerator) {() -> [String] { 0020 var routes = [String]() 0021 for (_, child) in rootNode.nodes { 0022 routes.appendContentsOf(routesForNode(child)); 0023 } 0024 return routes 0025 } 0026 0027 private func routesForNode
HttpServer.swift:43 return router.routes();(node: Node, prefix: String = "") -> [String] { 0028 var result = [String]() 0029 if let _ = node.handler { 0030 result.append(prefix) 0031 } 0032 for (key, child) in node.nodes { 0033 result.appendContentsOf(routesForNode(child, prefix: prefix + "/" + key)); 0034 } 0035 return result 0036 } 0037 0038 public func register
HttpRouter.swift:22 routes.appendContentsOf(routesForNode(child));HttpRouter.swift:33 result.appendContentsOf(routesForNode(child, prefix: prefix + "/" + key));(method: String?, path: String, handler: (HttpRequest -> HttpResponse)?) { 0039 var pathSegments = stripQuery(path).split("/") 0040 if let method = method { 0041 pathSegments.insert(method, atIndex: 0) 0042 } else { 0043 pathSegments.insert("*", atIndex: 0) 0044 } 0045 var pathSegmentsGenerator = pathSegments.generate() 0046 inflate(&rootNode, generator: &pathSegmentsGenerator).handler = handler 0047 } 0048 0049 public func route
HttpServer.swift:37 router.register(nil, path: path, handler: newValue)HttpServer.swift:58 router.register(method, path: path, handler: newValue)(method: String?, path: String) -> ([String: String], HttpRequest -> HttpResponse)? { 0050 if let method = method { 0051 let pathSegments = (method + "/" + stripQuery(path)).split("/") 0052 var pathSegmentsGenerator = pathSegments.generate() 0053 var params = [String:String]() 0054 if let handler = findHandler(&rootNode, params: ¶ms, generator: &pathSegmentsGenerator) { 0055 return (params, handler) 0056 } 0057 } 0058 let pathSegments = ("*/" + stripQuery(path)).split("/") 0059 var pathSegmentsGenerator = pathSegments.generate() 0060 var params = [String:String]() 0061 if let handler = findHandler(&rootNode, params: ¶ms, generator: &pathSegmentsGenerator) { 0062 return (params, handler) 0063 } 0064 return nil 0065 } 0066 0067 private func inflate
HttpServer.swift:47 if let result = router.route(method, path: path) {(inout node: Node, inout generator: IndexingGenerator<[String]>) -> Node { 0068 if let pathSegment = generator.next() { 0069 if let _ = node.nodes[pathSegment] { 0070 return inflate(&node.nodes[pathSegment]!, generator: &generator) 0071 } 0072 var nextNode = Node() 0073 node.nodes[pathSegment] = nextNode 0074 return inflate(&nextNode, generator: &generator) 0075 } 0076 return node 0077 } 0078 0079 private func findHandler
HttpRouter.swift:46 inflate(&rootNode, generator: &pathSegmentsGenerator).handler = handlerHttpRouter.swift:70 return inflate(&node.nodes[pathSegment]!, generator: &generator)HttpRouter.swift:74 return inflate(&nextNode, generator: &generator)(inout node: Node, inout params: [String: String], inout generator: IndexingGenerator<[String]>) -> (HttpRequest -> HttpResponse)? { 0080 guard let pathToken = generator.next() else { 0081 return node.handler 0082 } 0083 let variableNodes = node.nodes.filter { $0.0.characters.first == ":" } 0084 if let variableNode = variableNodes.first { 0085 if variableNode.1.nodes.count == 0 { 0086 // if it's the last element of the pattern and it's a variable, stop the search and 0087 // append a tail as a value for the variable. 0088 let tail = generator.joinWithSeparator("/") 0089 if tail.utf8.count > 0 { 0090 params[variableNode.0] = pathToken + "/" + tail 0091 } else { 0092 params[variableNode.0] = pathToken 0093 } 0094 return variableNode.1.handler 0095 } 0096 params[variableNode.0] = pathToken 0097 return findHandler(&node.nodes[variableNode.0]!, params: ¶ms, generator: &generator) 0098 } 0099 if let _ = node.nodes[pathToken] { 0100 return findHandler(&node.nodes[pathToken]!, params: ¶ms, generator: &generator) 0101 } 0102 if let _ = node.nodes["*"] { 0103 return findHandler(&node.nodes["*"]!, params: ¶ms, generator: &generator) 0104 } 0105 return nil 0106 } 0107 0108 private func stripQuery
HttpRouter.swift:54 if let handler = findHandler(&rootNode, params: ¶ms, generator: &pathSegmentsGenerator) {HttpRouter.swift:61 if let handler = findHandler(&rootNode, params: ¶ms, generator: &pathSegmentsGenerator) {HttpRouter.swift:97 return findHandler(&node.nodes[variableNode.0]!, params: ¶ms, generator: &generator)HttpRouter.swift:100 return findHandler(&node.nodes[pathToken]!, params: ¶ms, generator: &generator)HttpRouter.swift:103 return findHandler(&node.nodes["*"]!, params: ¶ms, generator: &generator)(path: String) -> String { 0109 if let path = path.split("?").first { 0110 return path 0111 } 0112 return path 0113 } 0114 } 0115
HttpRouter.swift:39 var pathSegments = stripQuery(path).split("/")HttpRouter.swift:51 let pathSegments = (method + "/" + stripQuery(path)).split("/")HttpRouter.swift:58 let pathSegments = ("*/" + stripQuery(path)).split("/")