summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2012-10-29 04:13:09 -0400
committerJeff King <peff@peff.net>2012-10-29 04:13:09 -0400
commit58f3f9893dc287bd5b7ec4bbd3fc56b77e126e6c (patch)
tree61abd02b0c8582a9266fd087d5e99aac6bc2b4ab
parentd2f4469b13dcd5c850058fdee4b039f07bb33142 (diff)
parent1960897ebc5a899a8e4ec3c2afc1d2325574fe41 (diff)
downloadgit-58f3f9893dc287bd5b7ec4bbd3fc56b77e126e6c.tar.gz
Merge branch 'jk/maint-http-init-not-in-result-handler'
Further clean-up to the http codepath that picks up results after cURL library is done with one request slot. * jk/maint-http-init-not-in-result-handler: http: do not set up curl auth after a 401 remote-curl: do not call run_slot repeatedly
-rw-r--r--http.c6
-rw-r--r--http.h3
-rw-r--r--remote-curl.c17
3 files changed, 12 insertions, 14 deletions
diff --git a/http.c b/http.c
index df9bb71086..98c0b2b362 100644
--- a/http.c
+++ b/http.c
@@ -745,8 +745,7 @@ char *get_remote_object_url(const char *url, const char *hex,
return strbuf_detach(&buf, NULL);
}
-int handle_curl_result(struct active_request_slot *slot,
- struct slot_results *results)
+int handle_curl_result(struct slot_results *results)
{
if (results->curl_result == CURLE_OK) {
credential_approve(&http_auth);
@@ -759,7 +758,6 @@ int handle_curl_result(struct active_request_slot *slot,
return HTTP_NOAUTH;
} else {
credential_fill(&http_auth);
- init_curl_http_auth(slot->curl);
return HTTP_REAUTH;
}
} else {
@@ -821,7 +819,7 @@ static int http_request(const char *url, void *result, int target, int options)
if (start_active_slot(slot)) {
run_active_slot(slot);
- ret = handle_curl_result(slot, &results);
+ ret = handle_curl_result(&results);
} else {
error("Unable to start HTTP request for %s", url);
ret = HTTP_START_FAILED;
diff --git a/http.h b/http.h
index 0bd1e849e1..0a80d303e3 100644
--- a/http.h
+++ b/http.h
@@ -78,8 +78,7 @@ extern int start_active_slot(struct active_request_slot *slot);
extern void run_active_slot(struct active_request_slot *slot);
extern void finish_active_slot(struct active_request_slot *slot);
extern void finish_all_active_slots(void);
-extern int handle_curl_result(struct active_request_slot *slot,
- struct slot_results *results);
+extern int handle_curl_result(struct slot_results *results);
#ifdef USE_CURL_MULTI
extern void fill_active_slots(void);
diff --git a/remote-curl.c b/remote-curl.c
index 42716c59cf..278fecdd9b 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -356,7 +356,7 @@ static int run_slot(struct active_request_slot *slot)
slot->curl_result = curl_easy_perform(slot->curl);
finish_active_slot(slot);
- err = handle_curl_result(slot, &results);
+ err = handle_curl_result(&results);
if (err != HTTP_OK && err != HTTP_REAUTH) {
error("RPC failed; result=%d, HTTP code = %ld",
results.curl_result, results.http_code);
@@ -431,6 +431,11 @@ static int post_rpc(struct rpc_state *rpc)
return -1;
}
+ headers = curl_slist_append(headers, rpc->hdr_content_type);
+ headers = curl_slist_append(headers, rpc->hdr_accept);
+ headers = curl_slist_append(headers, "Expect:");
+
+retry:
slot = get_active_slot();
curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0);
@@ -438,10 +443,6 @@ static int post_rpc(struct rpc_state *rpc)
curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "gzip");
- headers = curl_slist_append(headers, rpc->hdr_content_type);
- headers = curl_slist_append(headers, rpc->hdr_accept);
- headers = curl_slist_append(headers, "Expect:");
-
if (large_request) {
/* The request body is large and the size cannot be predicted.
* We must use chunked encoding to send it.
@@ -515,9 +516,9 @@ static int post_rpc(struct rpc_state *rpc)
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, rpc_in);
curl_easy_setopt(slot->curl, CURLOPT_FILE, rpc);
- do {
- err = run_slot(slot);
- } while (err == HTTP_REAUTH && !large_request && !use_gzip);
+ err = run_slot(slot);
+ if (err == HTTP_REAUTH && !large_request && !use_gzip)
+ goto retry;
if (err != HTTP_OK)
err = -1;