1

我已经编写了这段代码来通过代理触发 http 请求。但是请求似乎没有使用代理。即使我提供了错误的代理,它也会返回正常。

有什么方法可以检查 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

4 回答 4

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},它应该是一个URI 对象。然而,据我所知,这个属性是无证的(我通过阅读源代码发现了它),因此在 LWP 的更高版本中可能会发生变化。使用风险自负!

于 2012-04-14T19:26:37.383 回答
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 声明更改,它只会在此代码块内生效。这样您就不必自己清理,也不会冒险覆盖可能已在其他地方设置的变量。

于 2012-04-14T18:55:40.497 回答
1

看看你的代码sub fire_http_request_through_proxy(),尤其是最后两个字符......这是一个原型。基本上你是在说“我在编译时不接受任何参数”

我猜您只是在声明之前调用该方法-> Always use warnings

main::fire_http_request_through_proxy() 调用太早,无法在 test.pl 行检查原型...

因此,要么将其更改为,要么将其fire_http_request_through_proxy更改为fire_http_request_through_proxy($)并在声明后调用它。

更多关于perlsub中的原型设计。

于 2012-04-14T19:19:09.950 回答
1

确定

  • 将参数读取为$_[0]or pop, not$_
  • 不包括()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');
于 2012-04-14T20:08:06.227 回答