Perl会话中的LWP::UserAgent代理
我需要在一次Perl运行(进程)中更改代理服务器。但始终记住第一个代理值 当我用proxyPerl会话中的LWP::UserAgent代理,perl,shell,proxy,terminal,lwp-useragent,Perl,Shell,Proxy,Terminal,Lwp Useragent,我需要在一次Perl运行(进程)中更改代理服务器。但始终记住第一个代理值 当我用proxyx.x.x.2启动程序时,此地址始终用作代理 怎么了 简单的程序示例: getHTTP('http://my.com/', "http://x.x.x.1:3128"); getHTTP('http://my.com/', "http://x.x.x.2:3128"); getHTTP('http://my.com/', ""); getHTTP('http://my.com/', "http://x.x.
x.x.x.2
启动程序时,此地址始终用作代理
怎么了
简单的程序示例:
getHTTP('http://my.com/', "http://x.x.x.1:3128");
getHTTP('http://my.com/', "http://x.x.x.2:3128");
getHTTP('http://my.com/', "");
getHTTP('http://my.com/', "http://x.x.x.3:3128");
sub getHTTP {
my ($url, $proxy) = @_;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->proxy(http => $proxy);
my $req = HTTP::Request->new(GET => $url);
return $ua->request($req)->as_string;
}
HTTP日志的输出:
x.x.x.1 - - [09/Feb/2015:15:28:06 +0100] "GET / HTTP/1.0" 200 3467
x.x.x.1 - - [09/Feb/2015:15:29:07 +0100] "GET / HTTP/1.0" 200 3467
y.y.y.y - - [09/Feb/2015:15:29:08 +0100] "GET / HTTP/1.0" 200 3467
x.x.x.1 - - [09/Feb/2015:15:29:09 +0100] "GET / HTTP/1.0" 200 3467
(y.y.y.y是我的无代理地址)
操作系统:Debian GNU/Linux 7
新发现:
当我运行下一个perl或shell脚本时。与上述结果相同
proxy.sh:
curl -x "http://x.x.x.1:3128" http://my.com/
curl -x "http://x.x.x.2:3128" http://my.com/
curl -x "http://x.x.x.3:3128" http://my.com/
结果:始终为x.x.x.1代理
proxy.pl:
`curl -x "http://x.x.x.4:3128" http://my.com/`;
`curl -x "http://x.x.x.5:3128" http://my.com/`;
`curl -x "http://x.x.x.6:3128" http://my.com/`;
结果:始终为x.x.x.4代理
代理设置似乎无法在一个shell进程中更改。我不知道这里到底发生了什么,事实上,我认为您可能在LWP中发现了一个bug(如果您向我们展示的是您实际执行的)。但是,您为什么要从HTTP::request而不是直接通过User Agent对象构建GET请求呢?换句话说,与其这样做,不如:
my $req = HTTP::Request->new(GET => $url);
return $ua->request($req)->as_string;
这样做:
my $res = $ua->get($url);
return $res->as_string;
从理论上讲,这两种方法应该是等效的,但我想知道这样做时,代理设置是否没有正确地传播到HTTP::Request。这看起来很好。它与您正在运行的实际代码不同吗?(我的原始代码要复杂得多。)但当我运行这个简单的示例时,输出是相同的。换句话说,这个简单的程序会导致所描述的行为。这可能是由于代理配置造成的吗?代理是否以某种方式连接以进行负载平衡,或者它们是否可以选择使用哪个接口?我不这么认为。请看我的新发现!在我的简单示例中,没有理由使用HTTP::Request。当我根据您的建议更改代码时,输出是相同的。