clean up logging and debug output, minor doc fixes
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine.pm
index 44176bc..80ff49f 100644 (file)
@@ -30,9 +30,6 @@ See L<Catalyst>.
 
 =head1 METHODS
 
-=head2 $self->finalize_output
-
-<obsolete>, 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,13 +83,17 @@ 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 {
     my ( $self, $c ) = @_;
 
     $c->res->content_type('text/html; charset=utf-8');
-    my $name = $c->config->{name} || 'Catalyst Application';
+    my $name = $c->config->{name} || join(' ', split('::', ref $c));
 
     my ( $title, $error, $infos );
     if ( $c->debug ) {
@@ -116,9 +120,9 @@ sub finalize_error {
         # Don't show response header state in dump
         delete $c->res->{_finalized_headers};
 
-        my $req   = encode_entities Dumper $c->req;
-        my $res   = encode_entities Dumper $c->res;
-        my $stash = encode_entities Dumper $c->stash;
+        my $req   = _fixup_debug_info($c->req);
+        my $res   = _fixup_debug_info($c->res);
+        my $stash = _fixup_debug_info($c->stash);
 
         my @infos;
         my $i = 0;
@@ -141,6 +145,7 @@ EOF
         $infos = <<"";
 <pre>
 (en) Please come back later
+(fr) SVP veuillez revenir plus tard
 (de) Bitte versuchen sie es spaeter nocheinmal
 (at) Konnten's bitt'schoen spaeter nochmal reinschauen
 (no) Vennligst prov igjen senere
@@ -175,13 +180,13 @@ EOF
         body {
             font-family: "Bitstream Vera Sans", "Trebuchet MS", Verdana,
                          Tahoma, Arial, helvetica, sans-serif;
-            color: #ddd;
+            color: #333;
             background-color: #eee;
             margin: 0px;
             padding: 0px;
         }
         :link, :link:hover, :visited, :visited:hover {
-            color: #ddd;
+            color: #000;
         }
         div.box {
             position: relative;
@@ -189,30 +194,26 @@ EOF
             border: 1px solid #aaa;
             padding: 4px;
             margin: 10px;
-            -moz-border-radius: 10px;
         }
         div.error {
-            background-color: #977;
+            background-color: #cce;
             border: 1px solid #755;
             padding: 8px;
             margin: 4px;
             margin-bottom: 10px;
-            -moz-border-radius: 10px;
         }
         div.infos {
-            background-color: #797;
+            background-color: #eee;
             border: 1px solid #575;
             padding: 8px;
             margin: 4px;
             margin-bottom: 10px;
-            -moz-border-radius: 10px;
         }
         div.name {
-            background-color: #779;
+            background-color: #cce;
             border: 1px solid #557;
             padding: 8px;
             margin: 4px;
-            -moz-border-radius: 10px;
         }
         code.error {
             display: block;
@@ -263,6 +264,8 @@ EOF
 
 =head2 $self->finalize_headers($c)
 
+Abstract method, allows engines to write headers to response
+
 =cut
 
 sub finalize_headers { }
@@ -279,6 +282,8 @@ sub finalize_read {
 
 =head2 $self->finalize_uploads($c)
 
+Clean up after uploads, deleting temp files.
+
 =cut
 
 sub finalize_uploads {
@@ -296,6 +301,8 @@ sub finalize_uploads {
 
 =head2 $self->prepare_body($c)
 
+sets up the L<Catalyst::Request> object body using L<HTTP::Body>
+
 =cut
 
 sub prepare_body {
@@ -306,17 +313,29 @@ 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 {
@@ -327,6 +346,8 @@ sub prepare_body_chunk {
 
 =head2 $self->prepare_body_parameters($c)
 
+Sets up parameters from body. 
+
 =cut
 
 sub prepare_body_parameters {
@@ -336,12 +357,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<CGI::Cookie> object.
+
 =cut
 
 sub prepare_cookies {
@@ -360,6 +385,8 @@ sub prepare_headers { }
 
 =head2 $self->prepare_parameters($c)
 
+sets up parameters from query and post parameters.
+
 =cut
 
 sub prepare_parameters {
@@ -387,6 +414,8 @@ sub prepare_parameters {
 
 =head2 $self->prepare_path($c)
 
+abstract method, implemented by engines.
+
 =cut
 
 sub prepare_path { }
@@ -395,6 +424,8 @@ sub prepare_path { }
 
 =head2 $self->prepare_query_parameters($c)
 
+process the query string and extract query parameters.
+
 =cut
 
 sub prepare_query_parameters {
@@ -413,6 +444,8 @@ sub prepare_query_parameters {
 
 =head2 $self->prepare_read($c)
 
+prepare to read from the engine.
+
 =cut
 
 sub prepare_read {
@@ -424,6 +457,8 @@ sub prepare_read {
 
 =head2 $self->prepare_request(@arguments)
 
+Populate the context object from the request object.
+
 =cut
 
 sub prepare_request { }
@@ -459,6 +494,8 @@ sub prepare_uploads {
 
 =head2 $self->prepare_write($c)
 
+Abstract method. Implemented by the engines.
+
 =cut
 
 sub prepare_write { }
@@ -516,12 +553,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 {
@@ -535,6 +576,17 @@ sub write {
     print STDOUT $buffer;
 }
 
+sub _fixup_debug_info {
+    my $info   = encode_entities Dumper shift;
+     my @info = split "\n", $info; 
+     pop @info; shift @info;
+     return join "\n",@info;    
+}
+
+=head2 $self->finalize_output
+
+<obsolete>, see finalize_body
+
 =head1 AUTHORS
 
 Sebastian Riedel, <sri@cpan.org>