diff options
author | Eric Wong <e@yhbt.net> | 2020-07-05 23:27:24 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-07-06 20:01:15 +0000 |
commit | f26183401e3abfb64ad82537151f2718ac889074 (patch) | |
tree | ff5118417538eae8375c9bdc5023ceca1d1e647a /lib/PublicInbox/WwwStream.pm | |
parent | 967f6d1b1626392ee4340ea356a00651462377b3 (diff) | |
download | public-inbox-f26183401e3abfb64ad82537151f2718ac889074.tar.gz |
The new ->zmore and ->zflush APIs make it possible to replace existing verbose usages of Compress::Raw::Deflate and simplify buffering logic for streaming large gzipped data. One potentially user visible change is we now break the mbox.gz response on zlib failures, instead of silently continuing onto the next message. zlib only seems to fail on OOM, which should be rare; so it's ideal we drop the connection anyways.
Diffstat (limited to 'lib/PublicInbox/WwwStream.pm')
-rw-r--r-- | lib/PublicInbox/WwwStream.pm | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm index c964dbd4..8623440b 100644 --- a/lib/PublicInbox/WwwStream.pm +++ b/lib/PublicInbox/WwwStream.pm @@ -13,8 +13,7 @@ use base qw(Exporter); our @EXPORT_OK = qw(html_oneshot); use bytes (); # length use PublicInbox::Hval qw(ascii_html prurl); -use Compress::Raw::Zlib qw(Z_FINISH Z_OK); -use PublicInbox::GzipFilter qw(gzip_maybe gzf_maybe); +use PublicInbox::GzipFilter qw(gzf_maybe); our $TOR_URL = 'https://www.torproject.org/'; our $CODE_URL = 'https://public-inbox.org/public-inbox.git'; @@ -190,25 +189,17 @@ sub html_oneshot ($$;$) { base_url => base_url($ctx), }, __PACKAGE__; my @x; - my $h = [ 'Content-Type' => 'text/html; charset=UTF-8' ]; - if (my $gz = gzip_maybe($h, $ctx->{env})) { - my $err = $gz->deflate(_html_top($self), $x[0]); - die "gzip->deflate: $err" if $err != Z_OK; - if ($sref) { - $err = $gz->deflate($sref, $x[0]); - die "gzip->deflate: $err" if $err != Z_OK; - } - $err = $gz->deflate(_html_end($self), $x[0]); - die "gzip->deflate: $err" if $err != Z_OK; - $err = $gz->flush($x[0], Z_FINISH); - die "gzip->flush: $err" if $err != Z_OK; + my $h = [ 'Content-Type' => 'text/html; charset=UTF-8', + 'Content-Length' => undef ]; + if (my $gzf = gzf_maybe($h, $ctx->{env})) { + $gzf->zmore(_html_top($self)); + $gzf->zmore($$sref) if $sref; + $x[0] = $gzf->zflush(_html_end($self)); + $h->[3] = length($x[0]); } else { @x = (_html_top($self), $sref ? $$sref : (), _html_end($self)); + $h->[3] += bytes::length($_) for @x; } - - my $len = 0; - $len += bytes::length($_) for @x; - push @$h, 'Content-Length', $len; [ $code, $h, \@x ] } |