X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FNNTP.pm;h=800ce9265268eec77b240acfee66ecb82c74ca99;hb=aca2d958e5bf80d19d69f66d2c1ec6809fece29a;hp=d6f315bab42a9ed7e0b8b607a3ba6cf01066ef55;hpb=77c66b4cdb1d52321ed3cb6352fe0b72312cbb71;p=public-inbox.git diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index d6f315ba..800ce926 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -14,7 +14,7 @@ use PublicInbox::Git; require PublicInbox::EvCleanup; use Email::Simple; use POSIX qw(strftime); -PublicInbox::DS->import(qw(now)); +use PublicInbox::DS qw(now); use Digest::SHA qw(sha1_hex); use Time::Local qw(timegm timelocal); use constant { @@ -29,8 +29,9 @@ use constant { use PublicInbox::Syscall qw(EPOLLIN EPOLLONESHOT); use Errno qw(EAGAIN); -my @OVERVIEW = qw(Subject From Date Message-ID References Xref); -my $OVERVIEW_FMT = join(":\r\n", @OVERVIEW, qw(Bytes Lines)) . ":\r\n"; +my @OVERVIEW = qw(Subject From Date Message-ID References); +my $OVERVIEW_FMT = join(":\r\n", @OVERVIEW, qw(Bytes Lines), '') . + "Xref:full\r\n"; my $LIST_HEADERS = join("\r\n", @OVERVIEW, qw(:bytes :lines Xref To Cc)) . "\r\n"; my $CAPABILITIES = <<""; @@ -57,22 +58,20 @@ sub expire_old () { my $now = now(); my $exp = $EXPTIME; my $old = $now - $exp; - my $nr = 0; my %new; while (my ($fd, $v) = each %$EXPMAP) { my ($idle_time, $nntp) = @$v; if ($idle_time < $old) { if (!$nntp->shutdn) { - ++$nr; $new{$fd} = $v; } } else { - ++$nr; $new{$fd} = $v; } } $EXPMAP = \%new; - $expt = PublicInbox::EvCleanup::later(*expire_old) if $nr; + $expt = scalar(keys %new) ? PublicInbox::EvCleanup::later(*expire_old) + : undef; } sub greet ($) { $_[0]->write($_[0]->{nntpd}->{greet}) }; @@ -642,6 +641,11 @@ sub long_response ($$) { } elsif ($more) { # $self->{wbuf}: update_idle_time($self); + # COMPRESS users all share the same DEFLATE context. + # Flush it here to ensure clients don't see + # each other's data + $self->zflush; + # no recursion, schedule another call ASAP # but only after all pending writes are done my $wbuf = $self->{wbuf} ||= []; @@ -653,7 +657,8 @@ sub long_response ($$) { $long_cb = undef; res($self, '.'); out($self, " deferred[$fd] done - %0.6f", now() - $t0); - $self->requeue unless $self->{wbuf}; + my $wbuf = $self->{wbuf}; + $self->requeue unless $wbuf && @$wbuf; } }; $self->write($long_cb); # kick off! @@ -917,14 +922,15 @@ sub cmd_starttls ($) { # RFC 8054 sub cmd_compress ($$) { my ($self, $alg) = @_; - return '503 Only the DEFLATE is supported' if uc($alg) ne 'DEFLATE'; + return '503 Only DEFLATE is supported' if uc($alg) ne 'DEFLATE'; return r502 if $self->compressed || !$have_deflate; - res($self, '206 Compression active'); PublicInbox::NNTPdeflate->enable($self); $self->requeue; undef } +sub zflush {} # overridden by NNTPdeflate + sub cmd_xpath ($$) { my ($self, $mid) = @_; return r501 unless $mid =~ /\A<(.+)>\z/;