@@ -93,7 +93,10 @@ open class HttpRouter {
9393 private func findHandler( _ node: inout Node , params: inout [ String : String ] , generator: inout IndexingIterator < [ String ] > ) -> ( ( HttpRequest ) -> HttpResponse ) ? {
9494
9595 var matchedRoutes = [ Node] ( )
96- findHandler ( & node, params: & params, generator: & generator, matchedNodes: & matchedRoutes, index: 0 , count: generator. reversed ( ) . count)
96+ let pattern = generator. map { $0 }
97+ let numberOfElements = pattern. count
98+
99+ findHandler ( & node, params: & params, pattern: pattern , matchedNodes: & matchedRoutes, index: 0 , count: numberOfElements)
97100 return matchedRoutes. first? . handler
98101 }
99102
@@ -102,21 +105,21 @@ open class HttpRouter {
102105 /// - Parameters:
103106 /// - node: The root node of the tree representing all the routes
104107 /// - params: The parameters of the match
105- /// - generator : The IndexingIterator to iterate through the pattern to match
108+ /// - pattern : The pattern or route to find in the routes tree
106109 /// - matchedNodes: An array with the nodes matching the route
107110 /// - index: The index of current position in the generator
108111 /// - count: The number of elements if the route to match
109- private func findHandler( _ node: inout Node , params: inout [ String : String ] , generator : inout IndexingIterator < [ String ] > , matchedNodes: inout [ Node ] , index: Int , count: Int ) {
112+ private func findHandler( _ node: inout Node , params: inout [ String : String ] , pattern : [ String ] , matchedNodes: inout [ Node ] , index: Int , count: Int ) {
110113
111- if let pathToken = generator . next ( ) ? . removingPercentEncoding {
114+ if index < count , let pathToken = pattern [ index ] . removingPercentEncoding {
112115
113116 var currentIndex = index + 1
114117 let variableNodes = node. nodes. filter { $0. 0 . first == " : " }
115118 if let variableNode = variableNodes. first {
116119 if currentIndex == count && variableNode. 1 . isEndOfRoute {
117120 // if it's the last element of the pattern and it's a variable, stop the search and
118121 // append a tail as a value for the variable.
119- let tail = generator . joined ( separator: " / " )
122+ let tail = pattern [ currentIndex ..< count ] . joined ( separator: " / " )
120123 if tail. count > 0 {
121124 params [ variableNode. 0 ] = pathToken + " / " + tail
122125 } else {
@@ -127,37 +130,31 @@ open class HttpRouter {
127130 return
128131 }
129132 params [ variableNode. 0 ] = pathToken
130- findHandler ( & node. nodes [ variableNode. 0 ] !, params: & params, generator : & generator , matchedNodes: & matchedNodes, index: currentIndex, count: count)
133+ findHandler ( & node. nodes [ variableNode. 0 ] !, params: & params, pattern : pattern , matchedNodes: & matchedNodes, index: currentIndex, count: count)
131134 }
132135
133136 if var node = node. nodes [ pathToken] {
134- findHandler ( & node, params: & params, generator : & generator , matchedNodes: & matchedNodes, index: currentIndex, count: count)
137+ findHandler ( & node, params: & params, pattern : pattern , matchedNodes: & matchedNodes, index: currentIndex, count: count)
135138 }
136139
137140 if var node = node. nodes [ " * " ] {
138- findHandler ( & node, params: & params, generator : & generator , matchedNodes: & matchedNodes, index: currentIndex, count: count)
141+ findHandler ( & node, params: & params, pattern : pattern , matchedNodes: & matchedNodes, index: currentIndex, count: count)
139142 }
140143
141144 if let startStarNode = node. nodes [ " ** " ] {
142145 let startStarNodeKeys = startStarNode. nodes. keys
143- while let pathToken = generator. next ( ) {
146+ currentIndex += 1
147+ while currentIndex < count, let pathToken = pattern [ currentIndex] . removingPercentEncoding {
144148 currentIndex += 1
145149 if startStarNodeKeys. contains ( pathToken) {
146- findHandler ( & startStarNode. nodes [ pathToken] !, params: & params, generator : & generator , matchedNodes: & matchedNodes, index: currentIndex, count: count)
150+ findHandler ( & startStarNode. nodes [ pathToken] !, params: & params, pattern : pattern , matchedNodes: & matchedNodes, index: currentIndex, count: count)
147151 }
148152 }
149153 }
150- } else if let variableNode = node. nodes. filter ( { $0. 0 . first == " : " } ) . first {
151- // if it's the last element of the requested URL, check if there is a pattern with variable tail.
152- if variableNode. value. nodes. isEmpty {
153- params [ variableNode. 0 ] = " "
154- matchedNodes. append ( variableNode. value)
155- return
156- }
157154 }
158155
159- // if it's the last element and the path to match is done then it's a pattern matching
160- if node . nodes . isEmpty && index == count {
156+ if node . isEndOfRoute && index == count {
157+ // if it's the last element and the path to match is done then it's a pattern matching
161158 matchedNodes. append ( node)
162159 return
163160 }
0 commit comments