diff options
author | Eric Wong <e@80x24.org> | 2019-03-10 10:32:33 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-04-04 09:13:58 +0000 |
commit | e1a3462f01d9bedd392545a0cf5f2983602dfa03 (patch) | |
tree | b440fbf6f209cb610c3716f99157d039811e2b7f /lib/PublicInbox/GitHTTPBackend.pm | |
parent | 5cf5b6d19d931fce6053324b9a9540ad29487069 (diff) | |
download | public-inbox-e1a3462f01d9bedd392545a0cf5f2983602dfa03.tar.gz |
Reads to git-http-backend(1) could fail or EOF prematurely, so we must be ready for that case. Furthermore, cgit (and possibly other CGI) uses LF instead of CRLF, so support those programs, too.
Diffstat (limited to 'lib/PublicInbox/GitHTTPBackend.pm')
-rw-r--r-- | lib/PublicInbox/GitHTTPBackend.pm | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm index f6528c45..cd8cdf84 100644 --- a/lib/PublicInbox/GitHTTPBackend.pm +++ b/lib/PublicInbox/GitHTTPBackend.pm @@ -201,8 +201,8 @@ sub serve_smart { 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; }); } @@ -247,12 +247,13 @@ sub input_prepare { } 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/); |