Perl LWP::UserAgent请求在使用http1.1时不会返回,但在使用http1.0时运行良好!?为什么?

Perl LWP::UserAgent请求在使用http1.1时不会返回,但在使用http1.0时运行良好!?为什么?,perl,openssl,lwp,lwp-useragent,http-1.1,Perl,Openssl,Lwp,Lwp Useragent,Http 1.1,我有一个非常简单的脚本(在SLES11系统上)向服务器发送http1.1请求。这在很长一段时间内效果良好。几天后它就停止工作了。我不知道为什么。经过一些调查,我发现强制脚本使用http1.0,它又开始工作了。我不知道为什么。我想知道为什么它不能在默认的http1.1模式下工作 据我所知,我已经启用了调试(请参阅下面的代码)。但我什么也没看到——我的脚本挂起了。没有网络活动。我没有看到套接字将被打开(netstat-a),也没有看到服务器上来自我的客户机的任何传入流量。(一个“telnet mys

我有一个非常简单的脚本(在SLES11系统上)向服务器发送http1.1请求。这在很长一段时间内效果良好。几天后它就停止工作了。我不知道为什么。经过一些调查,我发现强制脚本使用http1.0,它又开始工作了。我不知道为什么。我想知道为什么它不能在默认的http1.1模式下工作

据我所知,我已经启用了调试(请参阅下面的代码)。但我什么也没看到——我的脚本挂起了。没有网络活动。我没有看到套接字将被打开(netstat-a),也没有看到服务器上来自我的客户机的任何传入流量。(一个“telnet myserver myport”可以正常工作。)

有人能帮我找出这个问题吗?如何启用更多的调试来查看真正的问题在哪里

#!/usr/bin/perl -w

use strict;
use warnings;
use Data::Dumper;
use HTTP::Request::Common;
use LWP::Debug qw(+);
use LWP::UserAgent;

# Workaround: forcing http1.0 instead of using http1.1, it works again!
use LWP::Protocol::https10 ();
LWP::Protocol::implementor('https', 'LWP::Protocol::https10');
# EO workaround

my $ua        = LWP::UserAgent->new;
$ua->ssl_opts( verify_hostname => 0 );
my $response  = $ua->request(
    POST 'https://myuser:mypassword@myserver:8888/service/myservice',
    Connection   => 'close',     # Edit: added, see comments below
    Content_Type => 'text/xml',
    Content      => '... my content ...'
);
$ua->request()不返回!我需要杀死脚本

编辑:好的,似乎没有人知道如何继续。所以我开始使用perl调试器调试它

LWP::UserAgent::post(/usr/lib/perl5/site_perl/5.10.0/LWP/UserAgent.pm:418):
418:        return $self->request( HTTP::Request::Common::POST( @parameters ), @suff );
所以我可以看到它不是从request()返回的

无论如何,由于
LWP::UserAgent
调用
HTTP::Request::Common
这一事实,我将上面的示例代码改回使用
HTTP::Request::Common
在调试时跳过该步骤

好的。。。新结果:

LWP::Protocol::implementor(/usr/lib/perl5/site_perl/5.10.0/Net/HTTPS.pm:26):
26:         eval { require IO::Socket::SSL; };
Inside request()它挂在
IO::Socket::SSL
上。意味着,此脚本足以进行进一步调试:

#!/usr/bin/perl
require IO::Socket::SSL;
这句话没有回来

再往下看,在
IO::Socket::SSL内部,它挂起在:

IO::Socket::SSL::CODE(0x1274370)(/usr/lib/perl5/site_perl/5.10.0/IO/Socket/SSL.pm:92):
92:             Net::SSLeay::SSLeay_add_ssl_algorithms();
啊!关于这个问题已经有一个错误的报告:指向它说:

我在安装了openssl-0.9.8j的SLES 11 SP2上遇到了同样的问题。 升级到openssl-0.9.8r确实解决了问题。。。 可以在此存储库中找到0.9.8r的包:


我猜就是这样

已经有一个关于这个问题的错误报告:指向它说:

我在安装了openssl-0.9.8j的SLES 11 SP2上遇到了同样的问题。升级到openssl-0.9.8r确实解决了问题。。。可以在此存储库中找到0.9.8r的包:


我猜就是这样

你有什么错误吗?我认为Bareword
POST
应该会出现一些错误。另外,为什么不直接使用
LWP::UserAgent
中的
post()
方法呢?不,我没有得到任何输出。没有什么。它只是挂着。嗯,我只是把剧本简化到这几行。当然,我可以直接使用LWP::UserAgent,但它的行为完全相同……您使用的是
LWP::UserAgent
。我很好奇你为什么不使用
post()
方法。我对
POST
Bareword很好奇,为什么这个错误没有被发现?如果将该行更改为
$ua->post($url,Content\u Type=>'text/xml',Content=>$Content,)OK…:)还是一样。现在,just post()不会返回。最初(正如您可能从本文的历史记录中看到的),我发布了一个SOAP::Lite问题,其符号完全相同。现在我可以找到我有一个LWP::UserAgent问题。@chrsblck
->post
只是
->request
的缩写,方法是
“post”
。而
POST
是由
HTTP::Request::Common
提供的,这是一种更好的糖分。