Net-HTTP 6.06 intermittent death in Net::HTTP::Methods sub my_readline() (solved) [rt.cpan.org #86448]
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 停滞
- 技術スタック
- perl
- 領域
- networking
調査の方向性
Net/HTTP/Methods.pm を確認し、my_readline() エントリーポイントと 265 行目で報告されている失敗に焦点を当てます。提供されたパッチを、issue で説明されている SSL_WANT_READ および SSL_WANT_WRITE の動作と比較します。IO::Socket::SSL が先に別の読み取りまたは書き込みを要求した場合でも、断続的な HTTPS の読み取りでエラー終了しなくなれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Migrated from rt.cpan.org#86448 (status was 'new')
Requestors:
From [email protected] on 2013-06-26 15:46:52:
Description:
Net::HTTP::Methods from Net-HTTP 6.06 dies intermittently with:
Status read failed: No such file or directory at â¦/perl/vendor/lib/Net/HTTP/Methods.pm line 265.
Cause:
IO::Socket::SSL object can reject the read request with an error of either "SSL wants a read first" or "SSL wants a write first." This is apparently some overhead of SSL where it wants a read/write before allowing you to read/write in some cases. It's described somewhat (but not much) better under errstr() in the latest IO::Socket::SSL perldoc.
Reproducing:
I'm not sure how hard this is to reproduce since triggers are unknown. I'm accessing cloud based SOAP via SOAP::WSDL over https from a busy server and it occurs maybe one out of a dozen times. It seems to correlate with SSL taking an extra bit of time to setup the connection when something in the chain is busier or has a little latency. Thus far, I've only seen SSL_WANT_READ, and it clears immediately on the next redo READ, but there seems to be no harm in preparing for SSL_WANT_WRITE in the patch as well.
Patch:
--- broken/Net/HTTP/Methods.pm 2013-03-10 23:35:42.000000000 -0500
+++ fixed/Net/HTTP/Methods.pm 2013-06-26 10:12:37.205639200 -0500
@@ -243,40 +243,41 @@
sub my_readline {
my $self = shift;
my $what = shift;
for (${*$self}{'http_buf'}) {
my $max_line_length = ${*$self}{'http_max_line_length'};
my $pos;
while (1) {
# find line ending
$pos = index($_, "\012");
last if $pos >= 0;
die "$what line too long (limit is $max_line_length)"
if $max_line_length && length($_) > $max_line_length;
# need to read more data to find a line ending
READ:
{
die "read timeout" unless $self->can_read;
my $n = $self->sysread($_, 1024, length);
unless (defined $n) {
redo READ if $!{EINTR} || $!{EAGAIN};
+ redo READ if ( $self->isa('IO::Socket::SSL') && $self->errstr() =~ /^SSL wants a (?:read|write) first$/ );
# if we have already accumulated some data let's at least
# return that as a line
die "$what read failed: $!" unless length;
}
unless ($n) {
return undef unless length;
return substr($_, 0, length, "");
}
}
}
die "$what line too long ($pos; limit is $max_line_length)"
if $max_line_length && $pos > $max_line_length;
my $line = substr($_, 0, $pos+1, "");
$line =~ s/(\015?\012)\z// || die "Assert";
return wantarray ? ($line, $1) : $line;
}
}
Thanks for your time and your code.
--
Raymond Ferguson
Integrated Applications Engineer | CDW
- 主要言語
- Perl
- スター
- 20
- フォーク
- 27
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
libwww-perl/Net-HTTP のほかの issue
-
難易度 4/5 3〜5日 初心者へのやさしさ 50/100
libwww-perl/Net-HTTP#99 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
libwww-perl/Net-HTTP#95 ·
-
t/live.t may failオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 45/100
libwww-perl/Net-HTTP#87 · コメント 2 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 45/100
libwww-perl/Net-HTTP#79 · コメント 6 件 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 48/100
libwww-perl/Net-HTTP#74 ·
libwww-perl/Net-HTTP の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
jimsalterjrs/sanoid#1116 · リアクション 1 件 ·
-
Add .gitattributes so share/skel keeps LF on a Windows git checkout対応中かも @sadhana-s-codez が 2 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
PerlDancer/Dancer2#1854 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
major/MySQLTuner-perl#1007 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100