Perl LWP :: UserAgent请求不使用http1.1返回,但使用http1.0正常工作!?为什么?

时间:2013-04-16 10:59:27

标签: perl openssl lwp lwp-useragent http-1.1

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

我已经根据我的意识启用了调试(参见下面的代码)。但我没有看到任何东西 - 我的剧本只是挂起。没有网络活动。我看到一个套接字将是openend(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()不会返回!我需要杀死/ ^ C脚本!

编辑:好吧,似乎没有人知道如何继续。所以我使用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; };

内部请求()它挂起在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();

AHHHH!已经有关于此问题的错误报告:Net-SSLeay hangs on Suse 11 P2指向Bug #81575说:

  

我在SLES 11 SP2上遇到了同样的问题,它安装了openssl-0.9.8j。   升级到openssl-0.9.8r确实解决了这个问题。 ...   可以在此存储库中找到0.9.8r的软件包:   http://download.opensuse.org/repositories/security:/fips/

猜猜是它!

1 个答案:

答案 0 :(得分:0)

已经有关于此问题的错误报告:Net-SSLeay hangs on Suse 11 P2指向Bug #81575说:

我在SLES 11 SP2上遇到了同样的问题,它安装了openssl-0.9.8j。升级到openssl-0.9.8r确实解决了这个问题。 ...可以在此存储库中找到0.9.8r的软件包:http://download.opensuse.org/repositories/security:/fips/

猜猜是它!