HTTP :: Proxy: cum să înlocuiți o pagină html întreagă

Încerc să folosesc eroarea HTTP :: Proxy la server 403 pentru un anumit domeniu. Am reușit deja să modific modificările, dar proxy-ul continuă să servească pagina originală.

Iată codul pe care îl folosesc:

package Filters::Filter403;

use strict;
use warnings;
use HTTP::Proxy::HeaderFilter::simple;
use HTTP::Proxy::BodyFilter::simple;

our $header = HTTP::Proxy::HeaderFilter::simple->new (
    sub {
        $_[2]->code( 403 );
        $_[2]->message ( 'Forbidden' );
    }
);

our $body = HTTP::Proxy::BodyFilter::simple->new (
    sub {       
        $_[1] = \<<'HTML';
<!DOCTYPE HTML>
<html><head><title>403 Forbidden</title>
</head><body><div>

403

Forbidden

</div></body></html>
HTML
    }
);

1;

Iată codul din scriptul principal în care sunt apelat aceste două filtre, astfel încât să puteți avea un aspect mai bun:

use HTTP::Proxy qw(:log);
use Getopt::Long;

use FindBin qw($Bin);
use lib $Bin;

use Filters;
use HTTP::Proxy::BodyFilter::complete;

my $port = 3128;
my $fail_at;
my $outputfile = '/var/log/cvmfs-test/webproxy.output';
my $errorfile = '/var/log/cvmfs-test/webproxy.error';

my $ret = GetOptions ( "port=i" => \$port,
                       "fail=s" => \$fail_at );

my @fail_at = split(/,/, $fail_at);

# Opening file for log
open (LOG, '>>', $outputfile);

my $proxy = HTTP::Proxy->new;
$proxy->port( $port );
$proxy->logfh( *LOG );
$proxy->logmask( ALL );

if ($fail_at[0] ne 'all') {
    foreach my $url (@fail_at) {
        $proxy->push_filter(
            host => $url,
            response => HTTP::Proxy::BodyFilter::complete->new,
            response => $Filters::Filter403::header,
            response => $Filters::Filter403::body
        );
    }
}
else {
    $proxy->push_filter (
        response => HTTP::Proxy::BodyFilter::complete->new(),
        response => $Filters::Filter403::header,
        response => $Filters::Filter403::body
    );
}

my $pid = fork();

# Command for the forked process
if ( defined($pid) and $pid == 0 ) {
    open (my $errfh, '>', $errorfile);
    STDOUT->fdopen( \*$errfh, 'w' ) || die "Couldn't set STDERR to $errorfile: $!\n";
    $proxy->start;
}

# Command for the main script
unless ($pid == 0) {
    print "Proxy HTTP started on port $port with PID $pid.\n";
    print "You can read its output in $outputfile.\n";
}

exit 0;

Poti, te rog, sa ma ajuti? Am încercat soluția Daxim și am încercat, de asemenea, să folosesc $ {$ _ [1]} deoarece documentația pare să sugereze, dar nu a funcționat.

Mulțumesc foarte mult.

0
Puteți verifica wget -S la proxy pentru a vedea când expiră conținutul. Dacă este cu 10 ani înainte, va trebui să intri în această memorie cache proxy.
adăugat autor Andrew, sursa

2 răspunsuri

I have found a solution. The problem is that every filter after HTTP::Proxy::BodyFilter::complete->new is executed with empty data. I found that loading an heavy page, my code were added multiple times.

Aici este filtrul de lucru:

our $body = HTTP::Proxy::BodyFilter::simple->new (
    sub {
        my ( $self, $dataref, $message, $protocol, $buffer ) = @_;
        unless (defined ($buffer)){
            my $html = 
                    '<!DOCTYPE HTML>'.
                    '<html><head><title>403 Forbidden</title>
</head><body><div>

403

Forbidden

</div></body></html>';

            $$dataref = $html;
        }
    }
);

În acest fel, filtrul nu face nimic decât dacă tamponul $ este undef, adică atunci când întregul răspuns a fost primit.

0
adăugat

Vedeți HTTP :: Proxy :: BodyFilter :: completat .

$proxy->push_filter(
    response => HTTP::Proxy::BodyFilter::complete->new,
    response => HTTP::Proxy::BodyFilter::simple->new(sub {
        $_[1] = \<<'HTML';
<!DOCTYPE HTML>
<html><head><title>403 Forbidden</title>
</head><body><div>

403

Forbidden

</div></body></html>
HTML
    }),
);
0
adăugat
Ne pare rău, dar asta nu funcționează pentru mine. Voi actualiza postul cu codul scenariului principal, astfel încât să puteți arunca o privire și acolo.
adăugat autor Zagorax, sursa
Am găsit o soluție. Vă mulțumesc pentru că nu aș completa fără sugestia dvs. de BodyFilter ::.
adăugat autor Zagorax, sursa
Văd că documentația ar putea folosi unele îmbunătățiri; Voi propune un patch pentru BooK. Mă bucur că ați dat seama ce ați vrut și că este bine să vă marcați propriul răspuns așa cum este acceptat, deoarece se potrivește cel mai bine cu întrebarea.
adăugat autor daxim, sursa