]> git.ipfire.org Git - thirdparty/git.git/blobdiff - http-walker.c
Merge branch 'rs/pull-leakfix'
[thirdparty/git.git] / http-walker.c
index 8ae5d76c6aa216e92c26b875f72b7bb991b6e3cd..4fb1235cd455464ad863a76097197f1c27827509 100644 (file)
@@ -98,6 +98,11 @@ static void process_object_response(void *callback_data)
        process_http_object_request(obj_req->req);
        obj_req->state = COMPLETE;
 
+       normalize_curl_result(&obj_req->req->curl_result,
+                             obj_req->req->http_code,
+                             obj_req->req->errorstr,
+                             sizeof(obj_req->req->errorstr));
+
        /* Use alternates if necessary */
        if (missing_target(obj_req->req)) {
                fetch_alternates(walker, alt->base);
@@ -208,6 +213,9 @@ static void process_alternates_response(void *callback_data)
        char *data;
        int i = 0;
 
+       normalize_curl_result(&slot->curl_result, slot->http_code,
+                             curl_errorstr, sizeof(curl_errorstr));
+
        if (alt_req->http_specific) {
                if (slot->curl_result != CURLE_OK ||
                    !alt_req->buffer->len) {
@@ -431,18 +439,18 @@ static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigne
        target = find_sha1_pack(sha1, repo->packs);
        if (!target)
                return -1;
+       close_pack_index(target);
 
        if (walker->get_verbosely) {
                fprintf(stderr, "Getting pack %s\n",
-                       sha1_to_hex(target->sha1));
+                       hash_to_hex(target->hash));
                fprintf(stderr, " which contains %s\n",
-                       sha1_to_hex(sha1));
+                       hash_to_hex(sha1));
        }
 
-       preq = new_http_pack_request(target, repo->base);
+       preq = new_http_pack_request(target->hash, repo->base);
        if (preq == NULL)
                goto abort;
-       preq->lst = &repo->packs;
        preq->slot->results = &results;
 
        if (start_active_slot(preq->slot)) {
@@ -461,6 +469,7 @@ static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigne
        release_http_pack_request(preq);
        if (ret)
                return ret;
+       http_install_packfile(target, &repo->packs);
 
        return 0;
 
@@ -473,9 +482,9 @@ static void abort_object_request(struct object_request *obj_req)
        release_object_request(obj_req);
 }
 
-static int fetch_object(struct walker *walker, unsigned char *sha1)
+static int fetch_object(struct walker *walker, unsigned char *hash)
 {
-       char *hex = sha1_to_hex(sha1);
+       char *hex = hash_to_hex(hash);
        int ret = 0;
        struct object_request *obj_req = NULL;
        struct http_object_request *req;
@@ -483,7 +492,7 @@ static int fetch_object(struct walker *walker, unsigned char *sha1)
 
        list_for_each(pos, head) {
                obj_req = list_entry(pos, struct object_request, node);
-               if (hasheq(obj_req->oid.hash, sha1))
+               if (hasheq(obj_req->oid.hash, hash))
                        break;
        }
        if (obj_req == NULL)
@@ -518,17 +527,8 @@ static int fetch_object(struct walker *walker, unsigned char *sha1)
                req->localfile = -1;
        }
 
-       /*
-        * we turned off CURLOPT_FAILONERROR to avoid losing a
-        * persistent connection and got CURLE_OK.
-        */
-       if (req->http_code >= 300 && req->curl_result == CURLE_OK &&
-                       (starts_with(req->url, "http://") ||
-                        starts_with(req->url, "https://"))) {
-               req->curl_result = CURLE_HTTP_RETURNED_ERROR;
-               xsnprintf(req->errorstr, sizeof(req->errorstr),
-                         "HTTP request failed");
-       }
+       normalize_curl_result(&req->curl_result, req->http_code,
+                             req->errorstr, sizeof(req->errorstr));
 
        if (obj_req->state == ABORTED) {
                ret = error("Request for %s aborted", hex);
@@ -557,20 +557,20 @@ static int fetch_object(struct walker *walker, unsigned char *sha1)
        return ret;
 }
 
-static int fetch(struct walker *walker, unsigned char *sha1)
+static int fetch(struct walker *walker, unsigned char *hash)
 {
        struct walker_data *data = walker->data;
        struct alt_base *altbase = data->alt;
 
-       if (!fetch_object(walker, sha1))
+       if (!fetch_object(walker, hash))
                return 0;
        while (altbase) {
-               if (!http_fetch_pack(walker, altbase, sha1))
+               if (!http_fetch_pack(walker, altbase, hash))
                        return 0;
                fetch_alternates(walker, data->alt->base);
                altbase = altbase->next;
        }
-       return error("Unable to find %s under %s", sha1_to_hex(sha1),
+       return error("Unable to find %s under %s", hash_to_hex(hash),
                     data->alt->base);
 }