【问题标题】:Perl LWP::UserAgent request does not return using http1.1 but working fine using http1.0!? Why?Perl LWP::UserAgent 请求不使用 http1.1 返回但使用 http1.0 工作正常!?为什么?
【发布时间】:2013-04-16 10:59:27
【问题描述】:

我有一个非常简单的脚本(在 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 hangs on Suse 11 P2 指向Bug #81575,上面写着:

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

猜对了!

【问题讨论】:

  • 您是否遇到任何错误? Bareword POST 应该会出现一些我认为的错误。另外,为什么不直接使用LWP::UserAgent 中的post() 方法呢?
  • 不,我没有得到任何输出。没有。它只是挂起。好吧,我只是将脚本精简到这几行。当然我可以直接使用 LWP::UserAgent 但它具有完全相同的行为......
  • 您正在使用LWP::UserAgent。我很好奇你为什么不使用post() 方法。我很好奇POST Bareword,为什么这个错误没有出现?如果您将该行更改为 $ua->post($url, Content_Type => 'text/xml', Content => $content, ); 会发生什么
  • Okokok... :) 还是一样。现在只是 post() 不返回。最初(正如您从这篇文章的历史中看到的那样),我发布了一个 SOAP::Lite 问题,症状完全相同。现在我可以追踪到我有 LWP::UserAgent 问题。
  • @chrsblck ->post 只是->request 的简写,方法为"POST"POST 是由 HTTP::Request::Common 提供的,这是一种更好的糖。

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


【解决方案1】:

已经有一个关于这个问题的错误报告:Net-SSLeay hangs on Suse 11 P2 指向Bug #81575,上面写着:

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

猜对了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2010-12-20
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多