]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/NNTP.pm
www: use WwwStream for dumping thread and search views
[public-inbox.git] / lib / PublicInbox / NNTP.pm
index e4e3de4adfd3e17dc12bdacb5713c7d33158a527..4b116a7d5b786af92daa95c2e4843aecfd46566f 100644 (file)
@@ -10,7 +10,6 @@ use fields qw(nntpd article rbuf ng long_res);
 use PublicInbox::Search;
 use PublicInbox::Msgmap;
 use PublicInbox::Git;
-use PublicInbox::MID qw(mid2path);
 require PublicInbox::EvCleanup;
 use Email::Simple;
 use POSIX qw(strftime);
@@ -481,10 +480,9 @@ find_mid:
                defined $mid or return $err;
        }
 found:
-       my $o = 'HEAD:' . mid2path($mid);
        my $bytes;
-       my $s = eval { Email::Simple->new($ng->git->cat_file($o, \$bytes)) };
-       return $err unless $s;
+       my $s = eval { $ng->msg_by_mid($mid, \$bytes) } or return $err;
+       $s = Email::Simple->new($s);
        my $lines;
        if ($set_headers) {
                set_nntp_headers($s->header_obj, $ng, $n, $mid);
@@ -512,6 +510,12 @@ sub set_art {
        $self->{article} = $art if defined $art && $art =~ /\A\d+\z/;
 }
 
+sub _header ($) {
+       my $hdr = $_[0]->header_obj->as_string;
+       utf8::encode($hdr);
+       $hdr
+}
+
 sub cmd_article ($;$) {
        my ($self, $art) = @_;
        my $r = art_lookup($self, $art, 1);
@@ -519,7 +523,7 @@ sub cmd_article ($;$) {
        my ($n, $mid, $s) = @$r;
        set_art($self, $art);
        more($self, "220 $n <$mid> article retrieved - head and body follow");
-       do_more($self, $s->header_obj->as_string);
+       do_more($self, _header($s));
        do_more($self, "\r\n");
        simple_body_write($self, $s);
 }
@@ -531,7 +535,7 @@ sub cmd_head ($;$) {
        my ($n, $mid, $s) = @$r;
        set_art($self, $art);
        more($self, "221 $n <$mid> article retrieved - head follows");
-       do_more($self, $s->header_obj->as_string);
+       do_more($self, _header($s));
        '.'
 }
 
@@ -707,8 +711,7 @@ sub hdr_xref ($$$) { # optimize XHDR Xref [range] for rtin
 
 sub search_header_for {
        my ($srch, $mid, $field) = @_;
-       my $smsg = $srch->lookup_message($mid) or return;
-       $smsg = PublicInbox::SearchMsg->load_doc($smsg->{doc});
+       my $smsg = $srch->lookup_mail($mid) or return;
        $smsg->$field;
 }
 
@@ -738,6 +741,7 @@ sub hdr_searchmsg ($$$$) {
                        foreach my $s (@$msgs) {
                                $tmp .= $s->num . ' ' . $s->$field . "\r\n";
                        }
+                       utf8::encode($tmp);
                        do_more($self, $tmp);
                        # -1 to adjust for implicit increment in long_response
                        $$i = $nr ? $$i + $nr - 1 : long_response_limit;
@@ -826,7 +830,7 @@ sub over_line ($$) {
        my ($num, $smsg) = @_;
        # n.b. field access and procedural calls can be
        # 10%-15% faster than OO method calls:
-       join("\t", $num,
+       my $s = join("\t", $num,
                $smsg->{subject},
                $smsg->{from},
                PublicInbox::SearchMsg::date($smsg),
@@ -834,16 +838,17 @@ sub over_line ($$) {
                $smsg->{references},
                PublicInbox::SearchMsg::bytes($smsg),
                PublicInbox::SearchMsg::lines($smsg));
+       utf8::encode($s);
+       $s
 }
 
 sub cmd_over ($;$) {
        my ($self, $range) = @_;
        if ($range && $range =~ /\A<(.+)>\z/) {
                my ($ng, $n) = mid_lookup($self, $1);
-               my $smsg = $ng->search->lookup_message($range) or
+               my $smsg = $ng->search->lookup_mail($range) or
                        return '430 No article with that message-id';
                more($self, '224 Overview information follows (multi-line)');
-               $smsg = PublicInbox::SearchMsg->load_doc($smsg->{doc});
 
                # Only set article number column if it's the current group
                my $self_ng = $self->{ng};
@@ -896,7 +901,6 @@ sub cmd_xpath ($$) {
 
 sub res ($$) {
        my ($self, $line) = @_;
-       utf8::encode($line);
        do_write($self, $line . "\r\n");
 }
 
@@ -931,7 +935,6 @@ use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0;
 
 sub do_more ($$) {
        my ($self, $data) = @_;
-       utf8::encode($data);
        if (MSG_MORE && !$self->{write_buf_size}) {
                my $n = send($self->{sock}, $data, MSG_MORE);
                if (defined $n) {