From b25ee445c9c66d8e41b889196668bf2b26a54d53 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 22 Sep 2015 10:09:47 +0000 Subject: nntp: XHDR fixes for Message-ID lookups We'll require some modifications for HDR support, though. --- lib/PublicInbox/NNTP.pm | 13 +++++++------ t/nntpd.t | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 1286b706..c8ef01e2 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -546,9 +546,10 @@ sub xhdr_message_id ($$) { # optimize XHDR Message-ID [range] for slrnpull. my $mm = $self->{ng}->mm; if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID - my $n = $mm->num_for($range); + my $n = $mm->num_for($1); + return '430 No article with that message-id' unless $n; more($self, '221 Header follows'); - more($self, "<$range> <$range>") if defined $n; + more($self, "$range $range"); '.'; } else { # numeric range $range = $self->{article} unless defined $range; @@ -575,9 +576,9 @@ sub xhdr_xref ($$) { # optimize XHDR Xref [range] for rtin my $ng = $self->{ng}; my $mm = $ng->mm; if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID - my $n = $mm->num_for($range); + my $n = $mm->num_for($1); more($self, '221 Header follows'); - more($self, "<$range> ".xref($ng, $n)) if defined $n; + more($self, "$range ".xref($ng, $n)) if defined $n; '.'; } else { # numeric range $range = $self->{article} unless defined $range; @@ -655,12 +656,12 @@ sub cmd_xhdr ($$;$) { sub xhdr_slow ($$$) { my ($self, $header, $range) = @_; - if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID + if (defined $range && $range =~ /\A<.+>\z/) { # Message-ID my $r = $self->art_lookup($range, 2); return $r unless ref $r; more($self, '221 Header follows'); if (defined($r = xhdr($r, $header))) { - more($self, "<$range> $r"); + more($self, "$range $r"); } '.'; } else { # numeric range diff --git a/t/nntpd.t b/t/nntpd.t index d886e3c6..090e1500 100644 --- a/t/nntpd.t +++ b/t/nntpd.t @@ -95,6 +95,23 @@ EOF is_deeply($list, { $group => [ qw(1 1 n) ] }, 'LIST works'); is_deeply([$n->group($group)], [ qw(0 1 1), $group ], 'GROUP works'); + my $mid = ''; + my %xhdr = ( + 'message-id' => $mid, + 'subject' => 'hihi', + 'date' => 'Thu, 01 Jan 1970 00:00:00 +0000', + 'from' => 'Me ', + 'to' => 'You ', + 'cc' => $addr, + 'xref' => "example.com $group:1" + ); + while (my ($k, $v) = each %xhdr) { + is_deeply($n->xhdr("$k $mid"), { $mid => $v }, + "$k by message-id works"); + is_deeply($n->xhdr("$k 1"), { 1 => $v }, + "$k by article number works"); + } + # TODO: upgrades and such ok(kill('TERM', $pid), 'killed nntpd'); -- cgit v1.2.3-24-ge0c7