about summary refs log tree commit homepage
path: root/lib/PublicInbox/WwwText.pm
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-07-05 23:27:20 +0000
committerEric Wong <e@yhbt.net>2020-07-06 20:01:15 +0000
commit20f0d11445fc1207bc3a91e3f47abb4ba1b57256 (patch)
tree213c1850bc35a6a4ea366a7bacbd50052ac59ae7 /lib/PublicInbox/WwwText.pm
parentcde937e3bf4c0ad343479f9711a201494e4f36ee (diff)
downloadpublic-inbox-20f0d11445fc1207bc3a91e3f47abb4ba1b57256.tar.gz
Most of our plain-text responses are config files
big enough to warrant compression.
Diffstat (limited to 'lib/PublicInbox/WwwText.pm')
-rw-r--r--lib/PublicInbox/WwwText.pm17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/PublicInbox/WwwText.pm b/lib/PublicInbox/WwwText.pm
index b23a415e..508005fb 100644
--- a/lib/PublicInbox/WwwText.pm
+++ b/lib/PublicInbox/WwwText.pm
@@ -10,6 +10,8 @@ use PublicInbox::Linkify;
 use PublicInbox::WwwStream;
 use PublicInbox::Hval qw(ascii_html);
 use URI::Escape qw(uri_escape_utf8);
+use PublicInbox::GzipFilter qw(gzf_maybe);
+use Compress::Raw::Zlib qw(Z_FINISH Z_OK);
 our $QP_URL = 'https://xapian.org/docs/queryparser.html';
 our $WIKI_URL = 'https://en.wikipedia.org/wiki';
 my $hl = eval {
@@ -35,14 +37,23 @@ sub get_text {
                 $code = 404;
                 $txt = "404 Not Found ($key)\n";
         }
+        my $env = $ctx->{env};
         if ($raw) {
-                $hdr->[3] = bytes::length($txt);
-                return [ $code, $hdr, [ $txt ] ]
+                my $body;
+                if (my $gzf = $code == 200 ? gzf_maybe($hdr, $env) : undef) {
+                        my $zbuf = $gzf->translate($txt);
+                        undef $txt;
+                        $body = [ $zbuf .= $gzf->translate(undef) ];
+                } else {
+                        $body = [ $txt ];
+                }
+                $hdr->[3] = bytes::length($body->[0]);
+                return [ $code, $hdr, $body ]
         }
 
         # enforce trailing slash for "wget -r" compatibility
         if (!$have_tslash && $code == 200) {
-                my $url = $ctx->{-inbox}->base_url($ctx->{env});
+                my $url = $ctx->{-inbox}->base_url($env);
                 $url .= "_/text/$key/";
 
                 return [ 302, [ 'Content-Type', 'text/plain',