Perl透明代理

时间:2012-10-27 23:21:15

标签: perl http proxy lwp

我正在尝试创建一个透明的 HTTP代理。它的目的是在浏览器和Web服务器之间保持不变。这是我正在使用的代码。不幸的是,它的效果不佳。当我打开网页(由$base_uri引用)时,根据我是否仅使用浏览器或浏览器和代理打开它,会有不同的结果。我正在一个网站上尝试它,它返回各种响应,包括“transfer-encoding: chunked”(所以我猜可能会出现问题?!)。我认为cookie也可能有问题,但我不知道如何解决它们(如果有的话......)。

#!/usr/bin/perl

use strict;

use HTTP::Daemon;
use LWP::UserAgent;
use HTTP::Cookies;

my $cookie_jar = HTTP::Cookies->new();

my $ua = LWP::UserAgent->new( max_redirect => 0, env_proxy => 0,keep_alive => 1, timeout => 30, agent => "Mozilla/4.76 [en] (Win98; U)");
my $d = HTTP::Daemon->new( 
    LocalHost => "localhost",  # remove this to listen from other machines 
                   # (i.e. open-relay... be careful of spammers!)
    LocalPort => 33331
) || die;
print "[Proxy URL:", $d->url, "]\n";

fork(); fork(); fork();  # 2^3 = 8 processes

$ua->cookie_jar($cookie_jar);

my $base_uri = 'http://example.com/';

while (my $c = $d->accept) {
        while (my $request = $c->get_request) {
            my $uri = $base_uri . $request->uri->as_string();
            my $method = $request->method;
            my $req = HTTP::Request->new($method, $uri);

            $request->uri($uri);

            print "[[ $method >> $uri ]]\n";
            my $response = $ua->simple_request($request);
            $c->send_response( $response );
        }
    $c->close;
    undef($c);
}

提前谢谢!

1 个答案:

答案 0 :(得分:0)

目前尚不清楚,你真正想要的是什么。你应该更好地描述它。如果您描述了您需要该代理的内容和原因以及它需要哪些功能,那么任何帮助都可以更好。不过我会试试。

您目前所做的是获取传入连接,提取URI和调用方法并将其传递给您的源。好吧,HTTP要复杂得多 - 您可以删除所有传输数据(例如POST请求)以及所有标题行(cookie,登录数据,浏览器标识,语言规范......),这些通常包含重要信息。你也经常修改时序行为。然后,您将其发送到您的代理目标。

现在您接受服务器答案并再次删除所有相关内容。此外,您只需在答案完成后回复。对于流数据,这将不起作用(您已经提到了分块传输模式)。此外,您的方法需要大量内存用于大文件(例如DVD图像 - 4GB)。

如果没有关于您的申请的进一步细节,可能没有真正的建议,但有些想法:

a)正如评论中所说,有可用的Perl模块。您可以测试它们,看它们是否符合您的需求。

b)你可以降级。使用IO::Socket::INETINET6并直接在套接字级别上工作。将每个数据包直接发送到输出。这几乎是100%透明的(IP地址和TCP数据包大小除外)。如果你想改变或检查数据,你需要自己关心HTTP,现在这可能非常复杂(特别是由于传输编码)。

c)也许不要自己编码,而是使用现有的代理(例如Apache网络服务器或特定的代理程序)。