]> Sergey Matveev's repositories - public-inbox.git/commitdiff
Merge remote-tracking branch 'origin/ds'
authorEric Wong <e@80x24.org>
Sat, 15 Jun 2019 17:38:42 +0000 (17:38 +0000)
committerEric Wong <e@80x24.org>
Sat, 15 Jun 2019 17:38:42 +0000 (17:38 +0000)
* origin/ds:
  ds: stop caring about event flags set by epoll/poll/kqueue
  ds: do not distinguish between POLLHUP and POLLERR
  ds: remove read method, here, too
  nntp: use sysread to append to existing buffer
  ds: remove steal_socket method
  ds: remove {fd} field
  ds: reduce Errno imports and drop ->close reason
  ds: cleanup Errno imports and favor constant comparisons
  ds: simplify write buffer accounting

1  2 
lib/PublicInbox/NNTP.pm

diff --combined lib/PublicInbox/NNTP.pm
index 8a31b910be76a317df6838879a5918a32d0c46b2,85778c44c215f37ce3d4fdd19e4a6bc52d4a68a7..fa412f8c6c8bc893b84ed80cb668cc45522a6fb9
@@@ -66,7 -66,8 +66,8 @@@ sub next_tick () 
  
  sub update_idle_time ($) {
        my ($self) = @_;
-       my $fd = $self->{fd};
+         my $sock = $self->{sock} or return;
+       my $fd = fileno($sock);
        defined $fd and $EXPMAP->{$fd} = [ now(), $self ];
  }
  
@@@ -434,26 -435,6 +435,26 @@@ sub xref ($$$$) 
  sub set_nntp_headers ($$$$$) {
        my ($self, $hdr, $ng, $n, $mid) = @_;
  
 +      # why? leafnode requires a Path: header for some inexplicable
 +      # reason.  We'll fake the shortest one possible.
 +      $hdr->header_set('Path', 'y');
 +
 +      # leafnode (and maybe other NNTP clients) have trouble dealing
 +      # with v2 messages which have multiple Message-IDs (either due
 +      # to our own content-based dedupe or buggy git-send-email versions).
 +      my @mids = $hdr->header('Message-ID');
 +      if (scalar(@mids) > 1) {
 +              my $mid0 = "<$mid>";
 +              $hdr->header_set('Message-ID', $mid0);
 +              my @alt = $hdr->header('X-Alt-Message-ID');
 +              my %seen = map { $_ => 1 } (@alt, $mid0);
 +              foreach my $m (@mids) {
 +                      next if $seen{$m}++;
 +                      push @alt, $m;
 +              }
 +              $hdr->header_set('X-Alt-Message-ID', @alt);
 +      }
 +
        # clobber some
        my $xref = xref($self, $ng, $n, $mid);
        $hdr->header_set('Xref', $xref);
@@@ -535,13 -516,6 +536,13 @@@ sub _header ($) 
        my $hdr = $_[0]->header_obj->as_string;
        utf8::encode($hdr);
        $hdr =~ s/(?<!\r)\n/\r\n/sg;
 +
 +      # for leafnode compatibility, we need to ensure Message-ID headers
 +      # are only a single line.  We can't subclass Email::Simple::Header
 +      # and override _default_fold_at in here, either; since that won't
 +      # affect messages already in the archive.
 +      $hdr =~ s/^(Message-ID:)[ \t]*\r\n[ \t]+([^\r]+)\r\n/$1 $2\r\n/igsm;
 +
        $hdr
  }
  
@@@ -622,7 -596,7 +623,7 @@@ sub long_response ($$) 
        my ($self, $cb) = @_;
        die "BUG: nested long response" if $self->{long_res};
  
-       my $fd = $self->{fd};
+       my $fd = fileno($self->{sock});
        defined $fd or return;
        # make sure we disable reading during a long response,
        # clients should not be sending us stuff and making us do more
                                update_idle_time($self);
                                check_read($self);
                        }
-               } elsif ($more) { # $self->{write_buf_size}:
+               } elsif ($more) { # scalar @{$self->{wbuf}}:
                        # no recursion, schedule another call ASAP
                        # but only after all pending writes are done
                        update_idle_time($self);
@@@ -952,7 -926,7 +953,7 @@@ use constant MSG_MORE => ($^O eq 'linux
  
  sub do_more ($$) {
        my ($self, $data) = @_;
-       if (MSG_MORE && !$self->{write_buf_size}) {
+       if (MSG_MORE && !scalar(@{$self->{wbuf}})) {
                my $n = send($self->{sock}, $data, MSG_MORE);
                if (defined $n) {
                        my $dlen = length($data);
        do_write($self, $data);
  }
  
- # callbacks for PublicInbox::DS
- sub event_hup { $_[0]->close }
- sub event_err { $_[0]->close }
  sub event_write {
        my ($self) = @_;
        update_idle_time($self);
  sub event_read {
        my ($self) = @_;
        use constant LINE_MAX => 512; # RFC 977 section 2.3
-       if (index($self->{rbuf}, "\n") < 0) {
-               my $buf = $self->read(LINE_MAX) or return $self->close;
-               $self->{rbuf} .= $$buf;
+       my $rbuf = \($self->{rbuf});
+       my $r;
+       if (index($$rbuf, "\n") < 0) {
+               my $off = length($$rbuf);
+               $r = sysread($self->{sock}, $$rbuf, LINE_MAX, $off);
+               unless (defined $r) {
+                       return if $!{EAGAIN};
+                       return $self->close;
+               }
+               return $self->close if $r == 0;
        }
-       my $r = 1;
-       while ($r > 0 && $self->{rbuf} =~ s/\A[ \t\r\n]*([^\r\n]*)\r?\n//) {
+       $r = 1;
+       while ($r > 0 && $$rbuf =~ s/\A[ \t\r\n]*([^\r\n]*)\r?\n//) {
                my $line = $1;
                return $self->close if $line =~ /[[:cntrl:]]/s;
                my $t0 = now();
-               my $fd = $self->{fd};
+               my $fd = fileno($self->{sock});
                $r = eval { process_line($self, $line) };
                my $d = $self->{long_res} ?
                        " deferred[$fd]" : '';
        }
  
        return $self->close if $r < 0;
-       my $len = length($self->{rbuf});
+       my $len = length($$rbuf);
        return $self->close if ($len >= LINE_MAX);
        update_idle_time($self);
  }
@@@ -1022,7 -998,8 +1025,8 @@@ sub check_read 
  
  sub not_idle_long ($$) {
        my ($self, $now) = @_;
-       defined(my $fd = $self->{fd}) or return;
+         my $sock = $self->{sock} or return;
+       defined(my $fd = fileno($sock)) or return;
        my $ary = $EXPMAP->{$fd} or return;
        my $exp_at = $ary->[0] + $EXPTIME;
        $exp_at > $now;
  # for graceful shutdown in PublicInbox::Daemon:
  sub busy {
        my ($self, $now) = @_;
-       ($self->{rbuf} ne '' || $self->{long_res} || $self->{write_buf_size} ||
-        not_idle_long($self, $now));
+       ($self->{rbuf} ne '' || $self->{long_res} ||
+               scalar(@{$self->{wbuf}}) || not_idle_long($self, $now));
  }
  
  1;