Version 0.17
[catagits/Catalyst-Plugin-SubRequest.git] / lib / Catalyst / Plugin / SubRequest.pm
CommitLineData
aae30f91 1package Catalyst::Plugin::SubRequest;
2
3use strict;
61114b68 4use warnings;
588fd7ac 5use Time::HiRes qw/tv_interval/;
aae30f91 6
d7361335 7our $VERSION = '0.17';
aae30f91 8
aae30f91 9=head1 NAME
10
11Catalyst::Plugin::SubRequest - Make subrequests to actions in Catalyst
12
13=head1 SYNOPSIS
14
15 use Catalyst 'SubRequest';
16
87c672db 17 my $res_body = $c->subreq('/test/foo/bar', { template => 'magic.tt' });
aae30f91 18
87c672db 19 my $res_body = $c->subreq( {
20 path => '/test/foo/bar',
21 body => $body
22 }, {
23 template => 'magic.tt'
24 });
25
26 # Get the full response object
27 my $res = $c->subreq_res('/test/foo/bar', {
28 template => 'mailz.tt'
29 }, {
30 param1 => 23
31 });
32 $c->log->warn( $res->content_type );
4f38f6a7 33
aae30f91 34=head1 DESCRIPTION
35
8c464987 36Make subrequests to actions in Catalyst. Uses the catalyst
37dispatcher, so it will work like an external url call.
87c672db 38Methods are provided both to get the body of the response and the full
39response (L<Catalyst::Response>) object.
aae30f91 40
41=head1 METHODS
42
a1e0150f 43=over 4
aae30f91 44
4f38f6a7 45=item subreq [path as string or hash ref], [stash as hash ref], [parameters as hash ref]
aae30f91 46
51589f61 47=item subrequest
48
aae30f91 49=item sub_request
50
4f38f6a7 51Takes a full path to a path you'd like to dispatch to.
87c672db 52
53If the path is passed as a hash ref then it can include body, action,
54match and path.
55
56An optional second argument as hashref can contain data to put into the
57stash of the subrequest.
58
59An optional third argument as hashref can contain data to pass as
60parameters to the subrequest.
61
62Returns the body of the response.
63
64=item subreq_res [path as string or hash ref], [stash as hash ref], [parameters as hash ref]
65
51589f61 66=item subrequest_response
67
87c672db 68=item sub_request_response
69
70Like C<sub_request()>, but returns a full L<Catalyst::Response> object.
aae30f91 71
a1e0150f 72=back
aae30f91 73
74=cut
75
76*subreq = \&sub_request;
51589f61 77*subrequest = \&sub_request;
87c672db 78*subreq_res = \&sub_request_response;
51589f61 79*subrequest_response = \&sub_request_response;
aae30f91 80
81sub sub_request {
87c672db 82 return shift->sub_request_response( @_ )->body ;
83}
84
85sub sub_request_response {
885f6da0 86 my ( $c, $path, $stash, $params ) = @_;
8c464987 87
5bd316a5 88 $path =~ s#^/##;
29ec3000 89
90 $params ||= {};
91
92 my %request_mods = (
93 body => undef,
94 action => undef,
95 match => undef,
96 parameters => $params,
97 );
98
99 if (ref $path eq 'HASH') {
100 @request_mods{keys %$path} = values %$path;
d7361335 101 $path = $path->{path};
29ec3000 102 } else {
103 $request_mods{path} = $path;
104 }
61114b68 105 $request_mods{_body} = delete $request_mods{body};
29ec3000 106
107 my $fake_engine = bless(
108 {
109 orig_request => $c->req,
110 request_mods => \%request_mods,
111 },
112 'Catalyst::Plugin::SubRequest::Internal::FakeEngine'
113 );
114
115 my $class = ref($c);
116
117 no strict 'refs';
118 no warnings 'redefine';
119
120 local *{"${class}::engine"} = sub { $fake_engine };
121
122 my $inner_ctx = $class->prepare;
123
124 $inner_ctx->stash($stash || {});
a1e0150f 125
126
6162c29a 127 $c->stats->profile(
128 begin => 'subrequest: /' . $path,
129 comment => '',
a1e0150f 130 ) if ($c->debug);
131
6162c29a 132 $inner_ctx->dispatch;
133
134 $c->stats->profile( end => 'subrequest: /' . $path ) if ($c->debug);
a1e0150f 135
87c672db 136 return $inner_ctx->response;
aae30f91 137}
138
139=head1 SEE ALSO
140
141L<Catalyst>.
142
61114b68 143=head1 AUTHORS
aae30f91 144
145Marcus Ramberg, C<mramberg@cpan.org>
146
61114b68 147Tomas Doran (t0m) C<< bobtfish@bobtfish.net >>
148
aae30f91 149=head1 THANK YOU
150
151SRI, for writing the awesome Catalyst framework
152
153=head1 COPYRIGHT
154
d7361335 155Copyright (c) 2005 - 2011
61114b68 156the Catalyst::Plugin::SubRequest L</AUTHORS>
85ec975f 157as listed above.
158
159=head1 LICENSE
160
aae30f91 161This program is free software, you can redistribute it and/or modify it under
162the same terms as Perl itself.
163
164=cut
165
29ec3000 166package # hide from PAUSE
167 Catalyst::Plugin::SubRequest::Internal::FakeEngine;
168
169sub AUTOLOAD { return 1; } # yeah yeah yeah
170
171sub prepare {
172 my ($self, $c) = @_;
173 my $req = $c->request;
a1e0150f 174
cc9f9d31 175 @{$req}{keys %{$self->{orig_request}}} = values %{$self->{orig_request}};
176 while (my ($key,$value) = each %{$self->{request_mods}}) {
597f0a02 177 if (my $mut = $req->can($key)) {
178 $req->$mut($value);
179 } else {
180 $req->{$key} = $value;
181 }
182 }
29ec3000 183}
184
aae30f91 1851;