X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine.pm;h=0c8929a0b9b9d91d049b6d45c606bff2f3f9b4c0;hb=7257e9dbc2d2550e43b0ddeb1027360428a3c44f;hp=49dff2590b3d4808d831d26f307ff60bdc124808;hpb=d82cc9aef963f7e5c8da3f5586a271a2655cc635;p=catagits%2FCatalyst-Runtime.git
diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm
index 49dff25..0c8929a 100644
--- a/lib/Catalyst/Engine.pm
+++ b/lib/Catalyst/Engine.pm
@@ -30,9 +30,6 @@ See L.
=head1 METHODS
-=head2 $self->finalize_output
-
-, see finalize_body
=head2 $self->finalize_body($c)
@@ -42,20 +39,23 @@ Finalize body. Prints the response output.
sub finalize_body {
my ( $self, $c ) = @_;
- if ( ref $c->response->body && $c->response->body->can('read') ) {
- while ( !$c->response->body->eof() ) {
- $c->response->body->read( my $buffer, $CHUNKSIZE );
+ my $body = $c->response->body;
+ if ( ref $body && ($body->can('read') || ref($body) eq 'GLOB') ) {
+ while ( !eof $body ) {
+ read $body, my $buffer, $CHUNKSIZE;
last unless $self->write( $c, $buffer );
}
- $c->response->body->close();
+ close $body;
}
else {
- $self->write( $c, $c->response->body );
+ $self->write( $c, $body );
}
}
=head2 $self->finalize_cookies($c)
+Create CGI::Cookies from $c->res->cookies, and set them as response headers.
+
=cut
sub finalize_cookies {
@@ -83,6 +83,10 @@ sub finalize_cookies {
=head2 $self->finalize_error($c)
+Output an apropriate error message, called if there's an error in $c
+after the dispatch has finished. Will output debug messages if Catalyst
+is in debug mode, or a `please come back later` message otherwise.
+
=cut
sub finalize_error {
@@ -102,7 +106,7 @@ sub finalize_error {
. '
'
} @{ $c->error };
$error ||= 'No output';
- $error = "$error
";
+ $error = qq{$error
};
$title = $name = "$name on Catalyst $Catalyst::VERSION";
$name = "$name
";
@@ -128,7 +132,7 @@ sub finalize_error {
push @infos, sprintf <<"EOF", $name, $value;
EOF
$i++;
@@ -233,6 +237,15 @@ EOF
font-size: medium;
font-weight: normal;
}
+ /* from http://users.tkk.fi/~tkarvine/linux/doc/pre-wrap/pre-wrap-css3-mozilla-opera-ie.html */
+ /* Browser specific (not valid) styles to make preformatted text wrap */
+ pre {
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+ }
@@ -249,11 +262,13 @@ EOF
$c->res->{body} .= ( ' ' x 512 );
# Return 500
- $c->res->status(500) unless $c->res->status;
+ $c->res->status(500);
}
=head2 $self->finalize_headers($c)
+Abstract method, allows engines to write headers to response
+
=cut
sub finalize_headers { }
@@ -270,6 +285,8 @@ sub finalize_read {
=head2 $self->finalize_uploads($c)
+Clean up after uploads, deleting temp files.
+
=cut
sub finalize_uploads {
@@ -287,6 +304,8 @@ sub finalize_uploads {
=head2 $self->prepare_body($c)
+sets up the L object body using L
+
=cut
sub prepare_body {
@@ -297,17 +316,27 @@ sub prepare_body {
unless ( $c->request->{_body} ) {
$c->request->{_body} = HTTP::Body->new( $type, $self->read_length );
+ $c->request->{_body}->{tmpdir} = $c->config->{uploadtmp} if exists $c->config->{uploadtmp};
}
if ( $self->read_length > 0 ) {
while ( my $buffer = $self->read($c) ) {
$c->prepare_body_chunk($buffer);
}
+
+ # paranoia against wrong Content-Length header
+ my $remaining = $self->read_length - $self->read_position;
+ if ($remaining > 0) {
+ $self->finalize_read($c);
+ Catalyst::Exception->throw("Wrong Content-Length value: ". $self->read_length);
+ }
}
}
=head2 $self->prepare_body_chunk($c)
+Add a chunk to the request body.
+
=cut
sub prepare_body_chunk {
@@ -318,6 +347,8 @@ sub prepare_body_chunk {
=head2 $self->prepare_body_parameters($c)
+Sets up parameters from body.
+
=cut
sub prepare_body_parameters {
@@ -327,12 +358,16 @@ sub prepare_body_parameters {
=head2 $self->prepare_connection($c)
+Abstract method implemented in engines.
+
=cut
sub prepare_connection { }
=head2 $self->prepare_cookies($c)
+Parse cookies from header. Sets a L object.
+
=cut
sub prepare_cookies {
@@ -351,6 +386,8 @@ sub prepare_headers { }
=head2 $self->prepare_parameters($c)
+sets up parameters from query and post parameters.
+
=cut
sub prepare_parameters {
@@ -378,6 +415,8 @@ sub prepare_parameters {
=head2 $self->prepare_path($c)
+abstract method, implemented by engines.
+
=cut
sub prepare_path { }
@@ -386,6 +425,8 @@ sub prepare_path { }
=head2 $self->prepare_query_parameters($c)
+process the query string and extract query parameters.
+
=cut
sub prepare_query_parameters {
@@ -404,6 +445,8 @@ sub prepare_query_parameters {
=head2 $self->prepare_read($c)
+prepare to read from the engine.
+
=cut
sub prepare_read {
@@ -415,6 +458,8 @@ sub prepare_read {
=head2 $self->prepare_request(@arguments)
+Populate the context object from the request object.
+
=cut
sub prepare_request { }
@@ -450,6 +495,8 @@ sub prepare_uploads {
=head2 $self->prepare_write($c)
+Abstract method. Implemented by the engines.
+
=cut
sub prepare_write { }
@@ -507,12 +554,16 @@ The amount of input data that has already been read.
=head2 $self->run($c)
+Start the engine. Implemented by the various engine classes.
+
=cut
sub run { }
=head2 $self->write($c, $buffer)
+Writes the buffer to the client. Can only be called once for a request.
+
=cut
sub write {
@@ -526,6 +577,10 @@ sub write {
print STDOUT $buffer;
}
+=head2 $self->finalize_output
+
+, see finalize_body
+
=head1 AUTHORS
Sebastian Riedel,