# 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::PSGIObject;
+
+ sub as_psgi {
+ return [200, ['Content-Type' => 'text/plain'], ['as_psgi']];
+ };
+
+ 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 as_psgi :Local {
+ my ($self, $c) = @_;
+ my $as_psgi = bless +{}, 'MyApp::PSGIObject';
+ $c->res->from_psgi_response($as_psgi);
+ }
+
+ 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));
+ }
+
+ sub filehandle :Local {
+ my ($self, $c, $arg) = @_;
+ my $path = File::Spec->catfile('t', 'utf8.txt');
+ open(my $fh, '<', $path) || die "trouble: $!";
+ $c->res->from_psgi_response([200, ['Content-Type'=>'text/html'], $fh]);
+ }
+
+ sub direct :Local {
+ my ($self, $c, $arg) = @_;
+ $c->res->from_psgi_response([200, ['Content-Type'=>'text/html'], ["hello","world"]]);
+ }
+
+ sub streaming_body :Local {
+ my ($self, $c) = @_;
+ my $psgi_app = sub {
+ my $respond = shift;
+ my $writer = $respond->([200,["Content-Type" => "text/plain"]]);
+ $writer->write("body");
+ $writer->close;
+ };
+ $c->res->from_psgi_response($psgi_app);
+ }
+ sub streaming_body_with_charset :Local {
+ my ($self, $c) = @_;
+ my $psgi_app = sub {
+ my $respond = shift;
+ my $writer = $respond->([200,["Content-Type" => "text/plain; charset=utf-8"]]);
+ $writer->write("body");
+ $writer->close;
+ };
+ #$c->clear_encoding;
+ $c->res->from_psgi_response($psgi_app);
+ }
+
+ 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->body("$uri");
}
-
+
sub get_env {
my ($self, $c) = @_;
if($c->req->query_parameters->{path_prefix}) {
}
}
- $INC{'MyApp/Controller/User.pm'} = __FILE__;
-
package MyApp;
use Catalyst;
MyApp->setup;
use Catalyst::Test 'MyApp';
{
+ my ($res, $c) = ctx_request('/docs/as_psgi');
+ is $res->content, 'as_psgi';
+}
+
+{
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';
# END [/user/local_example_args1/***/]
-# BEGIN [/user/path-example]
+# BEGIN [/user/path-example]
{
my ($res, $c) = ctx_request('/user/path-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, [];
+}
-done_testing();
-
-__END__
-
-
-use Plack::App::URLMap;
-use HTTP::Request::Common;
-use HTTP::Message::PSGI;
-
-my $urlmap = Plack::App::URLMap->new;
+{
+ 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 $app1 = sub {
- my $env = shift;
- return [200, [], [
- "REQUEST_URI: $env->{REQUEST_URI}, FROM: $env->{MAP_TO}, PATH_INFO: $env->{PATH_INFO}, SCRIPT_NAME $env->{SCRIPT_NAME}"]];
-};
+{
+ 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];
+}
-$urlmap->map("/" => sub { my $env = shift; $env->{MAP_TO} = '/'; $app1->($env)});
-$urlmap->map("/foo" => sub { my $env = shift; $env->{MAP_TO} = '/foo'; $app1->($env)});
-$urlmap->map("/bar/baz" => sub { my $env = shift; $env->{MAP_TO} = '/foo/bar'; $app1->($env)});
+{
+ use utf8;
+ use Encode;
+ my ($res, $c) = ctx_request('/docs/filehandle');
+ is Encode::decode_utf8($res->content), "<p>This is stream_body_fh action ♥</p>\n";
+}
-my $app = $urlmap->to_app;
+{
+ my ($res, $c) = ctx_request('/docs/direct');
+ is $res->content, "helloworld";
+}
-warn $app->(req_to_psgi(GET '/'))->[2]->[0];
-warn $app->(req_to_psgi(GET '/111'))->[2]->[0];
-warn $app->(req_to_psgi(GET '/foo'))->[2]->[0];
-warn $app->(req_to_psgi(GET '/foo/222'))->[2]->[0];
-warn $app->(req_to_psgi(GET '/bar/baz'))->[2]->[0];
-warn $app->(req_to_psgi(GET '/bar/baz/333'))->[2]->[0];
+{
+ my ($res, $c) = ctx_request('/docs/streaming_body');
+ is $res->content, "body";
+}
+{
+ my ($res, $c) = ctx_request('/docs/streaming_body_with_charset');
+ is $res->content, "body";
+}
+done_testing();