From b4c631d23013012f721ca1fe879f23576ce1476e Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 19 Sep 2015 02:03:34 +0000 Subject: nntp: speed up XHDR for the Message-ID case We can use our msgmap database to implement "XHDR Message-ID [range]" commands quickly. This helps immensely with slrnpull, which prefers XHDR to LISTGROUP for some reason... --- lib/PublicInbox/NNTP.pm | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'lib') diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 8275ef08..47b03e02 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -505,9 +505,45 @@ sub long_response ($$$$) { undef; } +sub xhdr_message_id ($$) { # optimize XHDR Message-ID [range] for slrnpull. + my ($self, $range) = @_; + + my $mm = $self->{ng}->mm; + if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID + my $n = $mm->num_for($range); + more($self, '221 Header follows'); + more($self, "<$range> <$range>") if defined $n; + '.'; + } else { # numeric range + $range = $self->{article} unless defined $range; + my $r = get_range($self, $range); + return $r unless ref $r; + my ($beg, $end) = @$r; + more($self, '221 Header follows'); + $self->long_response($beg, $end, sub { + my ($i) = @_; + my $mid = $mm->mid_for($$i); + more($self, "$$i <$mid>") if defined $mid; + }); + } +} + sub cmd_xhdr ($$;$) { my ($self, $header, $range) = @_; defined $self->{ng} or return '412 no news group currently selected'; + my $sub = $header; + $sub =~ tr/A-Z-/a-z_/; + $sub = eval { + no strict 'refs'; + $sub = *{'xhdr_'.$sub}{CODE}; + }; + return xhdr_slow($self, $header, $range) unless defined $sub; + $sub->($self, $range); +} + +sub xhdr_slow ($$$) { + my ($self, $header, $range) = @_; + if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID my $r = $self->art_lookup($range, 2); return $r unless ref $r; -- cgit v1.2.3-24-ge0c7