]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/NNTP.pm
nntp: do not double-encode UTF-8 body
[public-inbox.git] / lib / PublicInbox / NNTP.pm
index f3de4b1cd5722b603f5aa2f1d016ee8e7fb8572c..e86832107ca560db8f10dd834e801c4a5c5c42ed 100644 (file)
@@ -16,8 +16,6 @@ use Email::Simple;
 use POSIX qw(strftime);
 use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);
 use URI::Escape qw(uri_escape_utf8);
-use Encode qw(find_encoding);
-my $enc_utf8 = find_encoding('UTF-8');
 use constant {
        r501 => '501 command syntax error',
        r221 => '221 Header follows',
@@ -195,7 +193,7 @@ sub list_active_times ($;$) {
        foreach my $ng (@{$self->{nntpd}->{grouplist}}) {
                $ng->{newsgroup} =~ $wildmat or next;
                my $c = eval { $ng->mm->created_at } || time;
-               more($self, "$ng->{newsgroup} $c $ng->{address}");
+               more($self, "$ng->{newsgroup} $c $ng->{-primary_address}");
        }
 }
 
@@ -413,7 +411,8 @@ sub cmd_last ($) { article_adj($_[0], -1) }
 sub cmd_post ($) {
        my ($self) = @_;
        my $ng = $self->{ng};
-       $ng ? "440 mailto:$ng->{address} to post" : '440 posting not allowed'
+       $ng ? "440 mailto:$ng->{-primary_address} to post"
+               : '440 posting not allowed'
 }
 
 sub cmd_quit ($) {
@@ -438,8 +437,8 @@ sub set_nntp_headers {
        # clobber some
        $hdr->header_set('Newsgroups', $ng->{newsgroup});
        $hdr->header_set('Xref', xref($ng, $n));
-       header_append($hdr, 'List-Post', "<mailto:$ng->{address}>");
-       if (my $url = $ng->{url}) {
+       header_append($hdr, 'List-Post', "<mailto:$ng->{-primary_address}>");
+       if (my $url = $ng->base_url) {
                $mid = uri_escape_utf8($mid);
                header_append($hdr, 'Archived-At', "<$url$mid/>");
                header_append($hdr, 'List-Archive', "<$url>");
@@ -484,7 +483,7 @@ find_mid:
 found:
        my $o = 'HEAD:' . mid2path($mid);
        my $bytes;
-       my $s = eval { Email::Simple->new($ng->gcf->cat_file($o, \$bytes)) };
+       my $s = eval { Email::Simple->new($ng->git->cat_file($o, \$bytes)) };
        return $err unless $s;
        my $lines;
        if ($set_headers) {
@@ -513,6 +512,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);
@@ -520,7 +525,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);
 }
@@ -532,7 +537,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));
        '.'
 }
 
@@ -739,6 +744,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;
@@ -827,7 +833,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),
@@ -835,6 +841,8 @@ sub over_line ($$) {
                $smsg->{references},
                PublicInbox::SearchMsg::bytes($smsg),
                PublicInbox::SearchMsg::lines($smsg));
+       utf8::encode($s);
+       $s
 }
 
 sub cmd_over ($;$) {
@@ -897,7 +905,6 @@ sub cmd_xpath ($$) {
 
 sub res ($$) {
        my ($self, $line) = @_;
-       $line = $enc_utf8->encode($line);
        do_write($self, $line . "\r\n");
 }
 
@@ -932,7 +939,6 @@ use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0;
 
 sub do_more ($$) {
        my ($self, $data) = @_;
-       $data = $enc_utf8->encode($data);
        if (MSG_MORE && !$self->{write_buf_size}) {
                my $n = send($self->{sock}, $data, MSG_MORE);
                if (defined $n) {