解決
私が受け入れた回答で@limulusによって報告されたように、これはNet::HTTPS
バージョン6.00のバグでした。常に新しい.0リリースに注意してください。そのモジュールのバグのあるバージョンと修正されたバージョンの関連する違いは次のとおりです。
D:\Opt\Perl512.32 :: diff lib\Net\HTTPS.pm site\lib\Net\HTTPS.pm
6c6
< $VERSION = "6.00";
---
> $VERSION = "6.02";
75,78c75,80
< # The underlying SSLeay classes fails to work if the socket is
< # placed in non-blocking mode. This override of the blocking
< # method makes sure it stays the way it was created.
< sub blocking { } # noop
---
> if ($SSL_SOCKET_CLASS eq "Net::SSL") {
> # The underlying SSLeay classes fails to work if the socket is
> # placed in non-blocking mode. This override of the blocking
> # method makes sure it stays the way it was created.
> *blocking = sub { };
> }
元の質問
関連性:接続エンドポイントの信頼性が低いため、HTTPSクライアントブロックが無期限に表示されるのは面倒です。
この実験は、自宅で簡単に設定して再生できます。必要なのは、着信クライアントをトラップするためのtarpitとPerlスクリプトの2つだけです。ターピットは、以下を使用して設定できますnetcat
。
nc -k -l localhost 9999 # on Linux, for multiple requests
nc -l -p 9999 localhost # on Cygwin, for one request only
次に、スクリプトで次のターピットを指定します。
use strict;
use LWP::UserAgent;
use HTTP::Request::Common;
print 'LWP::UserAgent::VERSION ', $LWP::UserAgent::VERSION, "\n";
print 'IO::Socket::SSL::VERSION ', $IO::Socket::SSL::VERSION, "\n";
my $ua = LWP::UserAgent->new( timeout => 5, keep_alive => 1 );
$ua->ssl_opts( timeout => 5, Timeout => 5 ); # Yes - see note below!
my $rsp = $ua->request( GET 'https://localhost:9999' );
if ( $rsp->is_success ) {
print $rsp->as_string;
} else {
die $rsp->status_line;
}
これは何をするつもりですか?さて、NetCatによって開かれたポートに接続してから...ハングします。無期限に。少なくとも開発者の時間に関しては。10分か2時間後にタイムアウトするかもしれませんが、私はチェックしていません。指定されたタイムアウトは、LinuxでもWindowsでも有効になりません(Win32、Cygwinをチェックしていません)。
使用したバージョン:
LWP::UserAgent::VERSION 6.02
IO::Socket::SSL::VERSION 1.44
# on Linux
LWP::UserAgent::VERSION 6.02
IO::Socket::SSL::VERSION 1.44
# on Win32
次に、timeout
とTimeout
パラメータについて説明します。前者はLWP::UAのパラメーターの名前であり、後者はIO :: Socket :: SSLの名前であり、 LWP :: Protocol::httpsを介して使用されます。(ちなみに、なぜmetacpan HTTPSなのですか?まあ、少なくともそれはターピットではありません。)私はどういうわけかこれらのパラメーターを渡してもらいたいと思っています:)
ご存知のとおり、keep_alive
タイムアウトが機能しないこととは何の関係もありません。経験的に検証しました。:)
とにかく、深く掘り下げる前に、ここで何が起こっているのか、HTTPSでタイムアウトを機能させる方法を誰かが知っていますか?私がこれに遭遇した最初の人だとは信じがたい。