Получить необработанные заголовки ответа от LWP?

Есть ли способ получить необработанные, немодифицированные заголовки ответа из HTTP-запроса, сделанного с помощью LWP? Это для диагностического инструмента, который должен выявить проблемы с, возможно, искаженными заголовками.

Самое близкое, что я нашел, это:

use LWP::UserAgent;
my $ua = new LWP::UserAgent;
my $response = $ua->get("http://somedomain.com");
print $response->headers()->as_string();

Но это фактически анализирует заголовки, а затем восстанавливает их канонизированную, очищенную версию из проанализированных данных. Мне действительно нужен весь текст заголовка именно в том виде, в котором он был возвращен сервером, поэтому все искаженное или нестандартное будет четко идентифицировано.

Если выяснится, что с LWP это сделать невозможно, возможно, есть какой-нибудь другой Perl-модуль, который может это сделать?


person plasticinsect    schedule 21.11.2012    source источник


Ответы (2)


Net::HTTP обеспечивает доступ более низкого уровня с меньшей обработкой. Поскольку это подкласс IO::Socket::INET, вы можете читать напрямую от объекта после выполнения запроса.

use Net::HTTP;

# Make the request using Net::HTTP.
my $s = Net::HTTP->new(Host => "www.perl.com") || die $@;
$s->write_request(GET => "/", 'User-Agent' => "Mozilla/5.0");

# Read the raw headers.
my @headers;
while(my $line = <$s>) {
    # Headers are done on a blank line.
    last unless $line =~ /\S/;
    push @headers, $line;
}
print @headers;
person Schwern    schedule 21.11.2012

На основе проверки объекта HTTP::Response (и содержащегося в нем объекта HTTP::Headers) заголовки отбрасываются по мере их анализа.

Я бы порекомендовал вам попробовать WWW::Curl вместо этого.

ИЗМЕНИТЬ Фрагмент с использованием WWW::Curl:

use WWW::Curl::Easy;

my ($header, $body);

my $curl = WWW::Curl::Easy->new;
$curl->setopt(CURLOPT_URL, $url_to_get); # get this URL
$curl->setopt(CURLOPT_WRITEHEADER, \$header); # save header text in this var
$curl->setopt(CURLOPT_WRITEDATA, \$body); # save body text in this var

my $code = $curl->perform;
if (0 == $code) {
  # header text is in $header, body text in $body 
} else {
  print $curl->strerror($code).": ".$curl->errbuf."\n";
}
person Mark Reed    schedule 21.11.2012