# Make it easier to mount PSGI apps under catalyst
+my $psgi_app = sub {
+ my $req = Plack::Request->new(shift);
+ return [200,[],[$req->path]];
+};
+
{
- package MyApp::Controller::User;
+ package MyApp::Controller::Docs;
+ $INC{'MyApp/Controller/Docs.pm'} = __FILE__;
use base 'Catalyst::Controller';
use Plack::Request;
use Catalyst::Utils;
- my $psgi_app = sub {
- my $req = Plack::Request->new(shift);
- return [200,[],[$req->path]];
- };
+ sub name :Local {
+ my ($self, $c) = @_;
+ my $env = $c->Catalyst::Utils::env_at_action;
+ $c->res->from_psgi_response(
+ $psgi_app->($env));
+
+ }
+
+ sub name_args :Local Args(1) {
+ my ($self, $c, $arg) = @_;
+ my $env = $c->Catalyst::Utils::env_at_action;
+ $c->res->from_psgi_response(
+ $psgi_app->($env));
+ }
+
+ package MyApp::Controller::User;
+ $INC{'MyApp/Controller/User.pm'} = __FILE__;
+
+ use base 'Catalyst::Controller';
+ use Plack::Request;
+ use Catalyst::Utils;
sub local_example :Local {
my ($self, $c) = @_;
$c->res->from_psgi_response(
$psgi_app->($env));
}
+
+ sub mounted :Local Args(1) {
+ my ($self, $c, $arg) = @_;
+ our $app ||= ref($c)->psgi_app;
+ my $env = $self->get_env($c);
+ $c->res->from_psgi_response(
+ $app->($env));
+ }
+
+ sub mount_arg :Path(/mounted) Arg(1) {
+ my ($self, $c, $arg) = @_;
+ my $uri = $c->uri_for( $self->action_for('local_example_args1'),$arg);
+ $c->res->body("$uri");
+ }
+
+ sub mount_noarg :Path(/mounted_no_arg) {
+ my ($self, $c) = @_;
+ my $uri = $c->uri_for( $self->action_for('local_example_args1'),444);
+ $c->res->body("$uri");
+ }
+
sub get_env {
my ($self, $c) = @_;
}
}
- $INC{'MyApp/Controller/User.pm'} = __FILE__;
-
package MyApp;
use Catalyst;
MyApp->setup;
use Test::More;
use Catalyst::Test 'MyApp';
+{
+ my ($res, $c) = ctx_request('/user/mounted/111?path_prefix=1');
+ is $c->action, 'user/mounted';
+ is $res->content, 'http://localhost/user/user/local_example_args1/111';
+ is_deeply $c->req->args, [111];
+}
+
+{
+ my ($res, $c) = ctx_request('/user/mounted/mounted_no_arg?env_path=1');
+ is $c->action, 'user/mounted';
+ is $res->content, 'http://localhost/user/mounted/user/local_example_args1/444';
+ is_deeply $c->req->args, ['mounted_no_arg'];
+}
+
# BEGIN [user/local_example]
{
my ($res, $c) = ctx_request('/user/local_example');
is_deeply $c->req->args, [444];
}
+{
+ my ($res, $c) = ctx_request('/docs/name');
+ is $c->action, 'docs/name';
+ is $res->content, '/';
+ is_deeply $c->req->args, [];
+}
+
+{
+ my ($res, $c) = ctx_request('/docs/name/111/222');
+ is $c->action, 'docs/name';
+ is $res->content, '/111/222';
+ is_deeply $c->req->args, [111,222];
+}
+
+{
+ my ($res, $c) = ctx_request('/docs/name_args/111');
+ is $c->action, 'docs/name_args';
+ is $res->content, '/111';
+ is_deeply $c->req->args, [111];
+}
done_testing();