From b25ee445c9c66d8e41b889196668bf2b26a54d53 Mon Sep 17 00:00:00 2001
From: Eric Wong <e@80x24.org>
Date: Tue, 22 Sep 2015 10:09:47 +0000
Subject: [PATCH] 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 = '<nntp@example.com>';
+	my %xhdr = (
+		'message-id' => $mid,
+		'subject' => 'hihi',
+		'date' => 'Thu, 01 Jan 1970 00:00:00 +0000',
+		'from' => 'Me <me@example.com>',
+		'to' => 'You <you@example.com>',
+		'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');
-- 
2.50.0