1 package Catalyst::Engine::CGI;
4 use base 'Catalyst::Engine';
10 __PACKAGE__->mk_accessors('cgi');
14 Catalyst::Engine::CGI - The CGI Engine
18 A script using the Catalyst::Engine::CGI module might look like:
23 use lib '/path/to/MyApp/lib';
28 The application module (C<MyApp>) would use C<Catalyst>, which loads the
29 appropriate engine module.
33 This is the Catalyst engine specialized for the CGI environment (using the
34 C<CGI> and C<CGI::Cookie> modules). Normally Catalyst will select the
35 appropriate engine according to the environment that it detects, however you
36 can force Catalyst to use the CGI engine by specifying the following in your
39 use Catalyst qw(-Engine=CGI);
41 The performance of this way of using Catalyst is not expected to be
42 useful in production applications, but it may be helpful for development.
50 This config parameter contains the C<CGI> object.
54 =head1 OVERLOADED METHODS
56 This class overloads some methods from C<Catalyst::Engine>.
60 =item $c->finalize_body
62 Prints the response output to STDOUT.
68 print $c->response->output;
71 =item $c->finalize_headers
75 sub finalize_headers {
78 $c->response->header( Status => $c->response->status );
80 print $c->response->headers->as_string("\015\012");
84 =item $c->prepare_body
91 # XXX this is undocumented in CGI.pm. If Content-Type is not
92 # application/x-www-form-urlencoded or multipart/form-data
93 # CGI.pm will read STDIN into a param, POSTDATA.
95 $c->request->body( $c->cgi->param('POSTDATA') );
98 =item $c->prepare_connection
102 sub prepare_connection {
104 $c->req->hostname( $ENV{REMOTE_HOST} );
105 $c->req->address( $ENV{REMOTE_ADDR} );
108 =item $c->prepare_headers
112 sub prepare_headers {
115 while ( my ( $header, $value ) = each %ENV ) {
117 next unless $header =~ /^(HTTP|CONTENT)/i;
119 ( my $field = $header ) =~ s/^HTTPS?_//;
121 $c->req->headers->header( $field => $value );
124 $c->req->method( $ENV{REQUEST_METHOD} || 'GET' );
127 =item $c->prepare_parameters
131 sub prepare_parameters {
137 if ( $c->request->method eq 'POST' ) {
139 for my $param ( $c->cgi->url_param ) {
140 for my $value ( $c->cgi->url_param($param) ) {
141 push ( @params, $param, $value );
146 for my $param ( $c->cgi->param ) {
147 for my $value ( $c->cgi->param($param) ) {
148 push ( @params, $param, $value );
152 $c->req->_assign_values( $c->req->parameters, \@params );
155 =item $c->prepare_path
164 my $scheme = $ENV{HTTPS} ? 'https' : 'http';
165 my $host = $ENV{HTTP_HOST} || $ENV{SERVER_NAME};
166 my $port = $ENV{SERVER_PORT} || 80;
167 my $path = $ENV{SCRIPT_NAME} || '/';
170 $base->scheme($scheme);
175 $base = $base->canonical->as_string;
178 my $path = $ENV{PATH_INFO} || '/';
179 $path =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
182 $c->req->base($base);
183 $c->req->path($path);
186 =item $c->prepare_request
190 sub prepare_request {
191 my ( $c, $cgi ) = @_;
192 $c->cgi( $cgi || CGI->new );
193 $c->cgi->_reset_globals;
196 =item $c->prepare_uploads
200 sub prepare_uploads {
205 for my $param ( $c->cgi->param ) {
207 my @values = $c->cgi->param($param);
209 next unless ref( $values[0] );
211 for my $fh (@values) {
213 next unless my $size = ( stat $fh )[7];
215 my $info = $c->cgi->uploadInfo($fh);
216 my $tempname = $c->cgi->tmpFileName($fh);
217 my $type = $info->{'Content-Type'};
218 my $disposition = $info->{'Content-Disposition'};
219 my $filename = ( $disposition =~ / filename="([^;]*)"/ )[0];
221 my $upload = Catalyst::Request::Upload->new(
222 filename => $filename,
224 tempname => $tempname,
228 push( @uploads, $param, $upload );
232 $c->req->_assign_values( $c->req->uploads, \@uploads );
239 sub run { shift->handler }
249 Sebastian Riedel, C<sri@cpan.org>
253 This program is free software, you can redistribute it and/or modify it under
254 the same terms as Perl itself.