use strict;
use warnings;
-use Time::HiRes qw/tv_interval/;
-our $VERSION = '0.16';
+our $VERSION = '0.17';
=head1 NAME
=item subreq [path as string or hash ref], [stash as hash ref], [parameters as hash ref]
+=item subrequest
+
=item sub_request
Takes a full path to a path you'd like to dispatch to.
=item subreq_res [path as string or hash ref], [stash as hash ref], [parameters as hash ref]
+=item subrequest_response
+
=item sub_request_response
Like C<sub_request()>, but returns a full L<Catalyst::Response> object.
=cut
*subreq = \&sub_request;
+*subrequest = \&sub_request;
*subreq_res = \&sub_request_response;
+*subrequest_response = \&sub_request_response;
sub sub_request {
return shift->sub_request_response( @_ )->body ;
sub sub_request_response {
my ( $c, $path, $stash, $params ) = @_;
-
- $path =~ s#^/##;
-
- $params ||= {};
-
- my %request_mods = (
- body => undef,
- action => undef,
- match => undef,
- parameters => $params,
- );
-
- if (ref $path eq 'HASH') {
- @request_mods{keys %$path} = values %$path;
- } else {
- $request_mods{path} = $path;
- }
- $request_mods{_body} = delete $request_mods{body};
-
- my $fake_engine = bless(
- {
- orig_request => $c->req,
- request_mods => \%request_mods,
- },
- 'Catalyst::Plugin::SubRequest::Internal::FakeEngine'
- );
-
- my $class = ref($c);
-
- no strict 'refs';
- no warnings 'redefine';
-
- local *{"${class}::engine"} = sub { $fake_engine };
-
- my $inner_ctx = $class->prepare;
-
- $inner_ctx->stash($stash || {});
-
+ $stash ||= {};
+ my $env = $c->request->env;
+ local $env->{PATH_INFO} = $path;
+ local $env->{REQUEST_URI} = $env->{SCRIPT_NAME} . $path;
+ $env->{REQUEST_URI} =~ s|//|/|g;
+ my $response_cb = $c->response->_response_cb;
+ my $class = ref($c) || $c;
$c->stats->profile(
- begin => 'subrequest: /' . $path,
+ begin => 'subrequest: ' . $path,
comment => '',
) if ($c->debug);
- $inner_ctx->dispatch;
+ my $i_ctx = $class->prepare(env => $env, response_cb => $response_cb);
+ $i_ctx->stash($stash);
+ $i_ctx->dispatch;
+ $i_ctx->finalize;
- $c->stats->profile( end => 'subrequest: /' . $path ) if ($c->debug);
+ $c->stats->profile( end => 'subrequest: ' . $path ) if $c->debug;
- return $inner_ctx->response;
+ return $i_ctx->response;
}
=head1 SEE ALSO
Tomas Doran (t0m) C<< bobtfish@bobtfish.net >>
+=head1 MAINTAINERS
+
+Eden Cardim (edenc) C<eden@insoli.de>
+
=head1 THANK YOU
SRI, for writing the awesome Catalyst framework
+MIYAGAWA, for writing the awesome Plack toolkit
=head1 COPYRIGHT
-Copyright (c) 2005 - 2008
+Copyright (c) 2005 - 2011
the Catalyst::Plugin::SubRequest L</AUTHORS>
as listed above.
=cut
-package # hide from PAUSE
- Catalyst::Plugin::SubRequest::Internal::FakeEngine;
-
-sub AUTOLOAD { return 1; } # yeah yeah yeah
-
-sub prepare {
- my ($self, $c) = @_;
- my $req = $c->request;
-
- @{$req}{keys %{$self->{orig_request}}} = values %{$self->{orig_request}};
- while (my ($key,$value) = each %{$self->{request_mods}}) {
- if (my $mut = $req->can($key)) {
- $req->$mut($value);
- } else {
- $req->{$key} = $value;
- }
- }
-}
-
1;