Merge branch 'bw/remote-curl-compressed-responses'
authorJunio C Hamano <gitster@pobox.com>
Wed, 30 May 2018 12:51:29 +0000 (21:51 +0900)
committerJunio C Hamano <gitster@pobox.com>
Wed, 30 May 2018 12:51:29 +0000 (21:51 +0900)
Our HTTP client code used to advertise that we accept gzip encoding
from the other side; instead, just let cURL library to advertise
and negotiate the best one.

* bw/remote-curl-compressed-responses:
remote-curl: accept compressed responses with protocol v2
remote-curl: accept all encodings supported by curl

1  2 
http.c
diff --combined http.c
index deea47411a9d263fc87d9ff03f6b3bf6fa0d0fff,709150fc7e738fb0598bd71ba43ad92b0fe19647..b4bfbceaeb7e58e79cac17f8768a7e36cff3405e
--- 1/http.c
--- 2/http.c
+++ b/http.c
@@@ -1788,7 -1788,7 +1788,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, "gzip");
+       curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "");
  
        ret = run_one_slot(slot, &results);
  
@@@ -1846,7 -1846,7 +1846,7 @@@ static int update_url_from_redirect(str
                return 0;
  
        if (!skip_prefix(asked, base->buf, &tail))
 -              die("BUG: update_url_from_redirect: %s is not a superset of %s",
 +              BUG("update_url_from_redirect: %s is not a superset of %s",
                    asked, base->buf);
  
        new_len = got->len;
@@@ -1894,7 -1894,7 +1894,7 @@@ static int http_request_reauth(const ch
                        strbuf_reset(result);
                        break;
                default:
 -                      die("BUG: HTTP_KEEP_ERROR is only supported with strbufs");
 +                      BUG("HTTP_KEEP_ERROR is only supported with strbufs");
                }
        }
  
@@@ -2038,8 -2038,7 +2038,8 @@@ int http_get_info_packs(const char *bas
        int ret = 0, i = 0;
        char *url, *data;
        struct strbuf buf = STRBUF_INIT;
 -      unsigned char sha1[20];
 +      unsigned char hash[GIT_MAX_RAWSZ];
 +      const unsigned hexsz = the_hash_algo->hexsz;
  
        end_url_with_slash(&buf, base_url);
        strbuf_addstr(&buf, "objects/info/packs");
                switch (data[i]) {
                case 'P':
                        i++;
 -                      if (i + 52 <= buf.len &&
 +                      if (i + hexsz + 12 <= buf.len &&
                            starts_with(data + i, " pack-") &&
 -                          starts_with(data + i + 46, ".pack\n")) {
 -                              get_sha1_hex(data + i + 6, sha1);
 -                              fetch_and_setup_pack_index(packs_head, sha1,
 +                          starts_with(data + i + hexsz + 6, ".pack\n")) {
 +                              get_sha1_hex(data + i + 6, hash);
 +                              fetch_and_setup_pack_index(packs_head, hash,
                                                      base_url);
 -                              i += 51;
 +                              i += hexsz + 11;
                                break;
                        }
                default:
@@@ -2083,7 -2082,6 +2083,7 @@@ void release_http_pack_request(struct h
                preq->packfile = NULL;
        }
        preq->slot = NULL;
 +      strbuf_release(&preq->tmpfile);
        free(preq->url);
        free(preq);
  }
@@@ -2106,19 -2104,19 +2106,19 @@@ int finish_http_pack_request(struct htt
                lst = &((*lst)->next);
        *lst = (*lst)->next;
  
 -      if (!strip_suffix(preq->tmpfile, ".pack.temp", &len))
 -              die("BUG: pack tmpfile does not end in .pack.temp?");
 -      tmp_idx = xstrfmt("%.*s.idx.temp", (int)len, preq->tmpfile);
 +      if (!strip_suffix(preq->tmpfile.buf, ".pack.temp", &len))
 +              BUG("pack tmpfile does not end in .pack.temp?");
 +      tmp_idx = xstrfmt("%.*s.idx.temp", (int)len, preq->tmpfile.buf);
  
        argv_array_push(&ip.args, "index-pack");
        argv_array_pushl(&ip.args, "-o", tmp_idx, NULL);
 -      argv_array_push(&ip.args, preq->tmpfile);
 +      argv_array_push(&ip.args, preq->tmpfile.buf);
        ip.git_cmd = 1;
        ip.no_stdin = 1;
        ip.no_stdout = 1;
  
        if (run_command(&ip)) {
 -              unlink(preq->tmpfile);
 +              unlink(preq->tmpfile.buf);
                unlink(tmp_idx);
                free(tmp_idx);
                return -1;
  
        unlink(sha1_pack_index_name(p->sha1));
  
 -      if (finalize_object_file(preq->tmpfile, sha1_pack_name(p->sha1))
 +      if (finalize_object_file(preq->tmpfile.buf, sha1_pack_name(p->sha1))
         || finalize_object_file(tmp_idx, sha1_pack_index_name(p->sha1))) {
                free(tmp_idx);
                return -1;
@@@ -2145,7 -2143,6 +2145,7 @@@ struct http_pack_request *new_http_pack
        struct http_pack_request *preq;
  
        preq = xcalloc(1, sizeof(*preq));
 +      strbuf_init(&preq->tmpfile, 0);
        preq->target = target;
  
        end_url_with_slash(&buf, base_url);
                sha1_to_hex(target->sha1));
        preq->url = strbuf_detach(&buf, NULL);
  
 -      snprintf(preq->tmpfile, sizeof(preq->tmpfile), "%s.temp",
 -              sha1_pack_name(target->sha1));
 -      preq->packfile = fopen(preq->tmpfile, "a");
 +      strbuf_addf(&preq->tmpfile, "%s.temp", sha1_pack_name(target->sha1));
 +      preq->packfile = fopen(preq->tmpfile.buf, "a");
        if (!preq->packfile) {
                error("Unable to open local file %s for pack",
 -                    preq->tmpfile);
 +                    preq->tmpfile.buf);
                goto abort;
        }
  
        return preq;
  
  abort:
 +      strbuf_release(&preq->tmpfile);
        free(preq->url);
        free(preq);
        return NULL;
@@@ -2204,7 -2201,7 +2204,7 @@@ static size_t fwrite_sha1_file(char *pt
                CURLcode c = curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE,
                                                &slot->http_code);
                if (c != CURLE_OK)
 -                      die("BUG: curl_easy_getinfo for HTTP code failed: %s",
 +                      BUG("curl_easy_getinfo for HTTP code failed: %s",
                                curl_easy_strerror(c));
                if (slot->http_code >= 300)
                        return size;
@@@ -2235,7 -2232,7 +2235,7 @@@ struct http_object_request *new_http_ob
  {
        char *hex = sha1_to_hex(sha1);
        struct strbuf filename = STRBUF_INIT;
 -      char prevfile[PATH_MAX];
 +      struct strbuf prevfile = STRBUF_INIT;
        int prevlocal;
        char prev_buf[PREV_BUF_SIZE];
        ssize_t prev_read = 0;
        struct http_object_request *freq;
  
        freq = xcalloc(1, sizeof(*freq));
 +      strbuf_init(&freq->tmpfile, 0);
        hashcpy(freq->sha1, sha1);
        freq->localfile = -1;
  
        sha1_file_name(the_repository, &filename, sha1);
 -      snprintf(freq->tmpfile, sizeof(freq->tmpfile),
 -               "%s.temp", filename.buf);
 +      strbuf_addf(&freq->tmpfile, "%s.temp", filename.buf);
  
 -      snprintf(prevfile, sizeof(prevfile), "%s.prev", filename.buf);
 -      unlink_or_warn(prevfile);
 -      rename(freq->tmpfile, prevfile);
 -      unlink_or_warn(freq->tmpfile);
 +      strbuf_addf(&prevfile, "%s.prev", filename.buf);
 +      unlink_or_warn(prevfile.buf);
 +      rename(freq->tmpfile.buf, prevfile.buf);
 +      unlink_or_warn(freq->tmpfile.buf);
        strbuf_release(&filename);
  
        if (freq->localfile != -1)
                error("fd leakage in start: %d", freq->localfile);
 -      freq->localfile = open(freq->tmpfile,
 +      freq->localfile = open(freq->tmpfile.buf,
                               O_WRONLY | O_CREAT | O_EXCL, 0666);
        /*
         * This could have failed due to the "lazy directory creation";
         * try to mkdir the last path component.
         */
        if (freq->localfile < 0 && errno == ENOENT) {
 -              char *dir = strrchr(freq->tmpfile, '/');
 +              char *dir = strrchr(freq->tmpfile.buf, '/');
                if (dir) {
                        *dir = 0;
 -                      mkdir(freq->tmpfile, 0777);
 +                      mkdir(freq->tmpfile.buf, 0777);
                        *dir = '/';
                }
 -              freq->localfile = open(freq->tmpfile,
 +              freq->localfile = open(freq->tmpfile.buf,
                                       O_WRONLY | O_CREAT | O_EXCL, 0666);
        }
  
        if (freq->localfile < 0) {
 -              error_errno("Couldn't create temporary file %s", freq->tmpfile);
 +              error_errno("Couldn't create temporary file %s",
 +                          freq->tmpfile.buf);
                goto abort;
        }
  
         * If a previous temp file is present, process what was already
         * fetched.
         */
 -      prevlocal = open(prevfile, O_RDONLY);
 +      prevlocal = open(prevfile.buf, O_RDONLY);
        if (prevlocal != -1) {
                do {
                        prev_read = xread(prevlocal, prev_buf, PREV_BUF_SIZE);
                } while (prev_read > 0);
                close(prevlocal);
        }
 -      unlink_or_warn(prevfile);
 +      unlink_or_warn(prevfile.buf);
 +      strbuf_release(&prevfile);
  
        /*
         * Reset inflate/SHA1 if there was an error reading the previous temp
                        lseek(freq->localfile, 0, SEEK_SET);
                        if (ftruncate(freq->localfile, 0) < 0) {
                                error_errno("Couldn't truncate temporary file %s",
 -                                          freq->tmpfile);
 +                                          freq->tmpfile.buf);
                                goto abort;
                        }
                }
        return freq;
  
  abort:
 +      strbuf_release(&prevfile);
        free(freq->url);
        free(freq);
        return NULL;
@@@ -2382,24 -2376,24 +2382,24 @@@ int finish_http_object_request(struct h
        if (freq->http_code == 416) {
                warning("requested range invalid; we may already have all the data.");
        } else if (freq->curl_result != CURLE_OK) {
 -              if (stat(freq->tmpfile, &st) == 0)
 +              if (stat(freq->tmpfile.buf, &st) == 0)
                        if (st.st_size == 0)
 -                              unlink_or_warn(freq->tmpfile);
 +                              unlink_or_warn(freq->tmpfile.buf);
                return -1;
        }
  
        git_inflate_end(&freq->stream);
        git_SHA1_Final(freq->real_sha1, &freq->c);
        if (freq->zret != Z_STREAM_END) {
 -              unlink_or_warn(freq->tmpfile);
 +              unlink_or_warn(freq->tmpfile.buf);
                return -1;
        }
        if (hashcmp(freq->sha1, freq->real_sha1)) {
 -              unlink_or_warn(freq->tmpfile);
 +              unlink_or_warn(freq->tmpfile.buf);
                return -1;
        }
        sha1_file_name(the_repository, &filename, freq->sha1);
 -      freq->rename = finalize_object_file(freq->tmpfile, filename.buf);
 +      freq->rename = finalize_object_file(freq->tmpfile.buf, filename.buf);
        strbuf_release(&filename);
  
        return freq->rename;
  
  void abort_http_object_request(struct http_object_request *freq)
  {
 -      unlink_or_warn(freq->tmpfile);
 +      unlink_or_warn(freq->tmpfile.buf);
  
        release_http_object_request(freq);
  }
@@@ -2427,5 -2421,4 +2427,5 @@@ void release_http_object_request(struc
                release_active_slot(freq->slot);
                freq->slot = NULL;
        }
 +      strbuf_release(&freq->tmpfile);
  }