【问题标题】:LWP::UserAgent loses content data when redirecting via POSTLWP::UserAgent 在通过 POST 重定向时丢失内容数据
【发布时间】:2019-08-09 16:16:00
【问题描述】:

我将 JSON 数据发布到 Jira,并且请求首先命中 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 );

当我转储响应时,我可以看到初始请求返回一个 302,然后成功地遵循它......只是内容不会随每个重定向一起出现。如何让 LWP::UserAgent 在重定向时转发内容?

【问题讨论】:

  • 不应该将ssl_opts() 指定为key => value 吗?
  • 抱歉,代码运行良好,我只是对大部分内容进行了大量编辑,以便简单地分享我正在做的事情的大纲。你是对的,我的代码就是这样。
  • 我针对此问题的解决方法是添加一个包含我的 json 内容副本的自定义标头,然后添加一个 request_prepare 处理程序,该处理程序使用该自定义标头中的信息手动更新每个传出请求的内容。它有效,但看起来真的很愚蠢。
  • 好的,抱歉,我不太熟悉这个模块以及它应该如何工作。也许更有经验的人可以帮助你?如果您愿意,我可以尝试重现该问题,但我需要更多信息,例如 $host$uri..
  • 问题不是 LWP,而是使用 302 进行重定向而不是状态码 307。What is the correct behavior expected of an HTTP POST => 302 redirect to GET? 可能重复

标签: perl lwp-useragent


【解决方案1】:

这是 302 响应的适当行为。

当前的 HTTP 规范 RFC 7231 中关于 302 响应的内容如下:

注意:由于历史原因,用户代理可能会更改请求 从 POST 到 GET 的方法用于后续请求。如果这 行为是不希望的,307(临时重定向)状态代码 可以改用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2021-04-09
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多