remote-curl: let users turn off smart http
authorJeff King <peff@peff.net>
Thu, 20 Sep 2012 21:30:58 +0000 (17:30 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 21 Sep 2012 17:33:11 +0000 (10:33 -0700)
Usually there is no need for users to specify whether an
http remote is smart or dumb; the protocol is designed so
that a single initial request is made, and the client can
determine the server's capability from the response.

However, some misconfigured dumb-only servers may not like
the initial request by a smart client, as it contains a
query string. Until recently, commit 703e6e7 worked around
this by making a second request. However, that commit was
recently reverted due to its side effect of masking the
initial request's error code.

Since git has had that workaround for several years, we
don't know exactly how many such misconfigured servers are
out there. The reversion of 703e6e7 assumes they are rare
enough not to worry about. Still, that reversion leaves
somebody who does run into such a server with no escape
hatch at all. Let's give them an environment variable they
can tweak to perform the "dumb" request.

This is intentionally not a documented interface. It's
overly simple and is really there for debugging in case
somebody does complain about git not working with their
server. A real user-facing interface would entail a
per-remote or per-URL config variable.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote-curl.c
t/t5551-http-fetch.sh

index c0b98ccdf74d8812d993a39000bdb6e3741af6e1..7b19ebb0f8f09d4074e2e9f1ccdb4b356d35b066 100644 (file)
@@ -102,7 +102,8 @@ static struct discovery* discover_refs(const char *service)
        free_discovery(last);
 
        strbuf_addf(&buffer, "%sinfo/refs", url);
-       if (!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) {
+       if ((!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) &&
+            git_env_bool("GIT_SMART_HTTP", 1)) {
                maybe_smart = 1;
                if (!strchr(url, '?'))
                        strbuf_addch(&buffer, '?');
index 2db5c3564181818efdf885188d7cc597024c6f12..8427943f0e74730a6c5bff0b27a6c50f1108bf7f 100755 (executable)
@@ -129,6 +129,18 @@ test_expect_success 'clone from auth-only-for-push repository' '
        test_cmp expect actual
 '
 
+test_expect_success 'disable dumb http on server' '
+       git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
+               config http.getanyfile false
+'
+
+test_expect_success 'GIT_SMART_HTTP can disable smart http' '
+       (GIT_SMART_HTTP=0 &&
+        export GIT_SMART_HTTP &&
+        cd clone &&
+        test_must_fail git fetch)
+'
+
 test -n "$GIT_TEST_LONG" && test_set_prereq EXPENSIVE
 
 test_expect_success EXPENSIVE 'create 50,000 tags in the repo' '