Return an error page in the proper format, depending on the content 
type of the page.

        Patch by fu. 

diffs (110 lines):

diff -r 3ec2525b0c3e -r 5288d9d5a226 cgi-bin/DW/Request/Standard.pm
--- a/cgi-bin/DW/Request/Standard.pm    Mon Jan 03 15:51:45 2011 -0600
+++ b/cgi-bin/DW/Request/Standard.pm    Tue Jan 04 08:17:10 2011 +0800
@@ -282,6 +282,7 @@ sub OK        { return 200; }
 sub OK        { return 200; }
 sub REDIRECT  { return 302; }
 sub NOT_FOUND { return 404; }
+sub HTTP_SERVER_ERROR { return 500; }
 
 # spawn a process for an external program
 sub spawn {
diff -r 3ec2525b0c3e -r 5288d9d5a226 cgi-bin/DW/Routing.pm
--- a/cgi-bin/DW/Routing.pm     Mon Jan 03 15:51:45 2011 -0600
+++ b/cgi-bin/DW/Routing.pm     Tue Jan 04 08:17:10 2011 +0800
@@ -189,7 +189,7 @@ sub _call_hash {
         $r->print(objToJson( { error => $text } ));
         return $r->OK;
     # default error rendering
-    } else {
+    } elsif ( $format eq "html" ) {
         $msg = $err->as_html;
 
         chomp $msg;
@@ -201,6 +201,22 @@ sub _call_hash {
         my $remote = LJ::get_remote();
         $text = "<b>[Error: $msg]</b>" if ( $remote && 
$remote->show_raw_errors ) || $LJ::IS_DEV_SERVER;
         return DW::Template->render_string( $text, { status=>500, 
content_type=>'text/html' } );
+    } else {
+        $msg = $err->as_string;
+
+        chomp $msg;
+        $msg .= " \@ $LJ::SERVER_NAME" if $LJ::SERVER_NAME;
+        warn "$msg\n";
+
+        my $text = $LJ::MSG_ERROR || "Sorry, there was a problem.";
+        my $remote = LJ::get_remote();
+        $text = "Error: $msg" if ( $remote && $remote->show_raw_errors ) || 
$LJ::IS_DEV_SERVER;
+
+        return DW::Template->render_string( $text, {
+            status => 500,
+            content_type => 'text/plain',
+            no_sitescheme => 1
+        } );
     }
 }
 
diff -r 3ec2525b0c3e -r 5288d9d5a226 t/routing.t
--- a/t/routing.t       Mon Jan 03 15:51:45 2011 -0600
+++ b/t/routing.t       Tue Jan 04 08:17:10 2011 +0800
@@ -14,7 +14,7 @@
 # 'perldoc perlartistic' or 'perldoc perlgpl'.
 #
 use strict;
-use Test::More tests => 195;
+use Test::More tests => 203;
 use lib "$ENV{LJHOME}/cgi-bin";
 
 # don't let DW::Routing load DW::Controller subclasses
@@ -251,6 +251,16 @@ handle_redirect( '/xx3', '/xx3/' );
 handle_redirect( '/xx3', '/xx3/' );
 # 194
 
+
+# test dying
+DW::Routing->register_string( "/test/die/all_format", \&died_handler, app => 
1, formats => 1 );
+
+handle_server_error( "/test die implied_format (app)", "/test/die/all_format", 
"html" ); # 2 tests
+handle_server_error( "/test die .json format (app)", 
"/test/die/all_format.json", "json" ); # 2 tests
+handle_server_error( "/test die .html format (app)", 
"/test/die/all_format.html", "html" ); # 2 tests
+handle_server_error( "/test die .blah format (app)", 
"/test/die/all_format.blah", "blah" ); # 2 tests
+
+
 sub handle_redirect {
     my ( $uri, $expected ) = @_;
 
@@ -296,6 +306,26 @@ sub handle_request {
     is ( $result, $expected, "$name: handler set wrong value.");
 }
 
+sub handle_server_error {
+    my ( $name, $uri, $format, %opts ) = @_;
+
+    $DW::Request::determined = 0;
+    $DW::Request::cur_req = undef;
+
+    my $req = HTTP::Request->new( GET => "$uri" );
+    my $r = DW::Request::Standard->new( $req );
+
+    $result = undef;
+    $__name = $name;
+    eval { DW::Routing->call( %opts ) };
+
+    is( $r->status, $r->HTTP_SERVER_ERROR, "$name: wrong return" );
+    is( $r->content_type, {
+        html => "text/html",
+        json => "application/json",
+    }->{$format} || "text/plain", "$name: wrong returned content type for 
$format" );
+}
+
 sub handler {
     my $r = DW::Request->get;
     $result = $_[0]->args;
@@ -310,3 +340,7 @@ sub regex_handler {
     is( $_[0]->subpatterns->[0], $_[0]->args->[0], "$__name: capture wrong!" );
     return $r->OK;
 }
+
+sub died_handler {
+    die "deliberate die()";
+}
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to