Commit | Line | Data |
9c7b6768 |
1 | use warnings; |
2 | use strict; |
3 | |
4 | # Make it easier to mount PSGI apps under catalyst |
5 | |
6 | { |
7 | package MyApp::Controller::User; |
8 | |
9 | use base 'Catalyst::Controller'; |
10 | use Plack::Request; |
11 | use Catalyst::Utils; |
12 | |
13 | my $psgi_app = sub { |
14 | my $req = Plack::Request->new(shift); |
15 | return [200,[],[$req->path]]; |
16 | }; |
17 | |
18 | sub local_example :Local { |
19 | my ($self, $c) = @_; |
20 | my $env = $self->get_env($c); |
21 | $c->res->from_psgi_response( |
22 | $psgi_app->($env)); |
23 | } |
24 | |
25 | sub local_example_args1 :Local Args(1) { |
26 | my ($self, $c) = @_; |
27 | my $env = $self->get_env($c); |
28 | $c->res->from_psgi_response( |
29 | $psgi_app->($env)); |
30 | } |
31 | |
32 | sub path_example :Path('path-example') { |
33 | my ($self, $c) = @_; |
34 | my $env = $self->get_env($c); |
35 | $c->res->from_psgi_response( |
36 | $psgi_app->($env)); |
37 | } |
38 | |
39 | sub path_example_args1 :Path('path-example-args1') { |
40 | my ($self, $c) = @_; |
41 | my $env = $self->get_env($c); |
42 | $c->res->from_psgi_response( |
43 | $psgi_app->($env)); |
44 | } |
45 | |
46 | sub chained :Chained(/) PathPrefix CaptureArgs(0) { } |
47 | |
48 | sub from_chain :Chained('chained') PathPart('') CaptureArgs(0) {} |
49 | |
50 | sub end_chain :Chained('from_chain') PathPath(abc-123) Args(1) |
51 | { |
52 | my ($self, $c) = @_; |
53 | my $env = $self->get_env($c); |
54 | $c->res->from_psgi_response( |
55 | $psgi_app->($env)); |
56 | } |
57 | |
58 | sub get_env { |
59 | my ($self, $c) = @_; |
60 | if($c->req->query_parameters->{path_prefix}) { |
61 | return $c->Catalyst::Utils::env_at_path_prefix; |
62 | } elsif($c->req->query_parameters->{env_path}) { |
63 | return $c->Catalyst::Utils::env_at_action; |
64 | } elsif($c->req->query_parameters->{path}) { |
65 | return $c->Catalyst::Utils::env_at_request_uri; |
66 | } else { |
67 | return $c->req->env; |
68 | } |
69 | } |
70 | |
71 | $INC{'MyApp/Controller/User.pm'} = __FILE__; |
72 | |
73 | package MyApp; |
74 | use Catalyst; |
75 | MyApp->setup; |
76 | |
77 | } |
78 | |
79 | use Test::More; |
80 | use Catalyst::Test 'MyApp'; |
81 | |
82 | # BEGIN [user/local_example] |
83 | { |
84 | my ($res, $c) = ctx_request('/user/local_example'); |
85 | is $c->action, 'user/local_example'; |
86 | is $res->content, '/user/local_example'; |
87 | is_deeply $c->req->args, []; |
88 | } |
89 | |
90 | { |
91 | my ($res, $c) = ctx_request('/user/local_example/111/222'); |
92 | is $c->action, 'user/local_example'; |
93 | is $res->content, '/user/local_example/111/222'; |
94 | is_deeply $c->req->args, [111,222]; |
95 | } |
96 | |
97 | { |
98 | my ($res, $c) = ctx_request('/user/local_example?path_prefix=1'); |
99 | is $c->action, 'user/local_example'; |
100 | is $res->content, '/local_example'; |
101 | is_deeply $c->req->args, []; |
102 | } |
103 | |
104 | { |
105 | my ($res, $c) = ctx_request('/user/local_example/111/222?path_prefix=1'); |
106 | is $c->action, 'user/local_example'; |
107 | is $res->content, '/local_example/111/222'; |
108 | is_deeply $c->req->args, [111,222]; |
109 | } |
110 | |
111 | { |
112 | my ($res, $c) = ctx_request('/user/local_example?env_path=1'); |
113 | is $c->action, 'user/local_example'; |
114 | is $res->content, '/'; |
115 | is_deeply $c->req->args, []; |
116 | } |
117 | |
118 | { |
119 | my ($res, $c) = ctx_request('/user/local_example/111/222?env_path=1'); |
120 | is $c->action, 'user/local_example'; |
121 | is $res->content, '/111/222'; |
122 | is_deeply $c->req->args, [111,222]; |
123 | } |
124 | |
125 | { |
126 | my ($res, $c) = ctx_request('/user/local_example?path=1'); |
127 | is $c->action, 'user/local_example'; |
128 | is $res->content, '/'; |
129 | is_deeply $c->req->args, []; |
130 | } |
131 | |
132 | { |
133 | my ($res, $c) = ctx_request('/user/local_example/111/222?path=1'); |
134 | is $c->action, 'user/local_example'; |
135 | is $res->content, '/'; |
136 | is_deeply $c->req->args, [111,222]; |
137 | } |
138 | |
139 | # END [user/local_example] |
140 | |
141 | # BEGIN [/user/local_example_args1/***/] |
142 | |
143 | { |
144 | my ($res, $c) = ctx_request('/user/local_example_args1/333'); |
145 | is $c->action, 'user/local_example_args1'; |
146 | is $res->content, '/user/local_example_args1/333'; |
147 | is_deeply $c->req->args, [333]; |
148 | } |
149 | |
150 | { |
151 | my ($res, $c) = ctx_request('/user/local_example_args1/333?path_prefix=1'); |
152 | is $c->action, 'user/local_example_args1'; |
153 | is $res->content, '/local_example_args1/333'; |
154 | is_deeply $c->req->args, [333]; |
155 | } |
156 | |
157 | { |
158 | my ($res, $c) = ctx_request('/user/local_example_args1/333?env_path=1'); |
159 | is $c->action, 'user/local_example_args1'; |
160 | is $res->content, '/333'; |
161 | is_deeply $c->req->args, [333]; |
162 | } |
163 | |
164 | { |
165 | my ($res, $c) = ctx_request('/user/local_example_args1/333?path=1'); |
166 | is $c->action, 'user/local_example_args1'; |
167 | is $res->content, '/'; |
168 | is_deeply $c->req->args, [333]; |
169 | } |
170 | |
171 | # END [/user/local_example_args1/***/] |
172 | |
173 | # BEGIN [/user/path-example] |
174 | |
175 | { |
176 | my ($res, $c) = ctx_request('/user/path-example'); |
177 | is $c->action, 'user/path_example'; |
178 | is $res->content, '/user/path-example'; |
179 | is_deeply $c->req->args, []; |
180 | } |
181 | |
182 | { |
183 | my ($res, $c) = ctx_request('/user/path-example?path_prefix=1'); |
184 | is $c->action, 'user/path_example'; |
185 | is $res->content, '/path-example'; |
186 | is_deeply $c->req->args, []; |
187 | } |
188 | |
189 | { |
190 | my ($res, $c) = ctx_request('/user/path-example?env_path=1'); |
191 | is $c->action, 'user/path_example'; |
192 | is $res->content, '/'; |
193 | is_deeply $c->req->args, []; |
194 | } |
195 | |
196 | { |
197 | my ($res, $c) = ctx_request('/user/path-example?path=1'); |
198 | is $c->action, 'user/path_example'; |
199 | is $res->content, '/'; |
200 | is_deeply $c->req->args, []; |
201 | } |
202 | |
203 | |
204 | { |
205 | my ($res, $c) = ctx_request('/user/path-example/111/222'); |
206 | is $c->action, 'user/path_example'; |
207 | is $res->content, '/user/path-example/111/222'; |
208 | is_deeply $c->req->args, [111,222]; |
209 | } |
210 | |
211 | { |
212 | my ($res, $c) = ctx_request('/user/path-example/111/222?path_prefix=1'); |
213 | is $c->action, 'user/path_example'; |
214 | is $res->content, '/path-example/111/222'; |
215 | is_deeply $c->req->args, [111,222]; |
216 | } |
217 | |
218 | { |
219 | my ($res, $c) = ctx_request('/user/path-example/111/222?env_path=1'); |
220 | is $c->action, 'user/path_example'; |
221 | is $res->content, '/111/222'; |
222 | is_deeply $c->req->args, [111,222]; |
223 | } |
224 | |
225 | { |
226 | my ($res, $c) = ctx_request('/user/path-example/111/222?path=1'); |
227 | is $c->action, 'user/path_example'; |
228 | is $res->content, '/'; |
229 | is_deeply $c->req->args, [111,222]; |
230 | } |
231 | |
232 | { |
233 | my ($res, $c) = ctx_request('/user/path-example-args1/333'); |
234 | is $c->action, 'user/path_example_args1'; |
235 | is $res->content, '/user/path-example-args1/333'; |
236 | is_deeply $c->req->args, [333]; |
237 | } |
238 | |
239 | { |
240 | my ($res, $c) = ctx_request('/user/path-example-args1/333?path_prefix=1'); |
241 | is $c->action, 'user/path_example_args1'; |
242 | is $res->content, '/path-example-args1/333'; |
243 | is_deeply $c->req->args, [333]; |
244 | } |
245 | |
246 | { |
247 | my ($res, $c) = ctx_request('/user/path-example-args1/333?env_path=1'); |
248 | is $c->action, 'user/path_example_args1'; |
249 | is $res->content, '/333'; |
250 | is_deeply $c->req->args, [333]; |
251 | } |
252 | |
253 | { |
254 | my ($res, $c) = ctx_request('/user/path-example-args1/333?path=1'); |
255 | is $c->action, 'user/path_example_args1'; |
256 | is $res->content, '/'; |
257 | is_deeply $c->req->args, [333]; |
258 | } |
259 | |
260 | # Chaining test /user/end_chain/* |
261 | # |
262 | # |
263 | |
264 | { |
265 | my ($res, $c) = ctx_request('/user/end_chain/444'); |
266 | is $c->action, 'user/end_chain'; |
267 | is $res->content, '/user/end_chain/444'; |
268 | is_deeply $c->req->args, [444]; |
269 | } |
270 | |
271 | { |
272 | my ($res, $c) = ctx_request('/user/end_chain/444?path_prefix=1'); |
273 | is $c->action, 'user/end_chain'; |
274 | is $res->content, '/end_chain/444'; |
275 | is_deeply $c->req->args, [444]; |
276 | } |
277 | |
278 | { |
279 | my ($res, $c) = ctx_request('/user/end_chain/444?env_path=1'); |
280 | is $c->action, 'user/end_chain'; |
281 | is $res->content, '/444'; |
282 | is_deeply $c->req->args, [444]; |
283 | } |
284 | |
285 | { |
286 | my ($res, $c) = ctx_request('/user/end_chain/444?path=1'); |
287 | is $c->action, 'user/end_chain'; |
288 | is $res->content, '/'; |
289 | is_deeply $c->req->args, [444]; |
290 | } |
291 | |
292 | |
293 | done_testing(); |
294 | |
295 | __END__ |
296 | |
297 | |
298 | use Plack::App::URLMap; |
299 | use HTTP::Request::Common; |
300 | use HTTP::Message::PSGI; |
301 | |
302 | my $urlmap = Plack::App::URLMap->new; |
303 | |
304 | my $app1 = sub { |
305 | my $env = shift; |
306 | return [200, [], [ |
307 | "REQUEST_URI: $env->{REQUEST_URI}, FROM: $env->{MAP_TO}, PATH_INFO: $env->{PATH_INFO}, SCRIPT_NAME $env->{SCRIPT_NAME}"]]; |
308 | }; |
309 | |
310 | $urlmap->map("/" => sub { my $env = shift; $env->{MAP_TO} = '/'; $app1->($env)}); |
311 | $urlmap->map("/foo" => sub { my $env = shift; $env->{MAP_TO} = '/foo'; $app1->($env)}); |
312 | $urlmap->map("/bar/baz" => sub { my $env = shift; $env->{MAP_TO} = '/foo/bar'; $app1->($env)}); |
313 | |
314 | my $app = $urlmap->to_app; |
315 | |
316 | warn $app->(req_to_psgi(GET '/'))->[2]->[0]; |
317 | warn $app->(req_to_psgi(GET '/111'))->[2]->[0]; |
318 | warn $app->(req_to_psgi(GET '/foo'))->[2]->[0]; |
319 | warn $app->(req_to_psgi(GET '/foo/222'))->[2]->[0]; |
320 | warn $app->(req_to_psgi(GET '/bar/baz'))->[2]->[0]; |
321 | warn $app->(req_to_psgi(GET '/bar/baz/333'))->[2]->[0]; |
322 | |