1 package Catalyst::Plugin::SubRequest;
5 use Time::HiRes qw/tv_interval/;
11 Catalyst::Plugin::SubRequest - Make subrequests to actions in Catalyst
15 use Catalyst 'SubRequest';
17 my $res_body = $c->subreq('/test/foo/bar', { template => 'magic.tt' });
19 my $res_body = $c->subreq( {
20 path => '/test/foo/bar',
23 template => 'magic.tt'
26 # Get the full response object
27 my $res = $c->subreq_res('/test/foo/bar', {
28 template => 'mailz.tt'
32 $c->log->warn( $res->content_type );
36 Make subrequests to actions in Catalyst. Uses the catalyst
37 dispatcher, so it will work like an external url call.
38 Methods are provided both to get the body of the response and the full
39 response (L<Catalyst::Response>) object.
45 =item subreq [path as string or hash ref], [stash as hash ref], [parameters as hash ref]
49 Takes a full path to a path you'd like to dispatch to.
51 If the path is passed as a hash ref then it can include body, action,
54 An optional second argument as hashref can contain data to put into the
55 stash of the subrequest.
57 An optional third argument as hashref can contain data to pass as
58 parameters to the subrequest.
60 Returns the body of the response.
62 =item subreq_res [path as string or hash ref], [stash as hash ref], [parameters as hash ref]
64 =item sub_request_response
66 Like C<sub_request()>, but returns a full L<Catalyst::Response> object.
72 *subreq = \&sub_request;
73 *subreq_res = \&sub_request_response;
76 return shift->sub_request_response( @_ )->body ;
79 sub sub_request_response {
80 my ( $c, $path, $stash, $params ) = @_;
90 parameters => $params,
93 if (ref $path eq 'HASH') {
94 @request_mods{keys %$path} = values %$path;
96 $request_mods{path} = $path;
98 $request_mods{_body} = delete $request_mods{body};
100 my $fake_engine = bless(
102 orig_request => $c->req,
103 request_mods => \%request_mods,
105 'Catalyst::Plugin::SubRequest::Internal::FakeEngine'
111 no warnings 'redefine';
113 local *{"${class}::engine"} = sub { $fake_engine };
115 my $inner_ctx = $class->prepare;
117 $inner_ctx->stash($stash || {});
121 begin => 'subrequest: /' . $path,
125 $inner_ctx->dispatch;
127 $c->stats->profile( end => 'subrequest: /' . $path ) if ($c->debug);
129 return $inner_ctx->response;
138 Marcus Ramberg, C<mramberg@cpan.org>
140 Tomas Doran (t0m) C<< bobtfish@bobtfish.net >>
144 SRI, for writing the awesome Catalyst framework
148 Copyright (c) 2005 - 2008
149 the Catalyst::Plugin::SubRequest L</AUTHORS>
154 This program is free software, you can redistribute it and/or modify it under
155 the same terms as Perl itself.
159 package # hide from PAUSE
160 Catalyst::Plugin::SubRequest::Internal::FakeEngine;
162 sub AUTOLOAD { return 1; } # yeah yeah yeah
166 my $req = $c->request;
168 @{$req}{keys %{$self->{orig_request}}} = values %{$self->{orig_request}};
169 while (my ($key,$value) = each %{$self->{request_mods}}) {
170 if (my $mut = $req->can($key)) {
173 $req->{$key} = $value;