{ 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}} };
# this may call async_pass when headers are done
$cb->(my $refcnt_guard = delete $self->{arg});
} elsif (my $sock = $self->{sock}) {
- my $http = $self->{http};
+ # $http may be undef if discarding body output from cgit on 404
+ my $http = $self->{http} or return $self->close;
# $self->{sock} is a read pipe for git-http-backend or cgit
# and 65536 is the default Linux pipe size
my $r = sysread($sock, my $buf, 65536);