X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FGzipFilter.pm;h=d72ad3c88da55779e9f2c953a63f61040a90c123;hb=5afb24f06627641e3fed608e807b5ab628cda348;hp=99d43cf04cb93da78aedd362b9907b566c1041cf;hpb=20607bd628f4f8ea985661a8ce123ea482058144;p=public-inbox.git
diff --git a/lib/PublicInbox/GzipFilter.pm b/lib/PublicInbox/GzipFilter.pm
index 99d43cf0..d72ad3c8 100644
--- a/lib/PublicInbox/GzipFilter.pm
+++ b/lib/PublicInbox/GzipFilter.pm
@@ -1,11 +1,20 @@
# Copyright (C) 2020 all contributors
# License: AGPL-3.0+
-
-# 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;
}