about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/SearchIdxShard.pm8
-rw-r--r--t/v2writable.t12
2 files changed, 16 insertions, 4 deletions
diff --git a/lib/PublicInbox/SearchIdxShard.pm b/lib/PublicInbox/SearchIdxShard.pm
index 1ea01095..06bcd403 100644
--- a/lib/PublicInbox/SearchIdxShard.pm
+++ b/lib/PublicInbox/SearchIdxShard.pm
@@ -69,8 +69,9 @@ sub shard_worker_loop ($$$$$) {
                         $self->remove_by_oid($oid, $mid);
                 } else {
                         chomp $line;
-                        my ($bytes, $num, $blob, $mid, $ds, $ts) =
-                                                        split(/ /, $line);
+                        # n.b. $mid may contain spaces(!)
+                        my ($bytes, $num, $blob, $ds, $ts, $mid) =
+                                                        split(/ /, $line, 6);
                         $self->begin_txn_lazy;
                         my $n = read($r, my $msg, $bytes) or die "read: $!\n";
                         $n == $bytes or die "short read: $n != $bytes\n";
@@ -93,7 +94,8 @@ sub shard_worker_loop ($$$$$) {
 sub index_raw {
         my ($self, $msgref, $mime, $smsg) = @_;
         if (my $w = $self->{w}) {
-                print $w join(' ', @$smsg{qw(bytes num blob mid ds ts)}),
+                # mid must be last, it can contain spaces (but not LF)
+                print $w join(' ', @$smsg{qw(bytes num blob ds ts mid)}),
                         "\n", $$msgref or die "failed to write shard $!\n";
         } else {
                 $$msgref = undef;
diff --git a/t/v2writable.t b/t/v2writable.t
index cdcfe4d0..66d5663e 100644
--- a/t/v2writable.t
+++ b/t/v2writable.t
@@ -109,6 +109,11 @@ if ('ensure git configs are correct') {
         @mids = $mime->header_obj->header_raw('Message-Id');
         like($mids[0], $sane_mid, 'mid was generated');
         is(scalar(@mids), 1, 'new generated');
+
+        @warn = ();
+        $mime->header_set('Message-Id', '<space@ (NXDOMAIN) >');
+        ok($im->add($mime), 'message added with space in Message-Id');
+        is_deeply([], \@warn);
 }
 
 {
@@ -175,8 +180,13 @@ EOF
                 is($uniq{$mid}++, 0, "MID for $num is unique in XOVER");
                 is_deeply($n->xhdr('Message-ID', $num),
                          { $num => $mid }, "XHDR lookup OK on num $num");
+
+                # FIXME PublicInbox::NNTP (server) doesn't handle spaces in
+                # Message-ID, but neither does Net::NNTP (client)
+                next if $mid =~ / /;
+
                 is_deeply($n->xhdr('Message-ID', $mid),
-                         { $mid => $mid }, "XHDR lookup OK on MID $num");
+                         { $mid => $mid }, "XHDR lookup OK on MID $mid ($num)");
         }
         my %nn;
         foreach my $mid (@{$n->newnews(0, $group)}) {