4

テストのために、ウェブサイトへのリクエストを取得する必要があります-残念ながら、perl lwpを使用すると、ホストのヘッダーb4に「接続」が表示されます。その結果、リクエストは Web アプリケーション ファイアウォールによってフィルタリングされます。必要なのは、ヘッダーの接続行を削除または下に移動することだけです。スクリプトで requet を実行すると、次のようになります。

use warnings;
use IO::Socket;
use LWP::UserAgent;
use LWP::Protocol::http;
use HTTP::Request;
my $ua = LWP::UserAgent->new();
push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, SendTE => 0, PeerHTTPVersion => "1.1");
$ua->default_header(Cookie => 'XXX', User-Agent => 'whateva');
my $request = $ua->get('https://www.test.com/test.html?...');
....

ヘッダーは次のようになります。

GET /test.html?... HTTP/1.1
Connection: close
Host: www.test.com
User-Agent: whateva
Cookie: XXXX

しかし、それは動作するように見えるはずです(接続はホストの後に来ます):

GET /test.html?... HTTP/1.1
Host: www.test.com
Connection: close
User-Agent: whateva
Cookie: XXXX

LWP でその接続線を取り除くにはどうすればよいですか? 私はそれを再注文する必要があります....完全に削除する必要があるわけではありません。後でもう一度追加していただければ幸いです。

# $userAgent->default_header ("Connection" => "keep-alive");..

かなり前にThx!

4

1 に答える 1

3

ファイアウォール*のバグを回避するには、変更します

return _bytes(join($CRLF, "$method $uri HTTP/$ver", @h2, @h, "", $content));

Net/HTTP.pm_

my @h3 = ( @h2, @h );
if (my ($idx) = grep /^Host:/, 0..$#h3) {
    unshift(@h3, splice(@h3, $idx, 1));
}

return _bytes(join($CRLF, "$method $uri HTTP/$ver", @h3, "", $content));



* — HTTP/1.1 仕様、RFC 2616 によると、「異なるフィールド名を持つヘッダー フィールドが受信される順序は重要ではありません。」

于 2012-12-10T21:52:46.377 に答える