サーバーに http1.1 要求を送信するための非常に単純なスクリプト (SLES11 システム上) があります。これは長い間うまくいきました。数日以来、それは機能しなくなりました。理由がわかりません。調査の結果、スクリプトに 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() は戻りません! スクリプトを kill/^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();
ああ!この問題に関するバグレポートが既にあります: Suse 11 P2 で Net-SSLeay がハングアップし、次のようなバグ #81575が指摘されています。
openssl-0.9.8j がインストールされている SLES 11 SP2 でも同じ問題が発生しました。openssl-0.9.8r へのアップグレードにより、問題は解決しました。... 0.9.8r のパッケージは、次のリポジトリにあります: http://download.opensuse.org/repositories/security:/fips/
それだけだと思います!