'objects/pack/pack-[a-f0-9]{40,64}\.(?:pack|idx)');
our $ANY = join('|', @binary, @text, 'git-upload-pack');
-my $BIN = join('|', @binary);
my $TEXT = join('|', @text);
sub serve {
{ 0 => $in };
}
-sub parse_cgi_headers {
+sub parse_cgi_headers { # {parse_hdr} for Qspawn
my ($r, $bref, $ctx) = @_;
return r(500) unless defined $r && $r >= 0;
$$bref =~ s/\A(.*?)\r?\n\r?\n//s or return $r == 0 ? r(500) : undef;
}
# fallback to WwwCoderepo if cgit 404s. Duplicating $ctx prevents
- # ->finalize from the current Qspawn from using qspawn.wcb
+ # ->finalize from the current Qspawn from using qspawn.wcb.
+ # This makes qspawn skip ->async_pass and causes
+ # PublicInbox::HTTPD::Async::event_step to close shortly after
if ($code == 404 && $ctx->{www} && !$ctx->{_coderepo_tried}++) {
- my %ctx = %$ctx;
- $ctx{env} = +{ %{$ctx->{env}} };
- delete $ctx->{env}->{'qspawn.wcb'};
+ my $wcb = delete $ctx->{env}->{'qspawn.wcb'};
$ctx->{env}->{'plack.skip-deflater'} = 1; # prevent 2x gzip
- my $res = $ctx->{www}->coderepo->srv(\%ctx);
- if (ref($res) eq 'CODE') {
- $res->(delete $ctx{env}->{'qspawn.wcb'});
- } else { # ref($res) eq 'ARRAY'
- $ctx->{env}->{'qspawn.wcb'} = $ctx{env}->{'qspawn.wcb'};
- }
- $res; # non ARRAY ref for ->psgi_return_init_cb
+ my $res = $ctx->{www}->coderepo->srv($ctx);
+ # for ->psgi_return_init_cb
+ $ctx->{env}->{'qspawn.wcb'} = $wcb;
+ $res; # CODE or ARRAY ref
} else {
[ $code, \@h ]
}