Как изменить порядок заголовков HTTP-запросов, отправляемых Perl LWP?

Для теста мне нужно сделать запрос на веб-сайт - к сожалению, при использовании perl lwp "соединение" появляется в заголовке b4 хоста. В результате запрос фильтруется брандмауэром веб-приложения. Все, что мне нужно, это удалить или переместить строку подключения в заголовке. Когда я делаю запросы со своим скриптом:

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");..

Большое спасибо заранее!


person Oliver Münchow    schedule 10.12.2012    source источник


Ответы (1)


Чтобы обойти ошибку в брандмауэре*, измените

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

in Net/HTTP.pm to

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, «порядок, в котором получаются поля заголовков с разными именами полей, не имеет значения».

person ikegami    schedule 10.12.2012