X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FGitHTTPBackend.pm;h=c8878145b8c35488aa2ad32748bc5049dbda7c3b;hb=9bd675d33ad1e49bd2ebe12a1d216216e61380de;hp=09411048db25a8d4fcb41237d4285fa46abd9960;hpb=fe86054ee1e2d93b19762a34ed1aaebe43635ff0;p=public-inbox.git
diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm
index 09411048..c8878145 100644
--- a/lib/PublicInbox/GitHTTPBackend.pm
+++ b/lib/PublicInbox/GitHTTPBackend.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2016-2018 all contributors
+# Copyright (C) 2016-2019 all contributors
# License: AGPL-3.0+
# when no endpoints match, fallback to this and serve a static file
@@ -51,8 +51,8 @@ sub serve {
# Documentation/technical/http-protocol.txt in git.git
# requires one and exactly one query parameter:
- if ($env->{QUERY_STRING} =~ /\Aservice=git-\w+-pack\z/ ||
- $path =~ /\Agit-\w+-pack\z/) {
+ if ($env->{QUERY_STRING} =~ /\Aservice=git-[A-Za-z0-9_]+-pack\z/ ||
+ $path =~ /\Agit-[A-Za-z0-9_]+-pack\z/) {
my $ok = serve_smart($env, $git, $path);
return $ok if $ok;
}
@@ -90,7 +90,7 @@ sub static_result ($$$$) {
my $len = $size;
my $code = 200;
push @$h, 'Content-Type', $type;
- if (($env->{HTTP_RANGE} || '') =~ /\bbytes=(\d*)-(\d*)\z/) {
+ if (($env->{HTTP_RANGE} || '') =~ /\bbytes=([0-9]*)-([0-9]*)\z/) {
($code, $len) = prepare_range($env, $in, $h, $1, $2, $size);
if ($code == 416) {
push @$h, 'Content-Range', "bytes */$size";
@@ -231,18 +231,16 @@ sub input_prepare {
return;
}
last if $r == 0;
- my $off = 0;
- while ($r > 0) {
- my $w = syswrite($in, $buf, $r, $off);
- if (defined $w) {
- $r -= $w;
- $off += $w;
- } else {
- err($env, "error writing temporary file: $!");
- return;
- }
+ unless (print $in $buf) {
+ err($env, "error writing temporary file: $!");
+ return;
}
}
+ # ensure it's visible to git-http-backend(1):
+ unless ($in->flush) {
+ err($env, "error writing temporary file: $!");
+ return;
+ }
unless (defined(sysseek($in, 0, SEEK_SET))) {
err($env, "error seeking temporary file: $!");
return;
@@ -260,7 +258,7 @@ sub parse_cgi_headers {
foreach my $l (split(/\r?\n/, $h)) {
my ($k, $v) = split(/:\s*/, $l, 2);
if ($k =~ /\AStatus\z/i) {
- ($code) = ($v =~ /\b(\d+)\b/);
+ ($code) = ($v =~ /\b([0-9]+)\b/);
} else {
push @h, $k, $v;
}