首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTTP::Proxy:如何替换整个html页面

HTTP::Proxy:如何替换整个html页面
EN

Stack Overflow用户
提问于 2012-06-05 03:09:41
回答 2查看 647关注 0票数 0

我正在尝试使用HTTP::Proxy到某个特定域的服务器403错误。我已经设法修改了头文件,但代理继续为原始页面提供服务。

下面是我使用的代码:

代码语言:javascript
复制
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><style type="text/css">
body { padding: 40pt; }
body, h1, h2, p { color: #333; font-family: Arial, sans-serif; margin: 0; }
div { width: 200px; background: #eee; padding: 2em; }
</style></head><body><div><h1>403</h1><h2>Forbidden</h2></div></body></html>
HTML
    }
);

1;

下面是我调用这两个过滤器的主脚本中的代码,这样你就可以看得更清楚了:

代码语言:javascript
复制
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;

你能帮帮我吗?我尝试了Daxim解决方案,也尝试使用文档建议的$ { $_[1] },但它不起作用。

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-05 17:17:53

我找到了一个解决方案。问题是,HTTP::Proxy::BodyFilter::complete->new之后的每个过滤器都是使用空数据执行的。我发现加载一个很重的页面,我的代码被添加了多次。

以下是工作筛选器:

代码语言:javascript
复制
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><style type="text/css">'.
                    'body { padding: 40pt; }'.
                    'body, h1, h2, p { color: #333; font-family: Arial, sans-serif; margin: 0; }'.
                    'div { width: 200px; background: #eee; padding: 2em; }'.
                    '</style></head><body><div><h1>403</h1><h2>Forbidden</h2></div></body></html>';

            $$dataref = $html;
        }
    }
);

这样,过滤器不会做任何事情,除非$buffer是undef,即当接收到整个响应时。

票数 1
EN

Stack Overflow用户

发布于 2012-06-05 04:19:03

参见HTTP::Proxy::BodyFilter::complete

代码语言:javascript
复制
$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><style type="text/css">
body { padding: 40pt; }
body, h1, h2, p { color: #333; font-family: Arial, sans-serif; margin: 0; }
div { width: 200px; background: #eee; padding: 2em; }
</style></head><body><div><h1>403</h1><h2>Forbidden</h2></div></body></html>
HTML
    }),
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10886862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档