2

サーバーに 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/

それだけだと思います!

4

1 に答える 1