2012-04-14 188 views
1

我已經寫了這段代碼通過代理來觸發一個http請求。 但該請求似乎並未使用代理。即使我給了一個錯誤的代理,它也會返回OK。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; 
    } 
} 
+3

你確定$ _是什麼你在找什麼?嘗試$ _ [0] – snoofkin 2012-04-14 18:49:41

+0

@ soulSurfer2010是的,它('$ _ [0]')起作用 – cppcoder 2012-04-15 11:34:22

回答

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變量,只需用local聲明變化,它只會在這段代碼中生效。這樣你就不必清理自己,也不用冒着可能在其他地方設置的壓倒性風險。

+0

問題出在'$ _'上。我應該使用'$ _ [0]' – cppcoder 2012-04-15 11:33:08

1

看看你的代碼sub fire_http_request_through_proxy(),特別是最後兩個字符...這是一個原型。基本上你是說「我在編譯期間沒有任何參數」

我猜你只是在它的聲明之前調用方法 - >始終use warnings

主要:: fire_http_request_through_proxy()呼籲爲時尚早test.pl線檢查 原型...

因此,要麼將其更改爲fire_http_request_through_proxy或將其更改爲fire_http_request_through_proxy($)並在聲明後調用它。

更多關於perlsub的原型製作。

4

塞巴斯蒂安和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 object。然而,據我所知,這個屬性沒有記錄(我通過閱讀來源發現了它),因此可能會在更新版本的LWP中發生變化。使用需要您自擔風險!

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://主機:端口)

fire_http_request_through_proxy('http://176.34.248.142:9050');