Skip to content

Commit

Permalink
http_init(): Fix config file parsing
Browse files Browse the repository at this point in the history
We honor the command line options, environment variables, variables in
repository configuration file, variables in user's global configuration
file, variables in the system configuration file, and then finally use
built-in default.  To implement this semantics, the code should:

 - start from built-in default values;

 - call git_config() with the configuration parser callback, which
   implements "later definition overrides earlier ones" logic
   (git_config() reads the system's, user's and then repository's
   configuration file in this order);

 - override the result from the above with environment variables if set;

 - override the result from the above with command line options.

The initialization code http_init() for http transfer got this wrong, and
implemented a "first one wins, ignoring the later ones" in http_options(),
to compensate this mistake, read environment variables before calling
git_config().  This is all wrong.

As a second class citizen, the http codepath hasn't been audited as
closely as other parts of the system, but we should try to bring sanity to
it, before inviting contributors to improve on it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Mar 11, 2009
1 parent 4251ccb commit 7059cd9
Showing 1 changed file with 27 additions and 42 deletions.
69 changes: 27 additions & 42 deletions http.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,64 +94,42 @@ static void process_curl_messages(void)
static int http_options(const char *var, const char *value, void *cb)
{
if (!strcmp("http.sslverify", var)) {
if (curl_ssl_verify == -1)
curl_ssl_verify = git_config_bool(var, value);
return 0;
}

if (!strcmp("http.sslcert", var)) {
if (ssl_cert == NULL)
return git_config_string(&ssl_cert, var, value);
curl_ssl_verify = git_config_bool(var, value);
return 0;
}
if (!strcmp("http.sslcert", var))
return git_config_string(&ssl_cert, var, value);
#if LIBCURL_VERSION_NUM >= 0x070902
if (!strcmp("http.sslkey", var)) {
if (ssl_key == NULL)
return git_config_string(&ssl_key, var, value);
return 0;
}
if (!strcmp("http.sslkey", var))
return git_config_string(&ssl_key, var, value);
#endif
#if LIBCURL_VERSION_NUM >= 0x070908
if (!strcmp("http.sslcapath", var)) {
if (ssl_capath == NULL)
return git_config_string(&ssl_capath, var, value);
return 0;
}
if (!strcmp("http.sslcapath", var))
return git_config_string(&ssl_capath, var, value);
#endif
if (!strcmp("http.sslcainfo", var)) {
if (ssl_cainfo == NULL)
return git_config_string(&ssl_cainfo, var, value);
return 0;
}

if (!strcmp("http.sslcainfo", var))
return git_config_string(&ssl_cainfo, var, value);
#ifdef USE_CURL_MULTI
if (!strcmp("http.maxrequests", var)) {
if (max_requests == -1)
max_requests = git_config_int(var, value);
max_requests = git_config_int(var, value);
return 0;
}
#endif

if (!strcmp("http.lowspeedlimit", var)) {
if (curl_low_speed_limit == -1)
curl_low_speed_limit = (long)git_config_int(var, value);
curl_low_speed_limit = (long)git_config_int(var, value);
return 0;
}
if (!strcmp("http.lowspeedtime", var)) {
if (curl_low_speed_time == -1)
curl_low_speed_time = (long)git_config_int(var, value);
curl_low_speed_time = (long)git_config_int(var, value);
return 0;
}

if (!strcmp("http.noepsv", var)) {
curl_ftp_no_epsv = git_config_bool(var, value);
return 0;
}
if (!strcmp("http.proxy", var)) {
if (curl_http_proxy == NULL)
return git_config_string(&curl_http_proxy, var, value);
return 0;
}
if (!strcmp("http.proxy", var))
return git_config_string(&curl_http_proxy, var, value);

/* Fall back on the default ones */
return git_default_config(var, value, cb);
Expand Down Expand Up @@ -212,11 +190,20 @@ static CURL *get_curl_handle(void)
return result;
}

static void set_from_env(const char **var, const char *envname)
{
const char *val = getenv(envname);
if (val)
*var = val;
}

void http_init(struct remote *remote)
{
char *low_speed_limit;
char *low_speed_time;

git_config(http_options, NULL);

curl_global_init(CURL_GLOBAL_ALL);

if (remote && remote->http_proxy)
Expand All @@ -241,14 +228,14 @@ void http_init(struct remote *remote)
if (getenv("GIT_SSL_NO_VERIFY"))
curl_ssl_verify = 0;

ssl_cert = getenv("GIT_SSL_CERT");
set_from_env(&ssl_cert, "GIT_SSL_CERT");
#if LIBCURL_VERSION_NUM >= 0x070902
ssl_key = getenv("GIT_SSL_KEY");
set_from_env(&ssl_key, "GIT_SSL_KEY");
#endif
#if LIBCURL_VERSION_NUM >= 0x070908
ssl_capath = getenv("GIT_SSL_CAPATH");
set_from_env(&ssl_capath, "GIT_SSL_CAPATH");
#endif
ssl_cainfo = getenv("GIT_SSL_CAINFO");
set_from_env(&ssl_cainfo, "GIT_SSL_CAINFO");

low_speed_limit = getenv("GIT_HTTP_LOW_SPEED_LIMIT");
if (low_speed_limit != NULL)
Expand All @@ -257,8 +244,6 @@ void http_init(struct remote *remote)
if (low_speed_time != NULL)
curl_low_speed_time = strtol(low_speed_time, NULL, 10);

git_config(http_options, NULL);

if (curl_ssl_verify == -1)
curl_ssl_verify = 1;

Expand Down

0 comments on commit 7059cd9

Please sign in to comment.