X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FGzipFilter.pm;h=c4858a971495449ce7e4fd35b3a0c123153ed07b;hb=ead71b8c387f0748338a4add37eeb437a14b02d8;hp=c50c26c5c21cfe418b66f0430d2c375b2a402679;hpb=205599c0814e1031760e54cce9d8880e747cbb08;p=public-inbox.git diff --git a/lib/PublicInbox/GzipFilter.pm b/lib/PublicInbox/GzipFilter.pm index c50c26c5..c4858a97 100644 --- a/lib/PublicInbox/GzipFilter.pm +++ b/lib/PublicInbox/GzipFilter.pm @@ -54,7 +54,7 @@ sub psgi_response { $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 @@ -84,6 +84,12 @@ sub gzip_or_die () { $gz; } +sub gone { # what: search/over/mm + my ($ctx, $what) = @_; + warn "W: `$ctx->{ibx}->{name}' $what went away unexpectedly\n"; + undef; +} + # for GetlineBody (via Qspawn) when NOT using $env->{'pi-httpd.async'} # Also used for ->getline callbacks sub translate ($$) { @@ -108,9 +114,17 @@ sub translate ($$) { } } +sub http_out ($) { + my ($self) = @_; + $self->{http_out} //= do { + my $args = delete $self->{wcb_args} // return undef; + pop(@$args)->($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 @@ -139,17 +153,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 $@;