LWP::UserAgent 通过 POST 重定向时丢失内容数据

LWP::UserAgent loses content data when redirecting via POST

我正在向 Jira 发布 JSON 数据,请求首先发送到 CAS。发生一系列重定向。但是,在初始请求之后,我注意到内容在第一次重定向时被清零了。最后的结果是我的请求到达Jira,内容是空的,没有成功。

除了阻止 LWP::UserAgent 自己重定向和跟踪链接之外,我不确定还能尝试什么。我的理解是,这应该由模块来处理。

这隐约代表了删节...

use LWP::UserAgent ();
use HTTP::Request ();
use HTTP::Headers;
use HTTP::Cookies;

my $cookie_jar = HTTP::Cookies->new();
my $user_agent = LWP::UserAgent->new;
$user_agent->cookie_jar( $cookie_jar );

push @{ $user_agent->requests_redirectable }, 'POST';

$user_agent->ssl_opts( $ssl_cert_file_pem );
$user_agent->ssl_opts( $ssl_key_file_pem );
$user_agent->ssl_opts( $verify_hostname );
$user_agent->timeout( $timeout );

my $headers_obj = HTTP::Headers->new;
$headers_obj->header( 'Accept' => '*/*' );
$headers_obj->header( 'Accept-Encoding' => 'gzip, deflate, br' );
$headers_obj->header( 'Accept-Language' => 'en-US' );
$headers_obj->header( 'Connection' => 'Keep-Alive' );
$headers_obj->header( 'Host' => $host );

my $http_request_obj = HTTP::Request->new;
$http_request_obj->method( $method );
$http_request_obj->uri( $uri );
$http_request_obj->content_type( 'Content-Type' => 'application/json' );
$http_request_obj->content( $content );

$user_agent->default_headers( $headers_obj );

$response_obj = $user_agent->request( $http_request_obj );

当我转储响应时,我可以看到初始请求 returns 一个 302 然后成功跟随......只是内容不与每个重定向一起。如何让 LWP::UserAgent 转发重定向内容?

这是 302 响应的适当行为。

当前的 HTTP 规范 RFC 7231 对 302 响应的说明如下:

Note: For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request. If this behavior is undesired, the 307 (Temporary Redirect) status code can be used instead.

当 LWP 收到对 POST 可重定向的 302 响应时,它会跟进 GET 请求(不一定包括原始请求的 POST 数据)。