new release.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Request.pm
CommitLineData
fc7ec1d9 1package Catalyst::Request;
2
3use strict;
4use base 'Class::Accessor::Fast';
5
b4ca0ee8 6use IO::Socket qw[AF_INET inet_aton];
7
fc7ec1d9 8__PACKAGE__->mk_accessors(
b4ca0ee8 9 qw/action address arguments body base cookies headers match method
10 parameters path protocol secure snippets uploads user/
fc7ec1d9 11);
12
13*args = \&arguments;
e060fe05 14*input = \&body;
fc7ec1d9 15*params = \&parameters;
16
f7e4e231 17sub content_encoding { shift->headers->content_encoding(@_) }
18sub content_length { shift->headers->content_length(@_) }
19sub content_type { shift->headers->content_type(@_) }
20sub header { shift->headers->header(@_) }
21sub referer { shift->headers->referer(@_) }
22sub user_agent { shift->headers->user_agent(@_) }
23
fc7ec1d9 24=head1 NAME
25
26Catalyst::Request - Catalyst Request Class
27
28=head1 SYNOPSIS
29
b22c6668 30
31 $req = $c->request;
32 $req->action;
33 $req->address;
34 $req->args;
35 $req->arguments;
36 $req->base;
06e1b616 37 $req->body;
b5176d9e 38 $req->content_encoding;
39 $req->content_length;
40 $req->content_type;
b22c6668 41 $req->cookies;
b5176d9e 42 $req->header;
b22c6668 43 $req->headers;
44 $req->hostname;
61bacdcc 45 $req->input;
b22c6668 46 $req->match;
47 $req->method;
e7c0c583 48 $req->param;
b22c6668 49 $req->params;
e7c0c583 50 $req->parameters;
b22c6668 51 $req->path;
bfde09a2 52 $req->protocol;
b5176d9e 53 $req->referer;
bfde09a2 54 $req->secure;
b22c6668 55 $req->snippets;
e7c0c583 56 $req->upload;
b22c6668 57 $req->uploads;
77d12cae 58 $req->uri;
66294129 59 $req->user;
60 $req->user_agent;
b22c6668 61
62See also L<Catalyst>.
fc7ec1d9 63
64=head1 DESCRIPTION
65
b22c6668 66This is the Catalyst Request class, which provides a set of accessors to the
67request data. The request object is prepared by the specialized Catalyst
68Engine module thus hiding the details of the particular engine implementation.
69
70
71=head1 METHODS
fc7ec1d9 72
b22c6668 73=over 4
fc7ec1d9 74
b22c6668 75=item $req->action
fc7ec1d9 76
61b1e958 77Contains the requested action.
fc7ec1d9 78
79 print $c->request->action;
80
b22c6668 81=item $req->address
0556eb49 82
83Contains the remote address.
84
85 print $c->request->address
86
b22c6668 87=item $req->args
88
61b1e958 89Shortcut for arguments
90
91=item $req->arguments
92
b22c6668 93Returns a reference to an array containing the arguments.
fc7ec1d9 94
95 print $c->request->arguments->[0];
96
b22c6668 97=item $req->base
fc7ec1d9 98
61b1e958 99Contains the url base. This will always have a trailing slash.
fc7ec1d9 100
06e1b616 101=item $req->body
102
e060fe05 103Contains the message body of the request unless Content-Type is
104C<application/x-www-form-urlencoded> or C<multipart/form-data>.
105
106 print $c->request->body
06e1b616 107
b5176d9e 108=item $req->content_encoding
109
110Shortcut to $req->headers->content_encoding
111
112=item $req->content_length
113
114Shortcut to $req->headers->content_length
115
116=item $req->content_type
117
118Shortcut to $req->headers->content_type
119
b22c6668 120=item $req->cookies
fc7ec1d9 121
b22c6668 122Returns a reference to a hash containing the cookies.
fc7ec1d9 123
124 print $c->request->cookies->{mycookie}->value;
125
b5176d9e 126=item $req->header
127
128Shortcut to $req->headers->header
129
b22c6668 130=item $req->headers
fc7ec1d9 131
b22c6668 132Returns an L<HTTP::Headers> object containing the headers.
fc7ec1d9 133
134 print $c->request->headers->header('X-Catalyst');
135
b22c6668 136=item $req->hostname
0556eb49 137
b4ca0ee8 138Lookup the current users DNS hostname.
0556eb49 139
140 print $c->request->hostname
b4ca0ee8 141
142=cut
143
144sub hostname {
145 my $self = shift;
146
147 if ( @_ ) {
148 $self->{hostname} = shift;
99386274 149 return $self->{hostname};
b4ca0ee8 150 }
151
152 unless ( $self->{hostname} ) {
153 $self->{hostname} = gethostbyaddr( inet_aton( $self->address ), AF_INET );
154 }
155
156 return $self->{hostname};
157}
0556eb49 158
61bacdcc 159=item $req->input
160
e060fe05 161Shortcut for $req->body.
61bacdcc 162
b22c6668 163=item $req->match
fc7ec1d9 164
e7c0c583 165This contains be the matching part of a regexp action. otherwise it
61b1e958 166returns the same as 'action'.
fc7ec1d9 167
168 print $c->request->match;
169
b5176d9e 170=item $req->method
171
172Contains the request method (C<GET>, C<POST>, C<HEAD>, etc).
173
e7c0c583 174 print $c->request->method;
175
176=item $req->param
177
178Get request parameters with a CGI.pm like param method.
179
180 $value = $c->request->param('foo');
181 @values = $c->request->param('foo');
182 @params = $c->request->param;
183
184=cut
185
186sub param {
187 my $self = shift;
188
189 if ( @_ == 0 ) {
190 return keys %{ $self->parameters };
191 }
192
bfde09a2 193 if ( @_ == 1 ) {
e7c0c583 194
bfde09a2 195 my $param = shift;
6bd2b72c 196
bfde09a2 197 unless ( exists $self->parameters->{$param} ) {
198 return wantarray ? () : undef;
199 }
200
201 if ( ref $self->parameters->{$param} eq 'ARRAY' ) {
202 return (wantarray)
203 ? @{ $self->parameters->{$param} }
204 : $self->parameters->{$param}->[0];
205 }
206 else {
207 return (wantarray)
208 ? ( $self->parameters->{$param} )
209 : $self->parameters->{$param};
210 }
d7945f32 211 }
bfde09a2 212
03222156 213 if ( @_ > 1 ) {
bfde09a2 214
215 while ( my ( $field, $value ) = splice( @_, 0, 2 ) ) {
a4def412 216
217 next unless defined $field;
bfde09a2 218
219 if ( exists $self->parameters->{$field} ) {
220 for ( $self->parameters->{$field} ) {
221 $_ = [$_] unless ref($_) eq "ARRAY";
222 push( @$_, $value );
223 }
224 }
225 else {
226 $self->parameters->{$field} = $value;
227 }
228 }
d7945f32 229 }
e7c0c583 230}
b5176d9e 231
b22c6668 232=item $req->params
fc7ec1d9 233
61b1e958 234Shortcut for $req->parameters.
235
236=item $req->parameters
237
e7c0c583 238Returns a reference to a hash containing parameters. Values can
239be either a scalar or a arrayref containing scalars.
fc7ec1d9 240
e7c0c583 241 print $c->request->parameters->{field};
242 print $c->request->parameters->{field}->[0];
fc7ec1d9 243
b22c6668 244=item $req->path
fc7ec1d9 245
246Contains the path.
247
248 print $c->request->path;
249
bfde09a2 250=item $req->protocol
251
252Contains the protocol.
253
b5176d9e 254=item $req->referer
fc7ec1d9 255
61b1e958 256Shortcut to $req->headers->referer. Referring page.
fc7ec1d9 257
bfde09a2 258=item $req->secure
259
260Contains a boolean whether the communciation is secure.
261
b22c6668 262=item $req->snippets
fc7ec1d9 263
b22c6668 264Returns a reference to an array containing regex snippets.
fc7ec1d9 265
266 my @snippets = @{ $c->request->snippets };
267
e7c0c583 268=item $req->upload
269
270A convenient method to $req->uploads.
271
272 $upload = $c->request->upload('field');
273 @uploads = $c->request->upload('field');
274 @fields = $c->request->upload;
bfde09a2 275
e7c0c583 276 for my $upload ( $c->request->upload('field') ) {
146554c5 277 print $upload->filename;
e7c0c583 278 }
279
280=cut
281
282sub upload {
283 my $self = shift;
284
285 if ( @_ == 0 ) {
286 return keys %{ $self->uploads };
287 }
288
bfde09a2 289 if ( @_ == 1 ) {
e7c0c583 290
bfde09a2 291 my $upload = shift;
292
293 unless ( exists $self->uploads->{$upload} ) {
294 return wantarray ? () : undef;
295 }
6bd2b72c 296
bfde09a2 297 if ( ref $self->uploads->{$upload} eq 'ARRAY' ) {
298 return (wantarray)
299 ? @{ $self->uploads->{$upload} }
300 : $self->uploads->{$upload}->[0];
301 }
302 else {
303 return (wantarray)
304 ? ( $self->uploads->{$upload} )
305 : $self->uploads->{$upload};
306 }
d7945f32 307 }
bfde09a2 308
a4f5c51e 309 if ( @_ > 1 ) {
bfde09a2 310
311 while ( my ( $field, $upload ) = splice( @_, 0, 2 ) ) {
312
313 if ( exists $self->uploads->{$field} ) {
314 for ( $self->uploads->{$field} ) {
315 $_ = [$_] unless ref($_) eq "ARRAY";
316 push( @$_, $upload );
317 }
318 }
319 else {
320 $self->uploads->{$field} = $upload;
321 }
322 }
e7c0c583 323 }
324}
325
b22c6668 326=item $req->uploads
fc7ec1d9 327
bfde09a2 328Returns a reference to a hash containing uploads. Values can be either a
146554c5 329hashref or a arrayref containing C<Catalyst::Request::Upload> objects.
e7c0c583 330
331 my $upload = $c->request->uploads->{field};
332 my $upload = $c->request->uploads->{field}->[0];
333
77d12cae 334=item $req->uri
335
336Shortcut for C<< $req->base . $req->path >>.
337
338=cut
339
340sub uri {
341 my $self = shift;
342 my $path = shift || $self->path || '';
343 return $self->base . $path;
344}
345
66294129 346=item $req->user
347
348Contains the user name of user if authentication check was successful.
349
b5176d9e 350=item $req->user_agent
351
61b1e958 352Shortcut to $req->headers->user_agent. User Agent version string.
b5176d9e 353
b22c6668 354=back
355
fc7ec1d9 356=head1 AUTHOR
357
358Sebastian Riedel, C<sri@cpan.org>
61b1e958 359Marcus Ramberg, C<mramberg@cpan.org>
fc7ec1d9 360
361=head1 COPYRIGHT
362
e7c0c583 363This program is free software, you can redistribute it and/or modify
61b1e958 364it under the same terms as Perl itself.
fc7ec1d9 365
366=cut
367
3681;