如何获得完整的 HTTP 请求(不是响应)headers

How to get full HTTP request (not response) headers

我有这样一个简单的代码:

use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request;

my $cookies = HTTP::Cookies->new();
my $browser = LWP::UserAgent->new();
   $browser->agent(' ... ');    
   $browser->cookie_jar($cookies);   
my $request = HTTP::Request->new();     
my $response;                           
my $url;                                
my $referer;                                        

$referer = '';
$url = 'https:// ...'; # url #1
$request->url($url);
$request->method('GET');
$request->header('Referer' => $referer);    
$response = $browser->request($request);    
print $response->request()->uri()     . "\n\n" .
      $response->headers()->as_string . "\n\n" .
      $response->content              . "\n\n";

$referer = $response->request()->uri();
$url = 'https:// ... '; # url #2
$request->url($url);
$request->method('GET');
$request->header('Referer' => $referer);
$response = $browser->request($request);
print $response->request()->uri()     . "\n\n" .
      $response->headers()->as_string . "\n\n" .
      $response->content              . "\n\n";

现在,我还想查看完整的 HTTP 请求 headers,而不仅仅是响应 headers。

我该怎么做?必须向此代码添加什么?

我认为您的现有代码中几乎已经包含了它。您正在使用 $response->request()->uri() 访问请求 URI。 ->request() 是您的 HTTP::Request 对象。我相信你可以使用 $response->request->headers->as_string 来得到你想要的。

print $response->request->as_string

这将向您显示请求和响应。

use LWP::UserAgent;
use LWP::ConsoleLogger::Easy qw( debug_ua );

my $browser = LWP::UserAgent->new();

debug_ua( $browser );

$request->headers->as_string$response->request->headers->as_string 你会得到 LWP[1] 传递给 Net::HTTP 的第一个和最后一个请求的 headers ,但这些并不完全是 Net::HTTP 发送的内容。例如Net::HTTP可以加一个Content-Lengthheader、一个TEheader、and/or等多个

Net::HTTP 不保留它实际发送的 header 的记录。为此,您将需要一个线路嗅探器(例如 tcpdump)或一个调试代理(例如 Fiddler)。您还可以使用调试器或跟踪语句来查看在 Net::HTTP::Methods 的 format_request 中准备的请求。然而,最方便的可能是包装 Net::HTTP::Methods 的 format_request.


  1. 除非初始请求被重定向,否则它们是相同的。要获取所有请求(和响应),您可以使用:

    while ($response) {
       my $request = $response->request;
       ...
    
       $response = $response->previous;
    }