4 # Make it easier to mount PSGI apps under catalyst
7 package MyApp::Controller::Docs;
9 use base 'Catalyst::Controller';
14 my $req = Plack::Request->new(shift);
15 return [200,[],[$req->path]];
20 my $env = $c->Catalyst::Utils::env_at_action;
21 $c->res->from_psgi_response(
26 sub name_args :Local Args(1) {
27 my ($self, $c, $arg) = @_;
28 my $env = $c->Catalyst::Utils::env_at_action;
29 $c->res->from_psgi_response(
33 package MyApp::Controller::User;
35 use base 'Catalyst::Controller';
40 my $req = Plack::Request->new(shift);
41 return [200,[],[$req->path]];
44 sub local_example :Local {
46 my $env = $self->get_env($c);
47 $c->res->from_psgi_response(
51 sub local_example_args1 :Local Args(1) {
53 my $env = $self->get_env($c);
54 $c->res->from_psgi_response(
58 sub path_example :Path('path-example') {
60 my $env = $self->get_env($c);
61 $c->res->from_psgi_response(
65 sub path_example_args1 :Path('path-example-args1') {
67 my $env = $self->get_env($c);
68 $c->res->from_psgi_response(
72 sub chained :Chained(/) PathPrefix CaptureArgs(0) { }
74 sub from_chain :Chained('chained') PathPart('') CaptureArgs(0) {}
76 sub end_chain :Chained('from_chain') PathPath(abc-123) Args(1)
79 my $env = $self->get_env($c);
80 $c->res->from_psgi_response(
86 if($c->req->query_parameters->{path_prefix}) {
87 return $c->Catalyst::Utils::env_at_path_prefix;
88 } elsif($c->req->query_parameters->{env_path}) {
89 return $c->Catalyst::Utils::env_at_action;
90 } elsif($c->req->query_parameters->{path}) {
91 return $c->Catalyst::Utils::env_at_request_uri;
97 $INC{'MyApp/Controller/User.pm'} = __FILE__;
106 use Catalyst::Test 'MyApp';
108 # BEGIN [user/local_example]
110 my ($res, $c) = ctx_request('/user/local_example');
111 is $c->action, 'user/local_example';
112 is $res->content, '/user/local_example';
113 is_deeply $c->req->args, [];
117 my ($res, $c) = ctx_request('/user/local_example/111/222');
118 is $c->action, 'user/local_example';
119 is $res->content, '/user/local_example/111/222';
120 is_deeply $c->req->args, [111,222];
124 my ($res, $c) = ctx_request('/user/local_example?path_prefix=1');
125 is $c->action, 'user/local_example';
126 is $res->content, '/local_example';
127 is_deeply $c->req->args, [];
131 my ($res, $c) = ctx_request('/user/local_example/111/222?path_prefix=1');
132 is $c->action, 'user/local_example';
133 is $res->content, '/local_example/111/222';
134 is_deeply $c->req->args, [111,222];
138 my ($res, $c) = ctx_request('/user/local_example?env_path=1');
139 is $c->action, 'user/local_example';
140 is $res->content, '/';
141 is_deeply $c->req->args, [];
145 my ($res, $c) = ctx_request('/user/local_example/111/222?env_path=1');
146 is $c->action, 'user/local_example';
147 is $res->content, '/111/222';
148 is_deeply $c->req->args, [111,222];
152 my ($res, $c) = ctx_request('/user/local_example?path=1');
153 is $c->action, 'user/local_example';
154 is $res->content, '/';
155 is_deeply $c->req->args, [];
159 my ($res, $c) = ctx_request('/user/local_example/111/222?path=1');
160 is $c->action, 'user/local_example';
161 is $res->content, '/';
162 is_deeply $c->req->args, [111,222];
165 # END [user/local_example]
167 # BEGIN [/user/local_example_args1/***/]
170 my ($res, $c) = ctx_request('/user/local_example_args1/333');
171 is $c->action, 'user/local_example_args1';
172 is $res->content, '/user/local_example_args1/333';
173 is_deeply $c->req->args, [333];
177 my ($res, $c) = ctx_request('/user/local_example_args1/333?path_prefix=1');
178 is $c->action, 'user/local_example_args1';
179 is $res->content, '/local_example_args1/333';
180 is_deeply $c->req->args, [333];
184 my ($res, $c) = ctx_request('/user/local_example_args1/333?env_path=1');
185 is $c->action, 'user/local_example_args1';
186 is $res->content, '/333';
187 is_deeply $c->req->args, [333];
191 my ($res, $c) = ctx_request('/user/local_example_args1/333?path=1');
192 is $c->action, 'user/local_example_args1';
193 is $res->content, '/';
194 is_deeply $c->req->args, [333];
197 # END [/user/local_example_args1/***/]
199 # BEGIN [/user/path-example]
202 my ($res, $c) = ctx_request('/user/path-example');
203 is $c->action, 'user/path_example';
204 is $res->content, '/user/path-example';
205 is_deeply $c->req->args, [];
209 my ($res, $c) = ctx_request('/user/path-example?path_prefix=1');
210 is $c->action, 'user/path_example';
211 is $res->content, '/path-example';
212 is_deeply $c->req->args, [];
216 my ($res, $c) = ctx_request('/user/path-example?env_path=1');
217 is $c->action, 'user/path_example';
218 is $res->content, '/';
219 is_deeply $c->req->args, [];
223 my ($res, $c) = ctx_request('/user/path-example?path=1');
224 is $c->action, 'user/path_example';
225 is $res->content, '/';
226 is_deeply $c->req->args, [];
231 my ($res, $c) = ctx_request('/user/path-example/111/222');
232 is $c->action, 'user/path_example';
233 is $res->content, '/user/path-example/111/222';
234 is_deeply $c->req->args, [111,222];
238 my ($res, $c) = ctx_request('/user/path-example/111/222?path_prefix=1');
239 is $c->action, 'user/path_example';
240 is $res->content, '/path-example/111/222';
241 is_deeply $c->req->args, [111,222];
245 my ($res, $c) = ctx_request('/user/path-example/111/222?env_path=1');
246 is $c->action, 'user/path_example';
247 is $res->content, '/111/222';
248 is_deeply $c->req->args, [111,222];
252 my ($res, $c) = ctx_request('/user/path-example/111/222?path=1');
253 is $c->action, 'user/path_example';
254 is $res->content, '/';
255 is_deeply $c->req->args, [111,222];
259 my ($res, $c) = ctx_request('/user/path-example-args1/333');
260 is $c->action, 'user/path_example_args1';
261 is $res->content, '/user/path-example-args1/333';
262 is_deeply $c->req->args, [333];
266 my ($res, $c) = ctx_request('/user/path-example-args1/333?path_prefix=1');
267 is $c->action, 'user/path_example_args1';
268 is $res->content, '/path-example-args1/333';
269 is_deeply $c->req->args, [333];
273 my ($res, $c) = ctx_request('/user/path-example-args1/333?env_path=1');
274 is $c->action, 'user/path_example_args1';
275 is $res->content, '/333';
276 is_deeply $c->req->args, [333];
280 my ($res, $c) = ctx_request('/user/path-example-args1/333?path=1');
281 is $c->action, 'user/path_example_args1';
282 is $res->content, '/';
283 is_deeply $c->req->args, [333];
286 # Chaining test /user/end_chain/*
291 my ($res, $c) = ctx_request('/user/end_chain/444');
292 is $c->action, 'user/end_chain';
293 is $res->content, '/user/end_chain/444';
294 is_deeply $c->req->args, [444];
298 my ($res, $c) = ctx_request('/user/end_chain/444?path_prefix=1');
299 is $c->action, 'user/end_chain';
300 is $res->content, '/end_chain/444';
301 is_deeply $c->req->args, [444];
305 my ($res, $c) = ctx_request('/user/end_chain/444?env_path=1');
306 is $c->action, 'user/end_chain';
307 is $res->content, '/444';
308 is_deeply $c->req->args, [444];
312 my ($res, $c) = ctx_request('/user/end_chain/444?path=1');
313 is $c->action, 'user/end_chain';
314 is $res->content, '/';
315 is_deeply $c->req->args, [444];
319 my ($res, $c) = ctx_request('/docs/name');
320 is $c->action, 'docs/name';
321 is $res->content, '/';
322 is_deeply $c->req->args, [];
326 my ($res, $c) = ctx_request('/docs/name/111/222');
327 is $c->action, 'docs/name';
328 is $res->content, '/111/222';
329 is_deeply $c->req->args, [111,222];
333 my ($res, $c) = ctx_request('/docs/name_args/111');
334 is $c->action, 'docs/name_args';
335 is $res->content, '/111';
336 is_deeply $c->req->args, [111];
344 use Plack::App::URLMap;
345 use HTTP::Request::Common;
346 use HTTP::Message::PSGI;
348 my $urlmap = Plack::App::URLMap->new;
353 "REQUEST_URI: $env->{REQUEST_URI}, FROM: $env->{MAP_TO}, PATH_INFO: $env->{PATH_INFO}, SCRIPT_NAME $env->{SCRIPT_NAME}"]];
356 $urlmap->map("/" => sub { my $env = shift; $env->{MAP_TO} = '/'; $app1->($env)});
357 $urlmap->map("/foo" => sub { my $env = shift; $env->{MAP_TO} = '/foo'; $app1->($env)});
358 $urlmap->map("/bar/baz" => sub { my $env = shift; $env->{MAP_TO} = '/foo/bar'; $app1->($env)});
360 my $app = $urlmap->to_app;
362 warn $app->(req_to_psgi(GET '/'))->[2]->[0];
363 warn $app->(req_to_psgi(GET '/111'))->[2]->[0];
364 warn $app->(req_to_psgi(GET '/foo'))->[2]->[0];
365 warn $app->(req_to_psgi(GET '/foo/222'))->[2]->[0];
366 warn $app->(req_to_psgi(GET '/bar/baz'))->[2]->[0];
367 warn $app->(req_to_psgi(GET '/bar/baz/333'))->[2]->[0];