about summary refs log tree commit homepage
path: root/lib/PublicInbox/GzipFilter.pm
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-07-05 23:27:18 +0000
committerEric Wong <e@yhbt.net>2020-07-06 20:01:15 +0000
commitb8b03f9c896432816019828b27708fa3b6903d83 (patch)
treed4fcf16173a04e9e35ac4916d9bcedc059f483cb /lib/PublicInbox/GzipFilter.pm
parentcfd960f6a2c1cff9a9537b0758fcde1d3203b17f (diff)
downloadpublic-inbox-b8b03f9c896432816019828b27708fa3b6903d83.tar.gz
Plack::Middleware::Deflater forces us to use a memory-intensive
closure.  Instead, work towards building compressed strings in
memory to reduce the overhead of buffering large HTML output.
Diffstat (limited to 'lib/PublicInbox/GzipFilter.pm')
-rw-r--r--lib/PublicInbox/GzipFilter.pm13
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/PublicInbox/GzipFilter.pm b/lib/PublicInbox/GzipFilter.pm
index a7355a8d..115660cb 100644
--- a/lib/PublicInbox/GzipFilter.pm
+++ b/lib/PublicInbox/GzipFilter.pm
@@ -4,7 +4,9 @@
 # Qspawn filter
 package PublicInbox::GzipFilter;
 use strict;
+use parent qw(Exporter);
 use Compress::Raw::Zlib qw(Z_FINISH Z_OK);
+our @EXPORT_OK = qw(gzip_maybe);
 my %OPT = (-WindowBits => 15 + 16, -AppendOutput => 1);
 
 sub new { bless {}, shift }
@@ -16,6 +18,17 @@ sub attach {
         $self
 }
 
+sub gzip_maybe ($) {
+        my ($env) = @_;
+        return if (($env->{HTTP_ACCEPT_ENCODING}) // '') !~ /\bgzip\b/;
+
+        # in case Plack::Middleware::Deflater is loaded:
+        $env->{'plack.skip-deflater'} = 1;
+
+        my ($gz, $err) = Compress::Raw::Zlib::Deflate->new(%OPT);
+        $err == Z_OK ? $gz : undef;
+}
+
 # for GetlineBody (via Qspawn) when NOT using $env->{'pi-httpd.async'}
 sub translate ($$) {
         my $self = $_[0];