[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Error intercept.




Hi,

I'm trying to build an filter that will parse the output of
some application server (AKA the blackbox) and replace the errors messages
with something neater.

For that purpose i installed the following OutputFilter on the reverse-proxy:
---8<----------------
package MyApache2::FilterColdfusion;
use base qw(Apache2::Filter);

use strict;
use warnings FATAL => 'all', NONFATAL => 'redefine';

use Apache2::Filter ();
use Apache2::RequestRec ();
use Apache2::Log;
use APR::Table ();
use Apache2::Reload;

use Apache2::Const -compile => qw(OK DECLINED :log);
use APR::Const     -compile => qw(:error SUCCESS);

my $error_page;

BEGIN {
    # Load the generic response text:
    local $/;
    undef $/;
    open IN, "</etc/apache2/cferror.html";
    $error_page = <IN>;
}

sub handler { #: FilterRequestHandler FilterHasInitHandler(\&init) {
    my $f = shift;
    my $r = $f->r;

    # Filter only generated text
    if (($r->status() < 300) &&
        $r->content_type() =~ /text\/html/) {

        if (!$f->ctx()) {
            # Test: randomly intercept:
            $f->ctx ({intercept => int(rand() + .5)});

            if ($f->ctx->{intercept}) {
                $r->headers_out->unset('Content-Length');
                # Record matched error
                $r -> log_reason ("Intercepted Coldfusion Error",$r->filename);

                # print Error generic message
                $f -> print ($error_page);
                $r -> headers_out->set('Content-Length', length $error_page);

                # exit with OK
                return Apache2::Const::OK;
            }
        } else {
            if ($f->ctx->{intercept}) {
                $r -> log_reason ("Intercepted since previously set to", $r->filename);
                return Apache2::Const::OK;
            }
        }
    }
    # Not an error => let mod_perl copy the text
    return Apache2::Const::DECLINED;
}
1;
---8<----------------

When using wget -SO - http://url/ things seem to be ok, i got the want text, and
headers seems good to me:

  HTTP/1.1 200 OK
  Date: Thu, 22 Feb 2007 17:53:52 GMT
  Server: Apache/1.3.33 (Debian GNU/Linux) AuthMySQL/4.3.9-2 mod_perl/1.29
  Page-Completion-Status: Normal
  Page-Completion-Status: Normal
  Content-Type: text/html; charset=iso-8859-1
  Content-Length: 2048
  Vary: Accept-Encoding
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive

<html>
<head>
<title>Incident sur l'hebergement</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
.....

Using links everything goes fine, but firefox do not show anything (and there is nothing in 'view source').
(Well if the rand() did not trigger then in this case Firefox show the proxy'ed content correctly).

Any idea ? something i did wrong ?
Regards

-- 
Benoit Plessis



Mail converted by mhonarc 2.6.15
This archive provided courtesy of JSW4.NET, Internet Hosting Services for Small Business.