use strict;
use parent qw(Exporter);
use Compress::Raw::Zlib qw(Z_FINISH Z_OK);
-our @EXPORT_OK = qw(gzip_maybe gzf_maybe);
+our @EXPORT_OK = qw(gzf_maybe);
my %OPT = (-WindowBits => 15 + 16, -AppendOutput => 1);
my @GZIP_HDRS = qw(Vary Accept-Encoding Content-Encoding gzip);
$self
}
-sub gzip_maybe ($$) {
+# returns `0' and not `undef' on failure (see Www*Stream)
+sub gzf_maybe ($$) {
my ($res_hdr, $env) = @_;
- return if (($env->{HTTP_ACCEPT_ENCODING}) // '') !~ /\bgzip\b/;
-
+ return 0 if (($env->{HTTP_ACCEPT_ENCODING}) // '') !~ /\bgzip\b/;
my ($gz, $err) = Compress::Raw::Zlib::Deflate->new(%OPT);
- return if $err != Z_OK;
+ return 0 if $err != Z_OK;
# in case Plack::Middleware::Deflater is loaded:
$env->{'plack.skip-deflater'} = 1;
-
push @$res_hdr, @GZIP_HDRS;
- $gz;
+ bless { gz => $gz }, __PACKAGE__;
}
-sub gzf_maybe ($$) {
- my ($res_hdr, $env) = @_;
- my $gz = gzip_maybe($res_hdr, $env) or return 0;
- bless { gz => $gz }, __PACKAGE__;
+sub gzip_or_die () {
+ my ($gz, $err) = Compress::Raw::Zlib::Deflate->new(%OPT);
+ $err == Z_OK or die "Deflate->new failed: $err";
+ $gz;
}
# for GetlineBody (via Qspawn) when NOT using $env->{'pi-httpd.async'}
# allocate the zlib context lazily here, instead of in ->new.
# Deflate contexts are memory-intensive and this object may
# be sitting in the Qspawn limiter queue for a while.
- my $gz = $self->{gz} //= do {
- my ($g, $err) = Compress::Raw::Zlib::Deflate->new(%OPT);
- $err == Z_OK or die "Deflate->new failed: $err";
- $g;
- };
+ my $gz = $self->{gz} //= gzip_or_die();
my $zbuf = delete($self->{zbuf});
if (defined $_[1]) { # my $buf = $_[1];
my $err = $gz->deflate($_[1], $zbuf);