1

このコードは、プロキシを介して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

4 に答える 4

4

セバスチャンとオールダーズはすでにあなたの問題を解決しました、しかし私はあなたがとにかくいじくり回す必要がないことに注意したいと思います$ENV{HTTP_PROXY}—あなたはただ$ua->proxy()このように使うことができます:

$ua->proxy( http => 'http://1.1.1.1' );

あるいは:

$ua->proxy( ['http', 'https', 'ftp'] => 'http://1.1.1.1' );

追伸 特定のリクエストに対してLWPがどのプロキシを使用したかを本当に確認したい場合は、 URIオブジェクト$response->request->{proxy}である必要があるを確認できます。ただし、私が知る限り、このプロパティは文書化されていないため(ソースを読んでわかりました)、LWPの新しいバージョンで変更される可能性があります。自己責任!

于 2012-04-14T19:26:37.383 に答える
1

sub fire_http_request_through_proxy()コード、特に最後の2文字を見てください...これはプロトタイプです。基本的に、あなたは「コンパイル時に引数を取らない」と言っています。

宣言の前にメソッドを呼び出しているだけだと思います->常に use warnings

main :: fire_http_request_through_proxy()の呼び出しが早すぎて、test.pl行でプロトタイプをチェックできません...

したがって、に変更するか、に変更しfire_http_request_through_proxyfire_http_request_through_proxy($)宣言後に呼び出します。

perlsubでのプロトタイピングの詳細。

于 2012-04-14T19:19:09.950 に答える
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変数を設定することができます。

もう1つのポイント。スクリプトでENV変数を設定および削除するのではなく、ローカルで変更を宣言するだけで、このコードブロック内でのみ有効になります。そうすれば、自分でクリーンアップする必要がなく、他の場所で設定されている可能性のある変数をオーバーライドするリスクもありません。

于 2012-04-14T18:55:40.497 に答える
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');
于 2012-04-14T20:08:06.227 に答える