You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axkit-dev@xml.apache.org by ma...@sergeant.org on 2006/08/01 22:52:32 UTC

[SVN] [26] Handle errors better

Revision: 26
Author:   matt
Date:     2006-08-01 20:52:12 +0000 (Tue, 01 Aug 2006)

Log Message:
-----------
Handle errors better
Fixup a couple of the test plugin/files
Cleanup some warnings

Modified Paths:
--------------
    trunk/demo/xsp/test.xsp
    trunk/lib/AxKit2/Client.pm
    trunk/lib/AxKit2/Config/Location.pm
    trunk/lib/AxKit2/Config/Server.pm
    trunk/lib/AxKit2/Connection.pm
    trunk/lib/AxKit2/Constants.pm
    trunk/lib/AxKit2/HTTPHeaders.pm
    trunk/plugins/serve_file

Modified: trunk/demo/xsp/test.xsp
===================================================================
--- trunk/demo/xsp/test.xsp	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/demo/xsp/test.xsp	2006-08-01 20:52:12 UTC (rev 26)
@@ -3,5 +3,10 @@
     <output>
         Hello World. The time of request is:
         <xsp:expr>scalar localtime</xsp:expr>
+        <structure>
+            <xsp:expr>
+                { abc => 42, xyz => { goofy => "yes", ugly => "no" } };
+            </xsp:expr>
+        </structure>
     </output>
 </xsp:page>

