my $qsp = PublicInbox::Qspawn->new([qw(git http-backend)], \%env, $rdr);
        $qsp->psgi_return($env, $limiter, sub {
                my ($r, $bref) = @_;
-               $r = parse_cgi_headers($bref) or return; # incomplete headers
-               $r->[0] == 403 ? serve_dumb($env, $git, $path) : $r;
+               my $res = parse_cgi_headers($r, $bref) or return; # incomplete
+               $res->[0] == 403 ? serve_dumb($env, $git, $path) : $res;
        });
 }
 
 }
 
 sub parse_cgi_headers {
-       my ($bref) = @_;
-       $$bref =~ s/\A(.*?)\r\n\r\n//s or return;
+       my ($r, $bref) = @_;
+       return r(500) unless defined $r && $r >= 0;
+       $$bref =~ s/\A(.*?)\r?\n\r?\n//s or return $r == 0 ? r(500) : undef;
        my $h = $1;
        my $code = 200;
        my @h;
-       foreach my $l (split(/\r\n/, $h)) {
+       foreach my $l (split(/\r?\n/, $h)) {
                my ($k, $v) = split(/:\s*/, $l, 2);
                if ($k =~ /\AStatus\z/i) {
                        ($code) = ($v =~ /\b(\d+)\b/);