X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FGzipFilter.pm;h=e37f1f76bd4a886431224ed38aa8a3f838cc50b1;hb=4eee5af6011cc8cdefb66c9729952c7eff5c0b0b;hp=624c2ed3418ce1353264eb2f6e6b63df5a3b0a89;hpb=a29d72521f20576916e4c407263566cfa972416b;p=public-inbox.git diff --git a/lib/PublicInbox/GzipFilter.pm b/lib/PublicInbox/GzipFilter.pm index 624c2ed3..e37f1f76 100644 --- a/lib/PublicInbox/GzipFilter.pm +++ b/lib/PublicInbox/GzipFilter.pm @@ -46,18 +46,20 @@ sub gz_or_noop { sub gzf_maybe ($$) { bless { gz => gz_or_noop(@_) }, __PACKAGE__ } sub psgi_response { + # $code may be an HTTP response code (e.g. 200) or a CODE ref (mbox_hdr) my ($self, $code, $res_hdr) = @_; - my $env = $self->{env}; - $self->{gz} //= gz_or_noop($res_hdr, $env); - if ($env->{'pi-httpd.async'}) { - my $http = $env->{'psgix.io'}; # PublicInbox::HTTP + if ($self->{env}->{'pi-httpd.async'}) { + my $http = $self->{env}->{'psgix.io'}; # PublicInbox::HTTP $http->{forward} = $self; sub { my ($wcb) = @_; # -httpd provided write callback - $self->{http_out} = $wcb->([$code, $res_hdr]); + $self->{wcb_args} = [ $code, $res_hdr, $wcb ]; $self->can('async_next')->($http); # start stepping }; } else { # generic PSGI code path + ref($code) eq 'CODE' and + ($code, $res_hdr) = @{$code->($self)}; + $self->{gz} //= gz_or_noop($res_hdr, $self->{env}); [ $code, $res_hdr, $self ]; } } @@ -114,15 +116,28 @@ sub translate ($$) { } } +sub http_out ($) { + my ($self) = @_; + $self->{http_out} // do { + my $args = delete $self->{wcb_args} // return undef; + my $wcb = pop @$args; # from PublicInbox:HTTP async + # $args->[0] may be \&mbox_hdr or similar + $args = $args->[0]->($self) if ref($args->[0]) eq 'CODE'; + $self->{gz} //= gz_or_noop($args->[1], $self->{env}); + $self->{http_out} = $wcb->($args); # $wcb->([$code, $hdr_ary]) + }; +} + sub write { # my $ret = bytes::length($_[1]); # XXX does anybody care? - $_[0]->{http_out}->write(translate($_[0], $_[1])); + http_out($_[0])->write(translate($_[0], $_[1])); } # similar to ->translate; use this when we're sure we know we have # more data to buffer after this sub zmore { my $self = $_[0]; # $_[1] => input + http_out($self); my $err = $self->{gz}->deflate($_[1], $self->{zbuf}); die "gzip->deflate: $err" if $err != Z_OK; undef; @@ -145,17 +160,15 @@ sub zflush ($;$) { sub close { my ($self) = @_; - if (my $http_out = delete $self->{http_out}) { - $http_out->write(zflush($self)); - $http_out->close; - } + my $http_out = http_out($self) // return; + $http_out->write(zflush($self)); + delete($self->{http_out})->close; } sub bail { my $self = shift; if (my $env = $self->{env}) { - eval { $env->{'psgi.errors'}->print(@_, "\n") }; - warn("E: error printing to psgi.errors: $@", @_) if $@; + warn @_, "\n"; my $http = $env->{'psgix.io'} or return; # client abort eval { $http->close }; # should hit our close warn "E: error in http->close: $@" if $@;