http: enable keep_error for HTTP requests
authorMasaya Suzuki <masayasuzuki@google.com>
Thu, 10 Jan 2019 19:33:47 +0000 (11:33 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Jan 2019 23:00:56 +0000 (15:00 -0800)
curl stops parsing a response when it sees a bad HTTP status code and it
has CURLOPT_FAILONERROR set. This prevents GIT_CURL_VERBOSE to show HTTP
headers on error.

keep_error is an option to receive the HTTP response body for those
error responses. By enabling this option, curl will process the HTTP
response headers, and they're shown if GIT_CURL_VERBOSE is set.

Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
http.c
http.h
remote-curl.c
diff --git a/http.c b/http.c
index ab4279a1ca6062576a294faac41f756d30e99b20..b39921636a8cd1d9a734583c5ea4077ca762ddf2 100644 (file)
--- a/http.c
+++ b/http.c
@@ -1837,8 +1837,6 @@ static int http_request(const char *url,
        strbuf_addstr(&buf, "Pragma:");
        if (options && options->no_cache)
                strbuf_addstr(&buf, " no-cache");
-       if (options && options->keep_error)
-               curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0);
        if (options && options->initial_request &&
            http_follow_config == HTTP_FOLLOW_INITIAL)
                curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
@@ -1856,6 +1854,7 @@ static int http_request(const char *url,
        curl_easy_setopt(slot->curl, CURLOPT_URL, url);
        curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "");
+       curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0);
 
        ret = run_one_slot(slot, &results);
 
@@ -1950,29 +1949,26 @@ static int http_request_reauth(const char *url,
                return ret;
 
        /*
-        * If we are using KEEP_ERROR, the previous request may have
-        * put cruft into our output stream; we should clear it out before
-        * making our next request.
+        * The previous request may have put cruft into our output stream; we
+        * should clear it out before making our next request.
         */
-       if (options && options->keep_error) {
-               switch (target) {
-               case HTTP_REQUEST_STRBUF:
-                       strbuf_reset(result);
-                       break;
-               case HTTP_REQUEST_FILE:
-                       if (fflush(result)) {
-                               error_errno("unable to flush a file");
-                               return HTTP_START_FAILED;
-                       }
-                       rewind(result);
-                       if (ftruncate(fileno(result), 0) < 0) {
-                               error_errno("unable to truncate a file");
-                               return HTTP_START_FAILED;
-                       }
-                       break;
-               default:
-                       BUG("Unknown http_request target");
+       switch (target) {
+       case HTTP_REQUEST_STRBUF:
+               strbuf_reset(result);
+               break;
+       case HTTP_REQUEST_FILE:
+               if (fflush(result)) {
+                       error_errno("unable to flush a file");
+                       return HTTP_START_FAILED;
+               }
+               rewind(result);
+               if (ftruncate(fileno(result), 0) < 0) {
+                       error_errno("unable to truncate a file");
+                       return HTTP_START_FAILED;
                }
+               break;
+       default:
+               BUG("Unknown http_request target");
        }
 
        credential_fill(&http_auth);
diff --git a/http.h b/http.h
index d305ca1dc7a3f931a81353c56060e98f4039c692..eebf40688cf6f695d12f9fe78e8e6b99bb44a8c4 100644 (file)
--- a/http.h
+++ b/http.h
@@ -146,7 +146,6 @@ extern char *get_remote_object_url(const char *url, const char *hex,
 /* Options for http_get_*() */
 struct http_get_options {
        unsigned no_cache:1,
-                keep_error:1,
                 initial_request:1;
 
        /* If non-NULL, returns the content-type of the response. */
index 1220dffcdc57a17476fb2021db5fb1605857ab80..d8eda2380a31fc28b903772a854f444296ab8e22 100644 (file)
@@ -380,7 +380,6 @@ static struct discovery *discover_refs(const char *service, int for_push)
        http_options.extra_headers = &extra_headers;
        http_options.initial_request = 1;
        http_options.no_cache = 1;
-       http_options.keep_error = 1;
 
        http_ret = http_get_strbuf(refs_url.buf, &buffer, &http_options);
        switch (http_ret) {