From: Eric Wong Date: Wed, 7 Mar 2018 19:05:20 +0000 (+0000) Subject: nntp: do not drain rbuf if there is a command pending X-Git-Tag: v1.1.0-pre1~23^2~10 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=b912a4ea144004aeedde2e28dee33c6c83dd2273 nntp: do not drain rbuf if there is a command pending Some clients pipeline requests aggressively (enough to match LINE_MAX) and we should not read from the client socket until we know there's no pending command in our read buffer. Reported-and-tested-by: Sergey Organov --- diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 1e564634..267fe4b9 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -949,10 +949,12 @@ sub event_write { sub event_read { my ($self) = @_; use constant LINE_MAX => 512; # RFC 977 section 2.3 - my $r = 1; - my $buf = $self->read(LINE_MAX) or return $self->close; - $self->{rbuf} .= $$buf; + if (index($self->{rbuf}, "\n") < 0) { + my $buf = $self->read(LINE_MAX) or return $self->close; + $self->{rbuf} .= $$buf; + } + my $r = 1; while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]+)\r?\n//) { my $line = $1; return $self->close if $line =~ /[[:cntrl:]]/s;