doc patch from Andrew Ford
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / CGI.pm
CommitLineData
fc7ec1d9 1package Catalyst::Engine::CGI;
2
3use strict;
4use base 'Catalyst::Engine';
5use URI;
6
7require CGI::Simple;
8require CGI::Cookie;
9
7833fdfc 10$CGI::Simple::POST_MAX = 1048576;
11$CGI::Simple::DISABLE_UPLOADS = 0;
12
fc7ec1d9 13__PACKAGE__->mk_accessors('cgi');
14
15=head1 NAME
16
17Catalyst::Engine::CGI - The CGI Engine
18
19=head1 SYNOPSIS
20
23f9d934 21A script using the Catalyst::Engine::CGI module might look like:
22
9a33da6a 23 #!/usr/bin/perl -w
24
25 use strict;
26 use lib '/path/to/MyApp/lib';
27 use MyApp;
28
29 MyApp->run;
30
23f9d934 31The application module (C<MyApp>) would use C<Catalyst>, which loads the
32appropriate engine module.
fc7ec1d9 33
34=head1 DESCRIPTION
35
23f9d934 36This is the Catalyst engine specialized for the CGI environment (using the
37C<CGI::Simple> and C<CGI::Cookie> modules). Normally Catalyst will select the
38appropriate engine according to the environment that it detects, however you
39can force Catalyst to use the CGI engine by specifying the following in your
40application module:
41
42 use Catalyst qw(-Engine=CGI);
fc7ec1d9 43
23f9d934 44Catalyst::Engine::CGI generates a full set of HTTP headers, which means that
45applications using the engine must be be configured as "Non-parsed Headers"
46scripts (at least when running under Apache). To configure this under Apache
47name the starting with C<nph->.
9a33da6a 48
49The performance of this way of using Catalyst is not expected to be
50useful in production applications, but it may be helpful for development.
51
23f9d934 52=head1 METHODS
fc7ec1d9 53
23f9d934 54=over 4
55
56=item $c->run
fc7ec1d9 57
58To be called from a CGI script to start the Catalyst application.
59
23f9d934 60=item $c->cgi
fc7ec1d9 61
62This config parameter contains the C<CGI::Simple> object.
63
23f9d934 64=back
65
66=head1 OVERLOADED METHODS
fc7ec1d9 67
68This class overloads some methods from C<Catalyst>.
69
23f9d934 70=over 4
71
72=item $c->finalize_headers
fc7ec1d9 73
74=cut
75
76sub finalize_headers {
77 my $c = shift;
78 my %headers = ( -nph => 1 );
79 $headers{-status} = $c->response->status if $c->response->status;
80 for my $name ( $c->response->headers->header_field_names ) {
81 $headers{"-$name"} = $c->response->headers->header($name);
82 }
83 my @cookies;
84 while ( my ( $name, $cookie ) = each %{ $c->response->cookies } ) {
85 push @cookies, $c->cgi->cookie(
86 -name => $name,
87 -value => $cookie->{value},
88 -expires => $cookie->{expires},
89 -domain => $cookie->{domain},
90 -path => $cookie->{path},
91 -secure => $cookie->{secure} || 0
92 );
93 }
94 $headers{-cookie} = \@cookies if @cookies;
95 print $c->cgi->header(%headers);
96}
97
23f9d934 98=item $c->finalize_output
99
100Prints the response output to STDOUT.
fc7ec1d9 101
102=cut
103
104sub finalize_output {
105 my $c = shift;
106 print $c->response->output;
107}
108
23f9d934 109=item $c->prepare_cookies
110
111Sets up cookies.
fc7ec1d9 112
113=cut
114
115sub prepare_cookies { shift->req->cookies( { CGI::Cookie->fetch } ) }
116
23f9d934 117=item $c->prepare_headers
fc7ec1d9 118
119=cut
120
121sub prepare_headers {
122 my $c = shift;
123 $c->req->method( $c->cgi->request_method );
124 for my $header ( $c->cgi->http ) {
125 ( my $field = $header ) =~ s/^HTTPS?_//;
126 $c->req->headers->header( $field => $c->cgi->http($header) );
127 }
128}
129
23f9d934 130=item $c->prepare_parameters
fc7ec1d9 131
132=cut
133
134sub prepare_parameters {
135 my $c = shift;
136 my %vars = $c->cgi->Vars;
137 while ( my ( $key, $value ) = each %vars ) {
138 my @values = split "\0", $value;
139 $vars{$key} = @values <= 1 ? $values[0] : \@values;
140 }
141 $c->req->parameters( {%vars} );
142}
143
23f9d934 144=item $c->prepare_path
fc7ec1d9 145
146=cut
147
148sub prepare_path {
149 my $c = shift;
150 $c->req->path( $c->cgi->url( -absolute => 1, -path_info => 1 ) );
151 my $loc = $c->cgi->url( -absolute => 1 );
152 no warnings 'uninitialized';
153 $c->req->{path} =~ s/^($loc)?\///;
154 $c->req->{path} .= '/' if $c->req->path eq $loc;
155 my $base = $c->cgi->url;
7833fdfc 156 if ( $ENV{CATALYST_TEST} ) {
157 my $script = $c->cgi->script_name;
158 $base =~ s/$script$//i;
159 }
fc7ec1d9 160 $base = URI->new($base);
161 $base->path('/') if ( $ENV{CATALYST_TEST} || !$base->path );
162 $c->req->base( $base->as_string );
163}
164
23f9d934 165=item $c->prepare_request
fc7ec1d9 166
167=cut
168
169sub prepare_request { shift->cgi( CGI::Simple->new ) }
170
23f9d934 171=item $c->prepare_uploads
fc7ec1d9 172
173=cut
174
175sub prepare_uploads {
176 my $c = shift;
177 for my $name ( $c->cgi->upload ) {
fc7ec1d9 178 $c->req->uploads->{$name} = {
7833fdfc 179 fh => $c->cgi->upload($name),
180 size => $c->cgi->upload_info( $name, 'size' ),
181 type => $c->cgi->upload_info( $name, 'mime' )
fc7ec1d9 182 };
183 }
184}
185
186sub run { shift->handler }
187
23f9d934 188=back
189
fc7ec1d9 190=head1 SEE ALSO
191
192L<Catalyst>.
193
194=head1 AUTHOR
195
196Sebastian Riedel, C<sri@cpan.org>
197
198=head1 COPYRIGHT
199
200This program is free software, you can redistribute it and/or modify it under
201the same terms as Perl itself.
202
203=cut
204
2051;