我需要在一个Perl运行(进程)中更改代理服务器。但LWP::UserAgent
始终记住第一个代理值。
当我使用代理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进程中更改。
答案 0 :(得分:-1)
我不知道这里发生了什么,确切地说,事实上我认为你可能在LWP中发现了一个错误(如果你向我们展示的是你是什么'实际上正在执行)。但是,您是否有理由从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。