about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-09-21 11:11:08 +0000
committerEric Wong <e@80x24.org>2015-09-21 11:37:02 +0000
commite2c72e2671d395cbc3fff9cad5c8da4e08367e26 (patch)
tree08ba05b31dbb6b04f291dae728872540eef2203c /lib
parentf4ae902794c20dd19bad9446855743ad8d42edf2 (diff)
downloadpublic-inbox-e2c72e2671d395cbc3fff9cad5c8da4e08367e26.tar.gz
We could also start displaying Xref in XOVER as rtin seems to
prefer it.  Anyways this is nearly 100 times faster now and
requires no DB changes.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/NNTP.pm33
1 files changed, 32 insertions, 1 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm
index 79f2c2f8..d5eb4971 100644
--- a/lib/PublicInbox/NNTP.pm
+++ b/lib/PublicInbox/NNTP.pm
@@ -371,7 +371,7 @@ found:
         if ($set_headers) {
                 $s->header_set('Newsgroups', $ng->{name});
                 $s->header_set('Lines', $s->body =~ tr!\n!\n!);
-                $s->header_set('Xref', "$ng->{domain} $ng->{name}:$n");
+                $s->header_set('Xref', xref($ng, $n));
 
                 # must be last
                 if ($set_headers == 2) {
@@ -562,6 +562,35 @@ sub xhdr_message_id ($$) { # optimize XHDR Message-ID [range] for slrnpull.
         }
 }
 
+sub xref ($$) {
+        my ($ng, $n) = @_;
+        "$ng->{domain} $ng->{name}:$n"
+}
+
+sub xhdr_xref ($$) { # optimize XHDR Xref [range] for rtin
+        my ($self, $range) = @_;
+
+        my $ng = $self->{ng};
+        my $mm = $ng->mm;
+        if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID
+                my $n = $mm->num_for($range);
+                more($self, '221 Header follows');
+                more($self, "<$range> ".xref($ng, $n)) 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 ".xref($ng, $$i)) if defined $mid;
+                });
+        }
+}
+
 sub header_obj_for {
         my ($srch, $mid) = @_;
         eval {
@@ -612,6 +641,8 @@ sub cmd_xhdr ($$;$) {
         my $sub = lc $header;
         if ($sub eq 'message-id') {
                 xhdr_message_id($self, $range);
+        } elsif ($sub eq 'xref') {
+                xhdr_xref($self, $range);
         } elsif ($sub =~ /\A(subject|references|date)\z/ && $ng->search) {
                 xhdr_searchmsg($self, $sub, $range);
         } else {