From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 87D341F51A for ; Mon, 23 Oct 2023 08:48:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1698050918; bh=5Gi9ZJXrc5DaIZhP8f8mvlkmf6RnvY4a/sJVPlxLEp0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=ZtPO08bKaQhbSUl17Sh1I7exfTlCXZWkP1Pp20GRA4jrGTVMMp00VmR/Sqm8WYAZ1 tbp9x2rm2wIUB1ew8KanGqzJ94qCrRSpgmvCzqPlPwkrTFUIeihguTLlBfyhaC4ard QkLwgsZHnHiBfMDtoHbZRzLgAb1eDtPhC6t4WauY= From: Eric Wong To: spew@80x24.org Subject: [PATCH 05/18] qspawn: psgi_return allows list for callback args Date: Mon, 23 Oct 2023 08:48:24 +0000 Message-ID: <20231023084837.2804687-5-e@80x24.org> In-Reply-To: <20231023084837.2804687-1-e@80x24.org> References: <20231023084837.2804687-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This slightly simplifies our GitHTTPBackend wrapper. We can also use shorter variable names to avoid wrapping some lines. --- lib/PublicInbox/GitHTTPBackend.pm | 6 +++--- lib/PublicInbox/Qspawn.pm | 19 ++++++++----------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm index d69f5f8b..edbc0157 100644 --- a/lib/PublicInbox/GitHTTPBackend.pm +++ b/lib/PublicInbox/GitHTTPBackend.pm @@ -80,9 +80,9 @@ sub serve_dumb { } sub git_parse_hdr { # {parse_hdr} for Qspawn - my ($r, $bref, $dumb_args) = @_; + my ($r, $bref, @dumb_args) = @_; my $res = parse_cgi_headers($r, $bref) or return; # incomplete - $res->[0] == 403 ? serve_dumb(@$dumb_args) : $res; + $res->[0] == 403 ? serve_dumb(@dumb_args) : $res; } # returns undef if 403 so it falls back to dumb HTTP @@ -106,7 +106,7 @@ sub serve_smart { $env{PATH_TRANSLATED} = "$git->{git_dir}/$path"; my $rdr = input_prepare($env) or return r(500); my $qsp = PublicInbox::Qspawn->new([qw(git http-backend)], \%env, $rdr); - $qsp->psgi_return($env, $limiter, \&git_parse_hdr, [$env, $git, $path]); + $qsp->psgi_return($env, $limiter, \&git_parse_hdr, $env, $git, $path); } sub input_prepare { diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm index 59d5ed40..0f900691 100644 --- a/lib/PublicInbox/Qspawn.pm +++ b/lib/PublicInbox/Qspawn.pm @@ -174,16 +174,13 @@ sub rd_hdr ($) { my ($self) = @_; # typically used for reading CGI headers # We also need to check EINTR for generic PSGI servers. - my $ret; - my $total_rd = 0; - my $hdr_buf = $self->{hdr_buf}; - my ($ph_cb, $ph_arg) = @{$self->{parse_hdr}}; + my ($ret, $total_rd); + my ($bref, $ph_cb, @ph_arg) = ($self->{hdr_buf}, @{$self->{parse_hdr}}); until (defined($ret)) { - my $r = sysread($self->{rpipe}, $$hdr_buf, 4096, - length($$hdr_buf)); + my $r = sysread($self->{rpipe}, $$bref, 4096, length($$bref)); if (defined($r)) { $total_rd += $r; - eval { $ret = $ph_cb->($total_rd, $hdr_buf, $ph_arg) }; + eval { $ret = $ph_cb->($total_rd, $bref, @ph_arg) }; if ($@) { warn "parse_hdr: $@"; $ret = [ 500, [], [ "Internal error\n" ] ]; @@ -207,7 +204,7 @@ EOM sub psgi_return_init_cb { # this may be PublicInbox::HTTPD::Async {cb} my ($self) = @_; - my $r = rd_hdr($self) or return; + my $r = rd_hdr($self) or return; # incomplete my $env = $self->{psgi_env}; my $filter; @@ -277,7 +274,7 @@ sub psgi_return_start { # may run later, much later... # # $limiter - the Limiter object to use (uses the def_limiter if not given) # -# $parse_hdr - Initial read function; often for parsing CGI header output. +# @parse_hdr_arg - Initial read cb+args; often for parsing CGI header output. # It will be given the return value of sysread from the pipe # and a string ref of the current buffer. Returns an arrayref # for PSGI responses. 2-element arrays in PSGI mean the @@ -285,10 +282,10 @@ sub psgi_return_start { # may run later, much later... # psgix.io. 3-element arrays means the body is available # immediately (or streamed via ->getline (pull-based)). sub psgi_return { - my ($self, $env, $limiter, $parse_hdr, $hdr_arg) = @_; + my ($self, $env, $limiter, @parse_hdr_arg)= @_; $self->{psgi_env} = $env; $self->{hdr_buf} = \(my $hdr_buf = ''); - $self->{parse_hdr} = [ $parse_hdr, $hdr_arg ]; + $self->{parse_hdr} = \@parse_hdr_arg; $limiter ||= $def_limiter ||= PublicInbox::Limiter->new(32); # the caller already captured the PSGI write callback from