@@ -27,44 +27,74 @@ def eager_load!
27
27
end
28
28
29
29
def serve ( req )
30
- find_routes ( req ) do |match , parameters , route |
31
- set_params = req . path_parameters
32
- path_info = req . path_info
33
- script_name = req . script_name
34
-
35
- unless route . path . anchored
36
- req . script_name = ( script_name . to_s + match . to_s ) . chomp ( "/" )
37
- req . path_info = match . post_match
38
- req . path_info = "/" + req . path_info unless req . path_info . start_with? "/"
39
- end
40
-
30
+ recognize ( req ) do |route , parameters |
41
31
req . path_parameters = parameters
42
32
req . route = route
43
33
44
34
_ , headers , _ = response = route . app . serve ( req )
45
35
46
- if headers [ Constants ::X_CASCADE ] == "pass"
47
- req . script_name = script_name
48
- req . path_info = path_info
49
- req . path_parameters = set_params
50
- next
51
- end
52
-
53
- return response
36
+ return response unless headers [ Constants ::X_CASCADE ] == "pass"
54
37
end
55
38
56
39
[ 404 , { Constants ::X_CASCADE => "pass" } , [ "Not Found" ] ]
57
40
end
58
41
59
- def recognize ( rails_req )
60
- find_routes ( rails_req ) do |match , parameters , route |
61
- unless route . path . anchored
62
- rails_req . script_name = match . to_s
63
- rails_req . path_info = match . post_match
64
- rails_req . path_info = "/" + rails_req . path_info unless rails_req . path_info . start_with? "/"
42
+ def recognize ( req , &block )
43
+ req_params = req . path_parameters
44
+ path_info = req . path_info
45
+ script_name = req . script_name
46
+
47
+ routes = filter_routes ( path_info )
48
+
49
+ custom_routes . each { |r |
50
+ routes << r if r . path . match? ( path_info )
51
+ }
52
+
53
+ if req . head?
54
+ routes = match_head_routes ( routes , req )
55
+ else
56
+ routes . select! { |r | r . matches? ( req ) }
57
+ end
58
+
59
+ if routes . size > 1
60
+ routes . sort! do |a , b |
61
+ a . precedence <=> b . precedence
62
+ end
63
+ end
64
+
65
+ routes . each do |r |
66
+ match_data = r . path . match ( path_info )
67
+
68
+ path_parameters = req_params . merge r . defaults
69
+
70
+ index = 1
71
+ match_data . names . each do |name |
72
+ if val = match_data [ index ]
73
+ val = if val . include? ( "%" )
74
+ CGI . unescapeURIComponent ( val )
75
+ else
76
+ val
77
+ end
78
+ val . force_encoding ( ::Encoding ::UTF_8 )
79
+ path_parameters [ name . to_sym ] = val
80
+ end
81
+ index += 1
82
+ end
83
+
84
+ if r . path . anchored
85
+ yield ( r , path_parameters )
86
+ else
87
+ req . script_name = ( script_name . to_s + match_data . to_s ) . chomp ( "/" )
88
+ req . path_info = match_data . post_match
89
+ req . path_info = "/" + req . path_info unless req . path_info . start_with? "/"
90
+
91
+ yield ( r , path_parameters )
92
+
93
+ req . script_name = script_name
94
+ req . path_info = path_info
65
95
end
66
96
67
- yield ( route , parameters )
97
+ req . path_parameters = req_params
68
98
end
69
99
end
70
100
@@ -99,48 +129,6 @@ def filter_routes(path)
99
129
simulator . memos ( path ) { [ ] }
100
130
end
101
131
102
- def find_routes ( req )
103
- path_info = req . path_info
104
- routes = filter_routes ( path_info )
105
-
106
- custom_routes . each { |r |
107
- routes << r if r . path . match? ( path_info )
108
- }
109
-
110
- if req . head?
111
- routes = match_head_routes ( routes , req )
112
- else
113
- routes . select! { |r | r . matches? ( req ) }
114
- end
115
-
116
- if routes . size > 1
117
- routes . sort! do |a , b |
118
- a . precedence <=> b . precedence
119
- end
120
- end
121
-
122
- routes . each do |r |
123
- match_data = r . path . match ( path_info )
124
-
125
- path_parameters = req . path_parameters . merge r . defaults
126
-
127
- index = 1
128
- match_data . names . each do |name |
129
- if val = match_data [ index ]
130
- val = if val . include? ( "%" )
131
- CGI . unescapeURIComponent ( val )
132
- else
133
- val
134
- end
135
- val . force_encoding ( ::Encoding ::UTF_8 )
136
- path_parameters [ name . to_sym ] = val
137
- end
138
- index += 1
139
- end
140
- yield [ match_data , path_parameters , r ]
141
- end
142
- end
143
-
144
132
def match_head_routes ( routes , req )
145
133
head_routes = routes . select { |r | r . requires_matching_verb? && r . matches? ( req ) }
146
134
return head_routes unless head_routes . empty?
0 commit comments