]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/NNTP.pm
nntp: consistently use 501 for unsupported LIST
[public-inbox.git] / lib / PublicInbox / NNTP.pm
index 0d0de976f562454c0c3443eed3c95cbbf6a9f6b7..dd033e89e75bec54ee2a1e40c8e6b1ca4784a0ea 100644 (file)
@@ -123,14 +123,14 @@ sub list_newsgroups ($;$) {
        }
 }
 
-# LIST SUBSCRIPTIONS not supported
+# LIST SUBSCRIPTIONS, DISTRIB.PATS are not supported
 sub cmd_list ($;$$) {
        my ($self, @args) = @_;
        if (scalar @args) {
                my $arg = shift @args;
                $arg =~ tr/A-Z./a-z_/;
                $arg = "list_$arg";
-               return '503 function not performed' if $DISABLED{$arg};
+               return r501 if $DISABLED{$arg};
 
                $arg = eval {
                        no strict 'refs';
@@ -480,9 +480,8 @@ sub get_range ($$) {
 
 sub hdr_val ($$) {
        my ($r, $header) = @_;
-       $header = lc $header;
-       return $r->[3] if ($header eq 'bytes');
-       return $r->[4] if ($header eq 'lines');
+       return $r->[3] if $header =~ /\A:?bytes\z/i;
+       return $r->[4] if $header =~ /\A:?lines\z/i;
        $r = $r->[2]->header_obj->header($header);
        defined $r or return;
        $r =~ s/[\r\n\t]+/ /sg;
@@ -879,22 +878,18 @@ sub event_write {
 sub event_read {
        my ($self) = @_;
        use constant LINE_MAX => 512; # RFC 977 section 2.3
-       my $line;
        my $r = 1;
-again:
+
+       my $buf = $self->read(LINE_MAX) or return $self->close;
+       $self->{rbuf} .= $$buf;
        while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]+)\r?\n//) {
-               $line = $1;
+               my $line = $1;
                my $t0 = now();
                $r = eval { $self->process_line($line) };
                my $d = $self->{long_res} ?
                        ' deferred['.fileno($self->{sock}).']' : '';
                out($self, "$line - %0.6f$d", now() - $t0);
        }
-       unless (defined $line) {
-               my $buf = $self->read(LINE_MAX) or return $self->close;
-               $self->{rbuf} .= $$buf;
-               goto again;
-       }
 
        return $self->close if $r < 0;
        my $len = length($self->{rbuf});
@@ -919,4 +914,9 @@ sub watch_read {
        $rv;
 }
 
+sub busy () {
+       my ($self) = @_;
+       ($self->{rbuf} ne '' || $self->{long_res} || $self->{write_buf_size});
+}
+
 1;