about summary refs log tree commit homepage
path: root/lib/PublicInbox/NNTPdeflate.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-07-07 06:57:43 +0000
committerEric Wong <e@80x24.org>2019-07-07 06:57:43 +0000
commit71e8a392d465bf4de60f37ecb3dec5cea5c3a376 (patch)
treee5cff0497bd65b1aacf2f0bbd1c59b54e6434f99 /lib/PublicInbox/NNTPdeflate.pm
parenta3c054cbbf2a51be121b3237c5d223acc5c8a2f4 (diff)
downloadpublic-inbox-71e8a392d465bf4de60f37ecb3dec5cea5c3a376.tar.gz
Add some checks for errors at initialization, though there's not
much that can be done with ENOMEM-type errors aside from
dropping clients.

We can also get rid of the scary FIXME for MemLevel=8.  It was a
stupid error on my part in the original per-client deflate
stream implementation calling C::R::Z::{Inflate,Deflate} in
array context and getting the extra dualvar error code as a
string result, causing the {zin}/{zout} array refs to have
extra array elements.
Diffstat (limited to 'lib/PublicInbox/NNTPdeflate.pm')
-rw-r--r--lib/PublicInbox/NNTPdeflate.pm33
1 files changed, 21 insertions, 12 deletions
diff --git a/lib/PublicInbox/NNTPdeflate.pm b/lib/PublicInbox/NNTPdeflate.pm
index 78da2a58..10e2337c 100644
--- a/lib/PublicInbox/NNTPdeflate.pm
+++ b/lib/PublicInbox/NNTPdeflate.pm
@@ -30,24 +30,33 @@ my %IN_OPT = (
 
 # global deflate context and buffer
 my $zbuf = \(my $buf = '');
-my $zout = Compress::Raw::Zlib::Deflate->new(
-        # nnrpd (INN) and Compress::Raw::Zlib favor MemLevel=9,
-        # but the zlib C library and git use MemLevel=8 as the default.
-        # FIXME: sometimes clients fail with 8, so we use 9
-        # -MemLevel => 9,
-
-        # needs more testing, nothing obviously different in terms of memory
-        -Bufsize => 65536,
+my $zout;
+{
+        my $err;
+        ($zout, $err) = Compress::Raw::Zlib::Deflate->new(
+                # nnrpd (INN) and Compress::Raw::Zlib favor MemLevel=9,
+                # the zlib C library and git use MemLevel=8 as the default
+                # -MemLevel => 9,
+                -Bufsize => 65536, # same as nnrpd
+                -WindowBits => -15, # RFC 1951
+                -AppendOutput => 1,
+        );
+        $err == Z_OK or die "Failed to initialize zlib deflate stream: $err";
+}
 
-        -WindowBits => -15, # RFC 1951
-        -AppendOutput => 1,
-);
 
 sub enable {
         my ($class, $self) = @_;
+        my ($in, $err) = Compress::Raw::Zlib::Inflate->new(%IN_OPT);
+        if ($err != Z_OK) {
+                $self->err("Inflate->new failed: $err");
+                $self->res('403 Unable to activate compression');
+                return;
+        }
         unlock_hash(%$self);
+        $self->res('206 Compression active');
         bless $self, $class;
-        $self->{zin} = [ Compress::Raw::Zlib::Inflate->new(%IN_OPT), '' ];
+        $self->{zin} = [ $in, '' ];
 }
 
 # overrides PublicInbox::NNTP::compressed