From c8568e139ed2149fbfb7ef9a8d819d5b6b7c554f Mon Sep 17 00:00:00 2001 From: Nick Hengeveld Date: Tue, 31 Jan 2006 11:06:55 -0800 Subject: [PATCH] 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 Signed-off-by: Junio C Hamano --- http-fetch.c | 20 ++++++++++++++------ http.c | 9 ++++++++- http.h | 7 +++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/http-fetch.c b/http-fetch.c index 61b2188a..92326f9a 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 { diff --git a/http.c b/http.c index 75e6717a..eefb0f03 100644 --- a/http.c +++ b/http.c @@ -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); diff --git a/http.h b/http.h index ed4ea334..d6dc9d89 100644 --- a/http.h +++ b/http.h @@ -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; -- 2.11.0