diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-01-10 15:24:25 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-01-10 15:24:25 -0800 |
commit | d984592043aec3c9f5b1955560a133896ca115b5 (patch) | |
tree | 7bae1e3caccc682524e72de81e760fc3b031dbef /upload-pack.c | |
parent | 979b82f19f3c44d34779c46c636aade514a711a9 (diff) | |
parent | f8edeaa05d8623a9f6dad408237496c51101aad8 (diff) |
Merge branch 'dt/smart-http-detect-server-going-away'
When the http server gives an incomplete response to a smart-http
rpc call, it could lead to client waiting for a full response that
will never come. Teach the client side to notice this condition
and abort the transfer.
An improvement counterproposal has failed.
cf. <20161114194049.mktpsvgdhex2f4zv@sigill.intra.peff.net>
* dt/smart-http-detect-server-going-away:
upload-pack: optionally allow fetching any sha1
remote-curl: don't hang when a server dies before any output
Diffstat (limited to 'upload-pack.c')
-rw-r--r-- | upload-pack.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/upload-pack.c b/upload-pack.c index e0db8b42be..7597ba3405 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -46,6 +46,8 @@ static int no_progress, daemon_mode; #define ALLOW_TIP_SHA1 01 /* Allow request of a sha1 if it is reachable from a ref (possibly hidden ref). */ #define ALLOW_REACHABLE_SHA1 02 +/* Allow request of any sha1. Implies ALLOW_TIP_SHA1 and ALLOW_REACHABLE_SHA1. */ +#define ALLOW_ANY_SHA1 07 static unsigned int allow_unadvertised_object_request; static int shallow_nr; static struct object_array have_obj; @@ -825,7 +827,8 @@ static void receive_needs(void) sha1_to_hex(sha1_buf)); if (!(o->flags & WANTED)) { o->flags |= WANTED; - if (!is_our_ref(o)) + if (!((allow_unadvertised_object_request & ALLOW_ANY_SHA1) == ALLOW_ANY_SHA1 + || is_our_ref(o))) has_non_tip = 1; add_object_array(o, NULL, &want_obj); } @@ -1008,6 +1011,11 @@ static int upload_pack_config(const char *var, const char *value, void *unused) allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1; else allow_unadvertised_object_request &= ~ALLOW_REACHABLE_SHA1; + } else if (!strcmp("uploadpack.allowanysha1inwant", var)) { + if (git_config_bool(var, value)) + allow_unadvertised_object_request |= ALLOW_ANY_SHA1; + else + allow_unadvertised_object_request &= ~ALLOW_ANY_SHA1; } else if (!strcmp("uploadpack.keepalive", var)) { keepalive = git_config_int(var, value); if (!keepalive) |