Merge branch 'br/http-init-fix'
authorJunio C Hamano <gitster@pobox.com>
Thu, 11 Sep 2014 17:33:27 +0000 (10:33 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Sep 2014 17:33:28 +0000 (10:33 -0700)
Code clean-up.

* br/http-init-fix:
http: style fixes for curl_multi_init error check
http.c: die if curl_*_init fails

1  2 
http.c
diff --combined http.c
index a23c3999e3f7a0847f8de5f15cbbabd1f7709d34,d33b122cd15f9d1b712c837c35a3c918f3e3f3ad..0adcec4683f997044807a772713d476dd77cf105
--- 1/http.c
--- 2/http.c
+++ b/http.c
@@@ -300,6 -300,9 +300,9 @@@ static CURL *get_curl_handle(void
  {
        CURL *result = curl_easy_init();
  
+       if (!result)
+               die("curl_easy_init failed");
        if (!curl_ssl_verify) {
                curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0);
                curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0);
@@@ -399,7 -402,8 +402,8 @@@ void http_init(struct remote *remote, c
        git_config(urlmatch_config_entry, &config);
        free(normalized_url);
  
-       curl_global_init(CURL_GLOBAL_ALL);
+       if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK)
+               die("curl_global_init failed");
  
        http_proactive_auth = proactive_auth;
  
        }
  
        curlm = curl_multi_init();
-       if (curlm == NULL) {
-               fprintf(stderr, "Error creating curl multi handle.\n");
-               exit(1);
-       }
+       if (!curlm)
+               die("curl_multi_init failed");
  #endif
  
        if (getenv("GIT_SSL_NO_VERIFY"))
@@@ -906,83 -908,6 +908,83 @@@ static CURLcode curlinfo_strbuf(CURL *c
        return ret;
  }
  
 +/*
 + * Check for and extract a content-type parameter. "raw"
 + * should be positioned at the start of the potential
 + * parameter, with any whitespace already removed.
 + *
 + * "name" is the name of the parameter. The value is appended
 + * to "out".
 + */
 +static int extract_param(const char *raw, const char *name,
 +                       struct strbuf *out)
 +{
 +      size_t len = strlen(name);
 +
 +      if (strncasecmp(raw, name, len))
 +              return -1;
 +      raw += len;
 +
 +      if (*raw != '=')
 +              return -1;
 +      raw++;
 +
 +      while (*raw && !isspace(*raw) && *raw != ';')
 +              strbuf_addch(out, *raw++);
 +      return 0;
 +}
 +
 +/*
 + * Extract a normalized version of the content type, with any
 + * spaces suppressed, all letters lowercased, and no trailing ";"
 + * or parameters.
 + *
 + * Note that we will silently remove even invalid whitespace. For
 + * example, "text / plain" is specifically forbidden by RFC 2616,
 + * but "text/plain" is the only reasonable output, and this keeps
 + * our code simple.
 + *
 + * If the "charset" argument is not NULL, store the value of any
 + * charset parameter there.
 + *
 + * Example:
 + *   "TEXT/PLAIN; charset=utf-8" -> "text/plain", "utf-8"
 + *   "text / plain" -> "text/plain"
 + */
 +static void extract_content_type(struct strbuf *raw, struct strbuf *type,
 +                               struct strbuf *charset)
 +{
 +      const char *p;
 +
 +      strbuf_reset(type);
 +      strbuf_grow(type, raw->len);
 +      for (p = raw->buf; *p; p++) {
 +              if (isspace(*p))
 +                      continue;
 +              if (*p == ';') {
 +                      p++;
 +                      break;
 +              }
 +              strbuf_addch(type, tolower(*p));
 +      }
 +
 +      if (!charset)
 +              return;
 +
 +      strbuf_reset(charset);
 +      while (*p) {
 +              while (isspace(*p) || *p == ';')
 +                      p++;
 +              if (!extract_param(p, "charset", charset))
 +                      return;
 +              while (*p && !isspace(*p))
 +                      p++;
 +      }
 +
 +      if (!charset->len && starts_with(type->buf, "text/"))
 +              strbuf_addstr(charset, "ISO-8859-1");
 +}
 +
  /* http_request() targets */
  #define HTTP_REQUEST_STRBUF   0
  #define HTTP_REQUEST_FILE     1
@@@ -1034,13 -959,9 +1036,13 @@@ static int http_request(const char *url
  
        ret = run_one_slot(slot, &results);
  
 -      if (options && options->content_type)
 -              curlinfo_strbuf(slot->curl, CURLINFO_CONTENT_TYPE,
 -                              options->content_type);
 +      if (options && options->content_type) {
 +              struct strbuf raw = STRBUF_INIT;
 +              curlinfo_strbuf(slot->curl, CURLINFO_CONTENT_TYPE, &raw);
 +              extract_content_type(&raw, options->content_type,
 +                                   options->charset);
 +              strbuf_release(&raw);
 +      }
  
        if (options && options->effective_url)
                curlinfo_strbuf(slot->curl, CURLINFO_EFFECTIVE_URL,
@@@ -1087,10 -1008,11 +1089,10 @@@ static int update_url_from_redirect(str
        if (!strcmp(asked, got->buf))
                return 0;
  
 -      if (!starts_with(asked, base->buf))
 +      if (!skip_prefix(asked, base->buf, &tail))
                die("BUG: update_url_from_redirect: %s is not a superset of %s",
                    asked, base->buf);
  
 -      tail = asked + base->len;
        tail_len = strlen(tail);
  
        if (got->len < tail_len ||
@@@ -1332,7 -1254,7 +1334,7 @@@ int finish_http_pack_request(struct htt
        struct packed_git **lst;
        struct packed_git *p = preq->target;
        char *tmp_idx;
 -      struct child_process ip;
 +      struct child_process ip = CHILD_PROCESS_INIT;
        const char *ip_argv[8];
  
        close_pack_index(p);
        ip_argv[3] = preq->tmpfile;
        ip_argv[4] = NULL;
  
 -      memset(&ip, 0, sizeof(ip));
        ip.argv = ip_argv;
        ip.git_cmd = 1;
        ip.no_stdin = 1;