Net-HTTP 6.06 intermittent death in Net::HTTP::Methods sub my_readline() (solved) [rt.cpan.org #86448]
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 25/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- perl
- Lĩnh vực
- networking
Hướng nghiên cứu
Xem xét Net/HTTP/Methods.pm, tập trung vào điểm vào my_readline() và lỗi được báo cáo tại dòng 265. So sánh bản vá được cung cấp với hành vi của SSL_WANT_READ và SSL_WANT_WRITE được mô tả trong issue. Công việc được xem là hoàn tất khi các lần đọc HTTPS không liên tục không còn bị lỗi khi IO::Socket::SSL trước tiên yêu cầu một lần đọc hoặc ghi khác.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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
- Ngôn ngữ chính
- Perl
- Star
- 20
- Fork
- 27
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của libwww-perl/Net-HTTP
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 50/100
libwww-perl/Net-HTTP#99 ·
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 45/100
libwww-perl/Net-HTTP#95 ·
-
t/live.t may failĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 45/100
libwww-perl/Net-HTTP#87 · 2 bình luận ·
-
Improve error messageĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 45/100
libwww-perl/Net-HTTP#79 · 6 bình luận ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 48/100
libwww-perl/Net-HTTP#74 ·
Tất cả issue của libwww-perl/Net-HTTP
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
ai-driven-fuzzing bug claude Minor
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
linagora/lemonldap-ng-plugins#170 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
libwww-perl/HTTP-Message#236 ·
-
1.severity: security
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày
-
wave-followup
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100