diff options
author | Nick Hengeveld <nickh@reactrix.com> | 2006-01-31 11:06:55 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-01-31 16:17:24 -0800 |
commit | c8568e139ed2149fbfb7ef9a8d819d5b6b7c554f (patch) | |
tree | e44ab4d957ab445b6c1e5f3479f8c27c02ce3ab7 | |
parent | 7ec57556b29c3ed42769c122228ee4621676b642 (diff) | |
download | git-c8568e139ed2149fbfb7ef9a8d819d5b6b7c554f.tar.gz |
Fix HTTP request result processing after slot reuse
Add a way to store the results of an HTTP request when a slot finishes
so the results can be processed after the slot has been reused.
Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | http-fetch.c | 20 | ||||
-rw-r--r-- | http.c | 9 | ||||
-rw-r--r-- | http.h | 7 |
3 files changed, 29 insertions, 7 deletions
diff --git a/http-fetch.c b/http-fetch.c index 61b2188adb..92326f9ac5 100644 --- a/http-fetch.c +++ b/http-fetch.c @@ -375,6 +375,7 @@ static int fetch_index(struct alt_base *repo, unsigned char *sha1) FILE *indexfile; struct active_request_slot *slot; + static struct slot_results results; if (has_pack_index(sha1)) return 0; @@ -393,6 +394,7 @@ static int fetch_index(struct alt_base *repo, unsigned char *sha1) filename); slot = get_active_slot(); + slot->results = &results; curl_easy_setopt(slot->curl, CURLOPT_FILE, indexfile); curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite); curl_easy_setopt(slot->curl, CURLOPT_URL, url); @@ -414,7 +416,7 @@ static int fetch_index(struct alt_base *repo, unsigned char *sha1) if (start_active_slot(slot)) { run_active_slot(slot); - if (slot->curl_result != CURLE_OK) { + if (results.curl_result != CURLE_OK) { fclose(indexfile); return error("Unable to get pack index %s\n%s", url, curl_errorstr); @@ -616,6 +618,7 @@ static int fetch_indices(struct alt_base *repo) int i = 0; struct active_request_slot *slot; + static struct slot_results results; if (repo->got_indices) return 0; @@ -632,15 +635,16 @@ static int fetch_indices(struct alt_base *repo) sprintf(url, "%s/objects/info/packs", repo->base); slot = get_active_slot(); + slot->results = &results; curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer); curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); curl_easy_setopt(slot->curl, CURLOPT_URL, url); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, NULL); if (start_active_slot(slot)) { run_active_slot(slot); - if (slot->curl_result != CURLE_OK) { - if (slot->http_code == 404 || - slot->curl_result == CURLE_FILE_COULDNT_READ_FILE) { + if (results.curl_result != CURLE_OK) { + if (results.http_code == 404 || + results.curl_result == CURLE_FILE_COULDNT_READ_FILE) { repo->got_indices = 1; free(buffer.buffer); return 0; @@ -695,6 +699,7 @@ static int fetch_pack(struct alt_base *repo, unsigned char *sha1) struct curl_slist *range_header = NULL; struct active_request_slot *slot; + static struct slot_results results; if (fetch_indices(repo)) return -1; @@ -721,6 +726,7 @@ static int fetch_pack(struct alt_base *repo, unsigned char *sha1) filename); slot = get_active_slot(); + slot->results = &results; curl_easy_setopt(slot->curl, CURLOPT_FILE, packfile); curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite); curl_easy_setopt(slot->curl, CURLOPT_URL, url); @@ -742,7 +748,7 @@ static int fetch_pack(struct alt_base *repo, unsigned char *sha1) if (start_active_slot(slot)) { run_active_slot(slot); - if (slot->curl_result != CURLE_OK) { + if (results.curl_result != CURLE_OK) { fclose(packfile); return error("Unable to get pack file %s\n%s", url, curl_errorstr); @@ -894,6 +900,7 @@ int fetch_ref(char *ref, unsigned char *sha1) struct buffer buffer; char *base = alt->base; struct active_request_slot *slot; + static struct slot_results results; buffer.size = 41; buffer.posn = 0; buffer.buffer = hex; @@ -901,13 +908,14 @@ int fetch_ref(char *ref, unsigned char *sha1) url = quote_ref_url(base, ref); slot = get_active_slot(); + slot->results = &results; curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer); curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, NULL); curl_easy_setopt(slot->curl, CURLOPT_URL, url); if (start_active_slot(slot)) { run_active_slot(slot); - if (slot->curl_result != CURLE_OK) + if (results.curl_result != CURLE_OK) return error("Couldn't get %s for %s\n%s", url, ref, curl_errorstr); } else { @@ -335,6 +335,7 @@ struct active_request_slot *get_active_slot(void) active_requests++; slot->in_use = 1; slot->local = NULL; + slot->results = NULL; slot->callback_data = NULL; slot->callback_func = NULL; curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, pragma_header); @@ -421,7 +422,13 @@ static void finish_active_slot(struct active_request_slot *slot) active_requests--; slot->in_use = 0; curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE, &slot->http_code); - + + /* Store slot results so they can be read after the slot is reused */ + if (slot->results != NULL) { + slot->results->curl_result = slot->curl_result; + slot->results->http_code = slot->http_code; + } + /* Run callback if appropriate */ if (slot->callback_func != NULL) { slot->callback_func(slot->callback_data); @@ -22,6 +22,12 @@ #define NO_CURL_EASY_DUPHANDLE #endif +struct slot_results +{ + CURLcode curl_result; + long http_code; +}; + struct active_request_slot { CURL *curl; @@ -29,6 +35,7 @@ struct active_request_slot int in_use; CURLcode curl_result; long http_code; + struct slot_results *results; void *callback_data; void (*callback_func)(void *data); struct active_request_slot *next; |