3

有没有办法从使用 LWP 发出的 HTTP 请求中获取原始的、未修改的响应标头?这是一个诊断工具,需要识别可能格式错误的标头问题。

我发现的最接近的是:

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

但这实际上会解析标头,然后从解析的数据中重建它们的规范化、清理版本。我真的需要与服务器返回的格式完全相同的整个标题文本,因此任何格式错误或非标准的内容都可以清楚地识别。

如果事实证明没有办法用 LWP 做到这一点,是否有其他 Perl 模块可以做到这一点?

4

2 回答 2

6

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;
于 2012-11-21T03:55:39.270 回答
2

基于对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";
}
于 2012-11-21T03:18:34.087 回答