4 # Make it easier to mount PSGI apps under catalyst
7 package MyApp::Controller::User;
9 use base 'Catalyst::Controller';
14 my $req = Plack::Request->new(shift);
15 return [200,[],[$req->path]];
18 sub local_example :Local {
20 my $env = $self->get_env($c);
21 $c->res->from_psgi_response(
25 sub local_example_args1 :Local Args(1) {
27 my $env = $self->get_env($c);
28 $c->res->from_psgi_response(
32 sub path_example :Path('path-example') {
34 my $env = $self->get_env($c);
35 $c->res->from_psgi_response(
39 sub path_example_args1 :Path('path-example-args1') {
41 my $env = $self->get_env($c);
42 $c->res->from_psgi_response(
46 sub chained :Chained(/) PathPrefix CaptureArgs(0) { }
48 sub from_chain :Chained('chained') PathPart('') CaptureArgs(0) {}
50 sub end_chain :Chained('from_chain') PathPath(abc-123) Args(1)
53 my $env = $self->get_env($c);
54 $c->res->from_psgi_response(
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;
71 $INC{'MyApp/Controller/User.pm'} = __FILE__;
80 use Catalyst::Test 'MyApp';
82 # BEGIN [user/local_example]
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, [];
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];
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, [];
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];
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, [];
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];
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, [];
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];
139 # END [user/local_example]
141 # BEGIN [/user/local_example_args1/***/]
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];
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];
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];
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];
171 # END [/user/local_example_args1/***/]
173 # BEGIN [/user/path-example]
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, [];
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, [];
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, [];
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, [];
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];
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];
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];
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];
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];
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];
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];
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];
260 # Chaining test /user/end_chain/*
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];
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];
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];
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];
298 use Plack::App::URLMap;
299 use HTTP::Request::Common;
300 use HTTP::Message::PSGI;
302 my $urlmap = Plack::App::URLMap->new;
307 "REQUEST_URI: $env->{REQUEST_URI}, FROM: $env->{MAP_TO}, PATH_INFO: $env->{PATH_INFO}, SCRIPT_NAME $env->{SCRIPT_NAME}"]];
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)});
314 my $app = $urlmap->to_app;
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];