我已编写此代码以通过代理触发http请求。 但请求似乎没有使用代理。即使我提供了错误的代理,它也会返回OK。
我有什么方法可以检查,HTTP请求是否通过代理? 这段代码中的问题是什么,它不使用代理?
sub fire_http_request_through_proxy()
{
my $proxy = $_;
my $ua = LWP::UserAgent->new;
$ENV{HTTP_PROXY} = $proxy;
$ua->env_proxy; # initialize from environment variables
$ua->timeout(20);
my $response = $ua->get('http://www.google.com');
delete $ENV{HTTP_PROXY};
if ($response->is_success)
{
print $response->decoded_content . "\n";
}
else
{
die $response->status_line;
}
}
答案 0 :(得分:4)
Sebastian和oalders已经解决了你的问题,但我只想指出你无论如何都不需要使用$ENV{HTTP_PROXY}
- 你只需使用$ua->proxy()
,就像这样:
$ua->proxy( http => 'http://1.1.1.1' );
甚至:
$ua->proxy( ['http', 'https', 'ftp'] => 'http://1.1.1.1' );
聚苯乙烯。如果确实想要检查LWP针对特定请求使用了哪个代理,您可以查看$response->request->{proxy}
,该{{1}}应为URI object。但是,据我所知,这个属性没有记录(我通过阅读源代码发现了它),因此可以在LWP的更高版本中进行更改。使用风险自负!
答案 1 :(得分:1)
你确定$ _有真正的价值吗?这适合我:
#!/usr/bin/env perl
use strict;
use warnings;
use LWP::UserAgent;
fire_http_request_through_proxy();
sub fire_http_request_through_proxy {
my $ua = LWP::UserAgent->new;
local $ENV{HTTP_PROXY} = 'http://1.1.1.1';
$ua->env_proxy; # initialize from environment variables
$ua->timeout( 20 );
my $response = $ua->get( 'http://www.google.com' );
delete $ENV{HTTP_PROXY};
if ( $response->is_success ) {
print $response->decoded_content . "\n";
}
else {
die $response->status_line;
}
}
所以,也许$ _不是你想象的那样。如果未定义,则不使用代理。话虽如此,$ _可能不是你想在这里使用的变量。你可以声明一个变量用于这种情况,将一个变量传递给子程序,或者在脚本之外实际设置一个ENV变量。
另一点。不要在脚本中设置和删除ENV var,只需使用local声明更改,它只会在此代码块中生效。这样你就不必在自己之后进行清理,也不会冒着可能在其他地方设置过的变种的风险。
答案 2 :(得分:1)
看看你的代码sub fire_http_request_through_proxy()
,特别是最后两个字符......这是一个原型。基本上你是说“我在编译时不接受任何参数”。
我猜您只是在声明之前调用该方法 - > 始终 use warnings
:
main :: fire_http_request_through_proxy()过早调用 test.pl线上的原型......
所以要么将其更改为fire_http_request_through_proxy
,要么将其更改为fire_http_request_through_proxy($)
并在声明后调用它。
有关perlsub中原型制作的更多信息。
答案 3 :(得分:1)
确保
$_[0]
或pop
,而不是$_
()
定义sub
<强> 脚本: 强>
sub fire_http_request_through_proxy {
my $proxy = $_[0];
my $timeout = 20;
my $url = 'http://www.google.com';
my $ua = LWP::UserAgent->new;
$ua->proxy(['http', 'https', 'ftp'] => $proxy);
$ua->timeout($timeout);
my $response = $ua->get($url);
if ($response->is_success) {
print $response->decoded_content . "\n";
}
else {
die $response->status_line;
}
}
<强> 测试 强>
要使其正常工作,代理参数必须采用正确的格式(http:// host:port)
fire_http_request_through_proxy('http://176.34.248.142:9050');