我有一个非常简单的脚本(在 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; };
在 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();
啊啊啊!已经有一个关于这个问题的错误报告:Net-SSLeay 挂在 Suse 11 P2 上,指向错误 #81575,上面写着:
我在安装了 openssl-0.9.8j 的 SLES 11 SP2 上遇到了同样的问题。升级到 openssl-0.9.8r 确实解决了这个问题。... 0.9.8r 的包可以在这个存储库中找到:http: //download.opensuse.org/repositories/security :/fips/
猜就是了!