about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-02-24 07:33:26 +0000
committerEric Wong <e@yhbt.net>2020-02-24 18:30:11 +0000
commitaf8434f5f729a541cf8c50dfcb7d96a413facd2b (patch)
tree9fe98c3fce6e91b67496a1e7c2aec1f90e2420ca
parentdf0fee8ed3892fb1258d87add809f40bebd3dce2 (diff)
downloadpublic-inbox-af8434f5f729a541cf8c50dfcb7d96a413facd2b.tar.gz
hval: ascii_html: drop CRLF => LF conversion
Instead, we add CRLF conversion to the only remaining place
which needs it, ViewVCS.  This save many redundant ops in in
many places.

The only other place where this mattered was in
View::add_text_body, but we already started doing CRLF
conversions when we added diff parsing and link generation for
ViewVCS.  Otherwise, all other places we used this was for
header viewing and Email::MIME doesn't preserve CRLF in headers.
-rw-r--r--lib/PublicInbox/Hval.pm1
-rw-r--r--lib/PublicInbox/ViewVCS.pm2
-rw-r--r--t/plack.t27
3 files changed, 28 insertions, 2 deletions
diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm
index 5f7ab513..79005d21 100644
--- a/lib/PublicInbox/Hval.pm
+++ b/lib/PublicInbox/Hval.pm
@@ -55,7 +55,6 @@ sub src_escape ($) {
 
 sub ascii_html {
         my ($s) = @_;
-        $s =~ s/\r\n/\n/sg; # fixup bad line endings
         $s =~ s/([<>&'"\x7f\x00-\x1f])/$xhtml_map{$1}/sge;
         $enc_ascii->encode($s, Encode::HTMLCREF);
 }
diff --git a/lib/PublicInbox/ViewVCS.pm b/lib/PublicInbox/ViewVCS.pm
index 1379bd58..2f8e1c4f 100644
--- a/lib/PublicInbox/ViewVCS.pm
+++ b/lib/PublicInbox/ViewVCS.pm
@@ -164,7 +164,7 @@ sub solve_result {
 
         # TODO: detect + convert to ensure validity
         utf8::decode($$blob);
-        my $nl = ($$blob =~ tr/\n/\n/);
+        my $nl = ($$blob =~ s/\r?\n/\n/sg);
         my $pad = length($nl);
 
         $l->linkify_1($$blob);
diff --git a/t/plack.t b/t/plack.t
index fe767aed..ea318792 100644
--- a/t/plack.t
+++ b/t/plack.t
@@ -109,6 +109,23 @@ EOF
         like($mime->body_raw, qr/hi =3D bye=/, 'our test used QP correctly');
         $im->add($mime);
 
+        my $crlf = <<EOF;
+From: Me
+  <me\@example.com>
+To: $addr
+Message-Id: <crlf\@example.com>
+Subject: carriage
+  return
+  in
+  long
+  subject
+Date: Fri, 02 Oct 1993 00:00:00 +0000
+
+:(
+EOF
+        $crlf =~ s/\n/\r\n/sg;
+        $im->add(Email::MIME->new($crlf));
+
         $im->done;
 }
 
@@ -120,6 +137,16 @@ test_psgi($app, sub {
         }
 });
 
+test_psgi($app, sub {
+        my ($cb) = @_;
+        my $res = $cb->(GET('http://example.com/test/crlf@example.com/'));
+        is($res->code, 200, 'retrieved CRLF as HTML');
+        unlike($res->content, qr/\r/, 'no CR in HTML');
+        $res = $cb->(GET('http://example.com/test/crlf@example.com/raw'));
+        is($res->code, 200, 'retrieved CRLF raw');
+        like($res->content, qr/\r/, 'CR preserved in raw message');
+});
+
 # redirect with newsgroup
 test_psgi($app, sub {
         my ($cb) = @_;