]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/NNTP.pm
remove redundant NewsGroup class
[public-inbox.git] / lib / PublicInbox / NNTP.pm
index e77ccaa4f2cbcf2f68c33708ff482efa836b347b..58b86a8297a5ba5e4a60941c5533277530e9235d 100644 (file)
@@ -11,8 +11,8 @@ use PublicInbox::Search;
 use PublicInbox::Msgmap;
 use PublicInbox::Git;
 use PublicInbox::MID qw(mid2path);
+require PublicInbox::EvCleanup;
 use Email::Simple;
-use Data::Dumper qw(Dumper);
 use POSIX qw(strftime);
 use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);
 use URI::Escape qw(uri_escape_utf8);
@@ -39,15 +39,15 @@ my $LIST_HEADERS = join("\r\n", @OVERVIEW,
 my %DISABLED; # = map { $_ => 1 } qw(xover list_overview_fmt newnews xhdr);
 
 my $EXPMAP; # fd -> [ idle_time, $self ]
-my $EXPTIMER;
+my $expt;
 our $EXPTIME = 180; # 3 minutes
 my $WEAKEN = {}; # string(nntpd) -> nntpd
-my $WEAKTIMER;
+my $weakt;
+my $nextt;
 
-my $next_tick;
 my $nextq = [];
 sub next_tick () {
-       $next_tick = undef;
+       $nextt = undef;
        my $q = $nextq;
        $nextq = [];
        foreach my $nntp (@$q) {
@@ -71,7 +71,7 @@ sub update_idle_time ($) {
 # reduce FD pressure by closing some "git cat-file --batch" processes
 # and unused FDs for msgmap and Xapian indices
 sub weaken_groups () {
-       $WEAKTIMER = undef;
+       $weakt = undef;
        foreach my $nntpd (values %$WEAKEN) {
                $_->weaken_all foreach (@{$nntpd->{grouplist}});
        }
@@ -82,7 +82,6 @@ sub expire_old () {
        my $now = now();
        my $exp = $EXPTIME;
        my $old = $now - $exp;
-       my $next = $now + $exp;
        my $nr = 0;
        my %new;
        while (my ($fd, $v) = each %$EXPMAP) {
@@ -90,26 +89,22 @@ sub expire_old () {
                if ($idle_time < $old) {
                        $nntp->close; # idempotent
                } else {
-                       my $nexp = $idle_time + $exp;
-                       $next = $nexp if ($nexp < $next);
                        ++$nr;
                        $new{$fd} = $v;
                }
        }
        $EXPMAP = \%new;
        if ($nr) {
-               $next -= $now;
-               $next = 0 if $next < 0;
-               $EXPTIMER = Danga::Socket->AddTimer($next, *expire_old);
+               $expt = PublicInbox::EvCleanup::later(*expire_old);
                weaken_groups();
        } else {
-               $EXPTIMER = undef;
+               $expt = undef;
                # noop to kick outselves out of the loop ASAP so descriptors
                # really get closed
-               Danga::Socket->AddTimer(0, sub {});
+               PublicInbox::EvCleanup::asap(sub {});
 
                # grace period for reaping resources
-               $WEAKTIMER ||= Danga::Socket->AddTimer(30, *weaken_groups);
+               $weakt ||= PublicInbox::EvCleanup::later(*weaken_groups);
        }
 }
 
@@ -123,7 +118,7 @@ sub new ($$$) {
        $self->watch_read(1);
        update_idle_time($self);
        $WEAKEN->{"$nntpd"} = $nntpd;
-       $EXPTIMER ||= Danga::Socket->AddTimer($EXPTIME, *expire_old);
+       $expt ||= PublicInbox::EvCleanup::later(*expire_old);
        $self;
 }
 
@@ -151,7 +146,7 @@ sub process_line ($$) {
        my $res = eval { $req->($self, @args) };
        my $err = $@;
        if ($err && !$self->{closed}) {
-               chomp($l = Dumper(\$l));
+               chomp($l);
                err($self, 'error from: %s (%s)', $l, $err);
                $res = '503 program fault - command not performed';
        }
@@ -200,7 +195,7 @@ sub list_active_times ($;$) {
        foreach my $ng (@{$self->{nntpd}->{grouplist}}) {
                $ng->{newsgroup} =~ $wildmat or next;
                my $c = eval { $ng->mm->created_at } || time;
-               more($self, "$ng->{newsgroup} $c $ng->{address}");
+               more($self, "$ng->{newsgroup} $c $ng->{-primary_address}");
        }
 }
 
@@ -418,7 +413,8 @@ sub cmd_last ($) { article_adj($_[0], -1) }
 sub cmd_post ($) {
        my ($self) = @_;
        my $ng = $self->{ng};
-       $ng ? "440 mailto:$ng->{address} to post" : '440 posting not allowed'
+       $ng ? "440 mailto:$ng->{-primary_address} to post"
+               : '440 posting not allowed'
 }
 
 sub cmd_quit ($) {
@@ -443,8 +439,8 @@ sub set_nntp_headers {
        # clobber some
        $hdr->header_set('Newsgroups', $ng->{newsgroup});
        $hdr->header_set('Xref', xref($ng, $n));
-       header_append($hdr, 'List-Post', "<mailto:$ng->{address}>");
-       if (my $url = $ng->{url}) {
+       header_append($hdr, 'List-Post', "<mailto:$ng->{-primary_address}>");
+       if (my $url = $ng->base_url) {
                $mid = uri_escape_utf8($mid);
                header_append($hdr, 'Archived-At', "<$url$mid/>");
                header_append($hdr, 'List-Archive', "<$url>");
@@ -634,7 +630,7 @@ sub long_response ($$$$) {
                        update_idle_time($self);
 
                        push @$nextq, $self;
-                       $next_tick ||= Danga::Socket->AddTimer(0, *next_tick);
+                       $nextt ||= PublicInbox::EvCleanup::asap(*next_tick);
                } else { # all done!
                        $self->{long_res} = undef;
                        $self->watch_read(1);
@@ -972,6 +968,7 @@ sub event_read {
        $self->{rbuf} .= $$buf;
        while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]+)\r?\n//) {
                my $line = $1;
+               return $self->close if $line =~ /[[:cntrl:]]/s;
                my $t0 = now();
                my $fd = $self->{fd};
                $r = eval { process_line($self, $line) };
@@ -996,7 +993,7 @@ sub watch_read {
                # in case we really did dispatch a read event and started
                # another long response.
                push @$nextq, $self;
-               $next_tick ||= Danga::Socket->AddTimer(0, *next_tick);
+               $nextt ||= PublicInbox::EvCleanup::asap(*next_tick);
        }
        $rv;
 }