]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
qspawn: psgi_return allows list for callback args
authorEric Wong <e@80x24.org>
Wed, 25 Oct 2023 00:29:28 +0000 (00:29 +0000)
committerEric Wong <e@80x24.org>
Wed, 25 Oct 2023 07:28:33 +0000 (07:28 +0000)
This slightly simplifies our GitHTTPBackend wrapper.
We can also use shorter variable names to avoid wrapping some
lines.

lib/PublicInbox/GitHTTPBackend.pm
lib/PublicInbox/Qspawn.pm

index d69f5f8bb827bf3829890b2231a5d733dd06b8df..edbc0157c67020c6d6baad8d96fe0d1b40319665 100644 (file)
@@ -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 {
index 59d5ed40285d41cc8dca35c91b65fa14f3d1df92..0f90069180f196b22a01d91694d269a5aef0f438 100644 (file)
@@ -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