Modified: trunk/lib/AxKit2/Client.pm
===================================================================
--- trunk/lib/AxKit2/Client.pm	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/lib/AxKit2/Client.pm	2006-08-01 20:52:12 UTC (rev 26)
@@ -67,8 +67,9 @@
     for my $plugin ($conf->plugins) {
         my $plug = plugin_instance($plugin) || next;
         for my $h ($plug->hooks($hook)) {
+            $self->log(LOGDEBUG, "$plugin running hook $hook") unless $hook eq 'logging';
             eval { @r = $plug->$h($self, $conf, @_) };
-            $@ and $self->log(LOGERROR, "FATAL PLUGIN ERROR: $@");
+            $@ and $self->log(LOGERROR, "FATAL PLUGIN ERROR: $@"), return SERVER_ERROR;
             next unless @r;
             last MAINLOOP unless $r[0] == DECLINED;
         }
@@ -97,36 +98,72 @@
 sub hook_uri_to_file {
     my $self = shift;
     my ($ret, $out) = $self->run_hooks('uri_translation', @_);
-    if ($ret == DECLINED) {
-        return;
+    if ($ret == DECLINED || $ret == OK) {
+        return 1;
     }
     else {
         # TODO: output error stuff?
+        return;
     }
 }
 
 sub hook_access_control {
+    1;
 }
 
 sub hook_authentication {
+    1;
 }
 
 sub hook_authorization {
+    1;
 }
 
 sub hook_fixup {
+    1;
 }
 
+sub hook_error {
+    my $self = shift;
+    $self->headers_out->code(SERVER_ERROR, "Internal Server Error");
+    my ($ret) = $self->run_hooks('error');
+    if ($ret != OK) {
+        $self->headers_out->header('Content-Type' => 'text/html; charset=UTF-8');
+        $self->send_http_headers;
+        $self->write(<<EOT);
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
+<HTML><HEAD>
+<TITLE>500 Internal Server Error</TITLE>
+</HEAD><BODY>
+<H1>Internal Server Error</H1>
+The server encountered an internal error or
+misconfiguration and was unable to complete
+your request.<P>
+More information about this error may be available
+in the server error log.<P>
+<HR>
+</BODY></HTML>
+EOT
+    }
+    else {
+        # we assume some hook handled the error
+    }
+}
+
 sub hook_xmlresponse {
     my $self = shift;
     my ($ret, $out) = $self->run_hooks('xmlresponse', @_);
     if ($ret == DECLINED) {
-        return;
+        return 0;
     }
     elsif ($ret == OK) {
         $out->output($self) if $out;
-        return 1;
+        return 1; # stop
     }
+    elsif ($ret == SERVER_ERROR) {
+        $self->hook_error();
+        return 1; # stop
+    }
     else {
         # TODO: handle errors
     }
@@ -136,8 +173,15 @@
     my $self = shift;
     my ($ret, $out) = $self->run_hooks('response', @_);
     if ($ret == DECLINED) {
-        return;
+        return 1;
     }
+    elsif ($ret == OK) {
+        return 1;
+    }
+    elsif ($ret == SERVER_ERROR) {
+        $self->hook_error();
+        return 1; # stop
+    }
     else {
         # TODO: output error stuff?
     }

Modified: trunk/lib/AxKit2/Config/Location.pm
===================================================================
--- trunk/lib/AxKit2/Config/Location.pm	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/lib/AxKit2/Config/Location.pm	2006-08-01 20:52:12 UTC (rev 26)
@@ -33,7 +33,6 @@
 sub matches {
     my $self = shift;
     my $tomatch = shift;
-    warn("Location: does $self->{__path} match $tomatch ?\n");
     return index($tomatch, $self->path) + 1;
 }
 

Modified: trunk/lib/AxKit2/Config/Server.pm
===================================================================
--- trunk/lib/AxKit2/Config/Server.pm	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/lib/AxKit2/Config/Server.pm	2006-08-01 20:52:12 UTC (rev 26)
@@ -88,12 +88,10 @@
     my $self = shift;
     my $path = shift;
     
-    warn("get_config $path called\n");
     # note using first() with reverse() implies last(),
     # but List::Util has no last() function
     my $ret = first { $_->matches($path) } reverse @{$self->{Locations}};
     
-    warn("get_config returning $ret or $self\n");
     return $ret || $self;
 }
 

Modified: trunk/lib/AxKit2/Connection.pm
===================================================================
--- trunk/lib/AxKit2/Connection.pm	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/lib/AxKit2/Connection.pm	2006-08-01 20:52:12 UTC (rev 26)
@@ -155,19 +155,22 @@
     $self->{headers_out}->header(Date   => HTTP::Date::time2str());
     $self->{headers_out}->header(Server => "AxKit-2/v$AxKit2::VERSION");
     
-    $self->hook_uri_to_file($hd, $hd->request_uri);
+    $self->hook_uri_to_file($hd, $hd->request_uri)
+    &&
+    $self->hook_access_control($hd)
+    &&
+    $self->hook_authentication($hd)
+    &&
+    $self->hook_authorization($hd)
+    &&
+    $self->hook_fixup($hd)
+    &&
+    (
+        $self->hook_xmlresponse(AxKit2::Processor->new($hd->filename))
+        ||
+        $self->hook_response($hd)
+    );
     
-    $self->hook_access_control($hd);
-    
-    $self->hook_authentication($hd);
-    
-    $self->hook_authorization($hd);
-    
-    $self->hook_fixup($hd);
-    
-    $self->hook_xmlresponse(AxKit2::Processor->new($hd->filename))
-      || $self->hook_response($hd);
-    
     $self->http_response_sent();
 }
 

Modified: trunk/lib/AxKit2/Constants.pm
===================================================================
--- trunk/lib/AxKit2/Constants.pm	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/lib/AxKit2/Constants.pm	2006-08-01 20:52:12 UTC (rev 26)
@@ -20,12 +20,8 @@
 
 # return codes
 my %return_codes = (
-        OK                     => 900,
-        DENY                   => 901,   # 550
-        DENYSOFT               => 902,   # 450
-        DENYHARD               => 903,   # 550 + disconnect  (deprecated in 0.29)
-        DENY_DISCONNECT        => 903,   # 550 + disconnect
-        DENYSOFT_DISCONNECT    => 904,   # 450 + disconnect
+        OK                     => 200,
+        SERVER_ERROR           => 500,
         DECLINED               => 909,
         DONE                   => 910,
 );

Modified: trunk/lib/AxKit2/HTTPHeaders.pm
===================================================================
--- trunk/lib/AxKit2/HTTPHeaders.pm	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/lib/AxKit2/HTTPHeaders.pm	2006-08-01 20:52:12 UTC (rev 26)
@@ -160,6 +160,7 @@
     $self->{responseLine} = "HTTP/1.0 $code " . $self->http_code_english($code);
     $self->{code} = $code;
     $self->{type} = "httpres";
+    $self->{vernum} = 1000;
 
     return $self;
 }
@@ -222,9 +223,9 @@
 }
 
 sub version_number {
-    my AxKit2::HTTPHeaders $self = $_[0];
-    return $self->{vernum} unless $_[1];
-    return $self->{vernum} = $_[1];
+    my AxKit2::HTTPHeaders $self = shift;
+    @_ and $self->{vernum} = shift;
+    $self->{vernum};
 }
 
 sub header {

Modified: trunk/plugins/serve_file
===================================================================
--- trunk/plugins/serve_file	2006-08-01 04:13:07 UTC (rev 25)
+++ trunk/plugins/serve_file	2006-08-01 20:52:12 UTC (rev 26)
@@ -18,7 +18,6 @@
 ");
             local $/;
             $self->client->write(<$fh>);
-            $self->client->close;
         }
         else {
             $self->client->write("HTTP/1.1 200 OK
@@ -32,7 +31,6 @@
 <H1>Testing: $file</H1>
 </BODY>
 </HTML>");
-            $self->client->close();
         }
     }