Minor performance tweaks, added $c->request->user
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / CGI.pm
CommitLineData
fc7ec1d9 1package Catalyst::Engine::CGI;
2
3use strict;
c2e8e6fa 4use base 'Catalyst::Engine::CGI::Base';
e7c0c583 5
6use CGI;
fc7ec1d9 7
66294129 8our @compile = qw[
9 delete
10 http
11 new_MultipartBuffer
12 param
13 parse_keywordlist
14 read_from_client
15 read_multipart
16 tmpFileName
17 uploadInfo
18 url_param
19 user_agent
20];
21
22CGI->compile(@compile);
23
e2fd5b5f 24__PACKAGE__->mk_accessors('cgi');
25
fc7ec1d9 26=head1 NAME
27
28Catalyst::Engine::CGI - The CGI Engine
29
30=head1 SYNOPSIS
31
23f9d934 32A script using the Catalyst::Engine::CGI module might look like:
33
9a33da6a 34 #!/usr/bin/perl -w
35
36 use strict;
37 use lib '/path/to/MyApp/lib';
38 use MyApp;
39
40 MyApp->run;
41
23f9d934 42The application module (C<MyApp>) would use C<Catalyst>, which loads the
43appropriate engine module.
fc7ec1d9 44
45=head1 DESCRIPTION
46
23f9d934 47This is the Catalyst engine specialized for the CGI environment (using the
66294129 48C<CGI> and C<CGI::Cookie> modules).
9a33da6a 49
e2fd5b5f 50=head1 METHODS
51
52=over 4
53
54=item $c->cgi
55
56Contains the C<CGI> object.
57
58=back
59
23f9d934 60=head1 OVERLOADED METHODS
fc7ec1d9 61
c2e8e6fa 62This class overloads some methods from C<Catalyst::Engine::CGI::Base>.
fc7ec1d9 63
23f9d934 64=over 4
65
06e1b616 66=item $c->prepare_body
fc7ec1d9 67
68=cut
69
06e1b616 70sub prepare_body {
fc7ec1d9 71 my $c = shift;
06e1b616 72
73 # XXX this is undocumented in CGI.pm. If Content-Type is not
74 # application/x-www-form-urlencoded or multipart/form-data
75 # CGI.pm will read STDIN into a param, POSTDATA.
76
e060fe05 77 $c->request->body( $c->cgi->param('POSTDATA') );
fc7ec1d9 78}
79
23f9d934 80=item $c->prepare_parameters
fc7ec1d9 81
82=cut
83
84sub prepare_parameters {
e7c0c583 85 my $c = shift;
bfde09a2 86
5b387dfc 87 my ( @params );
bfde09a2 88
b9e9fff6 89 if ( $c->request->method eq 'POST' ) {
b9e9fff6 90 for my $param ( $c->cgi->url_param ) {
91 for my $value ( $c->cgi->url_param($param) ) {
92 push ( @params, $param, $value );
93 }
5b387dfc 94 }
fc7ec1d9 95 }
08cf3dd6 96
bfde09a2 97 for my $param ( $c->cgi->param ) {
08cf3dd6 98 for my $value ( $c->cgi->param($param) ) {
5b387dfc 99 push ( @params, $param, $value );
100 }
101 }
bfde09a2 102
103 $c->request->param(@params);
fc7ec1d9 104}
105
23f9d934 106=item $c->prepare_request
fc7ec1d9 107
108=cut
109
bfde09a2 110sub prepare_request {
316bf0f0 111 my ( $c, $object ) = @_;
112
113 my $cgi;
114
115 if ( defined($object) && ref($object) ) {
116
117 if ( $object->isa('Apache') ) { # MP 1.3
118 $cgi = CGI->new($object);
119 }
120
121 elsif ( $object->isa('Apache::RequestRec') ) { # MP 1.99
122 $cgi = CGI->new($object);
123 }
124
125 elsif ( $object->isa('Apache2::RequestRec') ) { # MP 2.00
126 $cgi = CGI->new($object);
127 }
128
129 elsif ( $object->isa('CGI') ) {
130 $cgi = $object;
131 }
132
133 else {
134 my $class = ref($object);
135 die( qq/Invalid argument $object/ );
136 }
137 }
138
3f822a28 139 $c->cgi( $cgi || CGI->new );
e7c0c583 140}
fc7ec1d9 141
23f9d934 142=item $c->prepare_uploads
fc7ec1d9 143
144=cut
145
146sub prepare_uploads {
147 my $c = shift;
e7c0c583 148
149 my @uploads;
bfde09a2 150
e7c0c583 151 for my $param ( $c->cgi->param ) {
bfde09a2 152
e7c0c583 153 my @values = $c->cgi->param($param);
154
155 next unless ref( $values[0] );
156
157 for my $fh (@values) {
158
159 next unless my $size = ( stat $fh )[7];
160
161 my $info = $c->cgi->uploadInfo($fh);
162 my $tempname = $c->cgi->tmpFileName($fh);
163 my $type = $info->{'Content-Type'};
164 my $disposition = $info->{'Content-Disposition'};
165 my $filename = ( $disposition =~ / filename="([^;]*)"/ )[0];
166
146554c5 167 my $upload = Catalyst::Request::Upload->new(
e7c0c583 168 filename => $filename,
169 size => $size,
170 tempname => $tempname,
171 type => $type
146554c5 172 );
bfde09a2 173
e7c0c583 174 push( @uploads, $param, $upload );
175 }
fc7ec1d9 176 }
bfde09a2 177
178 $c->request->upload(@uploads);
fc7ec1d9 179}
180
23f9d934 181=back
182
fc7ec1d9 183=head1 SEE ALSO
184
c2e8e6fa 185L<Catalyst> L<Catalyst::Engine> L<Catalyst::Engine::CGI::Base>.
fc7ec1d9 186
187=head1 AUTHOR
188
189Sebastian Riedel, C<sri@cpan.org>
c2e8e6fa 190Christian Hansen, C<ch@ngmedia.com>
fc7ec1d9 191
192=head1 COPYRIGHT
193
194This program is free software, you can redistribute it and/or modify it under
195the same terms as Perl itself.
196
197=cut
198
1991;