HTTP请求不通过代理

时间:2012-04-14 18:00:22

标签: perl proxy lwp-useragent

我已编写此代码以通过代理触发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;
    }  
}

4 个答案:

答案 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');