+ my ($env, $git, $path) = @_;
+ my %env = %ENV;
+ # GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL
+ # may be set in the server-process and are passed as-is
+ foreach my $name (qw(QUERY_STRING
+ REMOTE_USER REMOTE_ADDR
+ HTTP_CONTENT_ENCODING
+ CONTENT_TYPE
+ SERVER_PROTOCOL
+ REQUEST_METHOD)) {
+ my $val = $env->{$name};
+ $env{$name} = $val if defined $val;
+ }
+ my $limiter = $git->{-httpbackend_limiter} || $default_limiter;
+ $env{GIT_HTTP_EXPORT_ALL} = '1';
+ $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, sub { # parse_hdr
+ my ($r, $bref) = @_;
+ my $res = parse_cgi_headers($r, $bref) or return; # incomplete
+ $res->[0] == 403 ? serve_dumb($env, $git, $path) : $res;
+ });
+}
+
+sub input_prepare {
+ my ($env) = @_;