fix reported install issue
[catagits/Catalyst-Plugin-SubRequest.git] / lib / Catalyst / Plugin / SubRequest.pm
CommitLineData
aae30f91 1package Catalyst::Plugin::SubRequest;
2
3use strict;
61114b68 4use warnings;
f3f2edc9 5use Plack::Request;
aae30f91 6
4d21cbd4 7our $VERSION = '0.21';
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
8d59e5b8 76*subreq = \&sub_request;
77*subrequest = \&sub_request;
78*subreq_res = \&sub_request_response;
51589f61 79*subrequest_response = \&sub_request_response;
aae30f91 80
81sub sub_request {
8d59e5b8 82 return shift->sub_request_response(@_)->body;
87c672db 83}
84
85sub sub_request_response {
8d59e5b8 86 my ( $c, $path, $stash, $params ) = @_;
87 $stash ||= {};
88 my $env = $c->request->env;
89 my $req = Plack::Request->new($env);
90 my $uri = $req->uri;
91 $uri->query_form( $params || {} );
92 local $env->{QUERY_STRING} = $uri->query || '';
93 local $env->{PATH_INFO} = $path;
94 local $env->{REQUEST_URI} = $env->{SCRIPT_NAME} . $path;
4d21cbd4 95
96 # Jump through a few hoops for backcompat with pre 5.9007x
97 local($env->{&Catalyst::Middleware::Stash::PSGI_KEY}) = &Catalyst::Middleware::Stash::_create_stash()
98 if $INC{'Catalyst/Middleware/Stash.pm'};
99
8d59e5b8 100 $env->{REQUEST_URI} =~ s|//|/|g;
101 my $class = ref($c) || $c;
102
103 $c->stats->profile(
104 begin => 'subrequest: ' . $path,
105 comment => '',
106 ) if ( $c->debug );
107
108 # need this so that
109 my $writer = Catalyst::Plugin::SubRequest::Writer->new;
4d21cbd4 110 my $response_cb = sub {
111 my $response = shift;
112 my ($status, $headers, $body) = @$response;
113 if($body) {
114 return;
115 } else {
116 return $writer;
117 }
118 };
119
8d59e5b8 120 my $i_ctx = $class->prepare( env => $env, response_cb => $response_cb );
121 $i_ctx->stash($stash);
122 $i_ctx->dispatch;
123 $i_ctx->finalize;
124 $c->stats->profile( end => 'subrequest: ' . $path ) if $c->debug;
125
4d21cbd4 126 if($writer->_is_closed) {
127 $i_ctx->response->body($writer->body);
128 }
8d59e5b8 129
130 return $i_ctx->response;
aae30f91 131}
132
4d21cbd4 133
8d59e5b8 134package Catalyst::Plugin::SubRequest::Writer;
135use Moose;
136has body => (
137 isa => 'Str',
138 is => 'ro',
139 traits => ['String'],
140 default => '',
141 handles => { write => 'append' }
142);
143has _is_closed => ( isa => 'Bool', is => 'rw', default => 0 );
144sub close { shift->_is_closed(1) }
145
146around write => sub {
147 my $super = shift;
148 my $self = shift;
149 return if $self->_is_closed;
150 $self->$super(@_);
151};
152
aae30f91 153=head1 SEE ALSO
154
155L<Catalyst>.
156
61114b68 157=head1 AUTHORS
aae30f91 158
159Marcus Ramberg, C<mramberg@cpan.org>
160
61114b68 161Tomas Doran (t0m) C<< bobtfish@bobtfish.net >>
162
7b9c5d16 163=head1 MAINTAINERS
164
165Eden Cardim (edenc) C<eden@insoli.de>
166
aae30f91 167=head1 THANK YOU
168
169SRI, for writing the awesome Catalyst framework
d35825f6 170
7b9c5d16 171MIYAGAWA, for writing the awesome Plack toolkit
aae30f91 172
173=head1 COPYRIGHT
174
d7361335 175Copyright (c) 2005 - 2011
61114b68 176the Catalyst::Plugin::SubRequest L</AUTHORS>
85ec975f 177as listed above.
178
179=head1 LICENSE
180
aae30f91 181This program is free software, you can redistribute it and/or modify it under
182the same terms as Perl itself.
183
184=cut
185
1861;