From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id E68BB1F9F3; Mon, 25 Oct 2021 02:45:53 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Cc: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Subject: [PATCH 1/2] gzip_filter: delay async wcb call Date: Mon, 25 Oct 2021 02:45:52 +0000 Message-Id: <20211025024553.14875-2-e@80x24.org> In-Reply-To: <20211025024553.14875-1-e@80x24.org> References: <20211025024553.14875-1-e@80x24.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List-Id: This will let us modify the response header later to set a proper charset for Content-Type when displaying raw messages. Cc: Thomas Weißschuh --- lib/PublicInbox/GzipFilter.pm | 19 +++++++++++++------ lib/PublicInbox/Mbox.pm | 2 +- lib/PublicInbox/WwwAtomStream.pm | 4 ++-- lib/PublicInbox/WwwStream.pm | 5 ++--- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/PublicInbox/GzipFilter.pm b/lib/PublicInbox/GzipFilter.pm index c62161710725..c4858a971495 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 @@ -114,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 @@ -145,10 +153,9 @@ 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 { diff --git a/lib/PublicInbox/Mbox.pm b/lib/PublicInbox/Mbox.pm index dede4825ff13..4f84eea6745d 100644 --- a/lib/PublicInbox/Mbox.pm +++ b/lib/PublicInbox/Mbox.pm @@ -47,7 +47,7 @@ sub async_eml { # for async_blob_cb $ctx->{smsg} = $ctx->{ibx}->over->next_by_mid(@{$ctx->{next_arg}}); $ctx->zmore(msg_hdr($ctx, $eml)); - $ctx->{http_out}->write($ctx->translate(msg_body($eml))); + $ctx->write(msg_body($eml)); } sub res_hdr ($$) { diff --git a/lib/PublicInbox/WwwAtomStream.pm b/lib/PublicInbox/WwwAtomStream.pm index 5d32294eec15..82895db6373e 100644 --- a/lib/PublicInbox/WwwAtomStream.pm +++ b/lib/PublicInbox/WwwAtomStream.pm @@ -28,7 +28,7 @@ sub async_next ($) { if (my $smsg = $ctx->{smsg} = $ctx->{cb}->($ctx)) { $ctx->smsg_blob($smsg); } else { - $ctx->{http_out}->write($ctx->translate('')); + $ctx->write(''); $ctx->close; } }; @@ -38,7 +38,7 @@ sub async_next ($) { sub async_eml { # for async_blob_cb my ($ctx, $eml) = @_; my $smsg = delete $ctx->{smsg}; - $ctx->{http_out}->write($ctx->translate(feed_entry($ctx, $smsg, $eml))) + $ctx->write(feed_entry($ctx, $smsg, $eml)); } sub response { diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm index 5be5ed0cad59..6d7c447fe6a2 100644 --- a/lib/PublicInbox/WwwStream.pm +++ b/lib/PublicInbox/WwwStream.pm @@ -32,7 +32,7 @@ sub init { sub async_eml { # for async_blob_cb my ($ctx, $eml) = @_; - $ctx->{http_out}->write($ctx->translate($ctx->{cb}->($ctx, $eml))); + $ctx->write($ctx->{cb}->($ctx, $eml)); } sub html_top ($) { @@ -187,8 +187,7 @@ sub async_next ($) { if (my $smsg = $ctx->{smsg} = $ctx->{cb}->($ctx)) { $ctx->smsg_blob($smsg); } else { - $ctx->{http_out}->write( - $ctx->translate(_html_end($ctx))); + $ctx->write(_html_end($ctx)); $ctx->close; # GzipFilter->close } };