]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/GzipFilter.pm
www: update internal docs
[public-inbox.git] / lib / PublicInbox / GzipFilter.pm
index 99d43cf04cb93da78aedd362b9907b566c1041cf..d72ad3c88da55779e9f2c953a63f61040a90c123 100644 (file)
@@ -1,11 +1,20 @@
 # Copyright (C) 2020 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
-
-# Qspawn filter
+#
+# In public-inbox <=1.5.0, public-inbox-httpd favored "getline"
+# response bodies to take a "pull"-based approach to feeding
+# slow clients (as opposed to a more common "push" model).
+#
+# In newer versions, public-inbox-httpd supports a backpressure-aware
+# pull/push model which also accounts for slow git blob storage.
+# {async_next} callbacks only run when the DS {wbuf} is drained
+# {async_eml} callbacks only run when a blob arrives from git.
+#
+# We continue to support getline+close for generic PSGI servers.
 package PublicInbox::GzipFilter;
 use strict;
 use parent qw(Exporter);
-use Compress::Raw::Zlib qw(Z_FINISH Z_OK);
+use Compress::Raw::Zlib qw(Z_OK);
 use PublicInbox::CompressNoop;
 use PublicInbox::Eml;
 use PublicInbox::GitAsyncCat;
@@ -14,12 +23,12 @@ our @EXPORT_OK = qw(gzf_maybe);
 my %OPT = (-WindowBits => 15 + 16, -AppendOutput => 1);
 my @GZIP_HDRS = qw(Vary Accept-Encoding Content-Encoding gzip);
 
-sub new { bless {}, shift }
+sub new { bless {}, shift } # qspawn filter
 
 # for Qspawn if using $env->{'pi-httpd.async'}
 sub attach {
        my ($self, $http_out) = @_;
-       $self->{http_out} = $http_out;
+       $self->{http_out} = $http_out; # PublicInbox::HTTP::{Chunked,Identity}
        $self
 }
 
@@ -95,7 +104,7 @@ sub translate ($$) {
                $self->{zbuf} = $zbuf;
                '';
        } else { # undef == EOF
-               my $err = $gz->flush($zbuf, Z_FINISH);
+               my $err = $gz->flush($zbuf);
                die "gzip->flush: $err" if $err != Z_OK;
                $zbuf;
        }
@@ -125,7 +134,7 @@ sub zflush ($;$) {
                $err = $gz->deflate($_[1], $zbuf);
                die "gzip->deflate: $err" if $err != Z_OK;
        }
-       $err = $gz->flush($zbuf, Z_FINISH);
+       $err = $gz->flush($zbuf);
        die "gzip->flush: $err" if $err != Z_OK;
        $zbuf;
 }