Browse Source

Merge branch 'sc/http-late-auth' into maint

* sc/http-late-auth:
  Prompt for a username when an HTTP request 401s
maint
Junio C Hamano 15 years ago
parent
commit
356169c1f6
  1. 22
      http.c
  2. 2
      http.h
  3. 2
      remote-curl.c

22
http.c

@ -816,7 +816,21 @@ static int http_request(const char *url, void *result, int target, int options) @@ -816,7 +816,21 @@ static int http_request(const char *url, void *result, int target, int options)
ret = HTTP_OK;
else if (missing_target(&results))
ret = HTTP_MISSING_TARGET;
else
else if (results.http_code == 401) {
if (user_name) {
ret = HTTP_NOAUTH;
} else {
/*
* git_getpass is needed here because its very likely stdin/stdout are
* pipes to our parent process. So we instead need to use /dev/tty,
* but that is non-portable. Using git_getpass() can at least be stubbed
* on other platforms with a different implementation if/when necessary.
*/
user_name = xstrdup(git_getpass("Username: "));
init_curl_http_auth(slot->curl);
ret = HTTP_REAUTH;
}
} else
ret = HTTP_ERROR;
} else {
error("Unable to start HTTP request for %s", url);
@ -832,7 +846,11 @@ static int http_request(const char *url, void *result, int target, int options) @@ -832,7 +846,11 @@ static int http_request(const char *url, void *result, int target, int options)

int http_get_strbuf(const char *url, struct strbuf *result, int options)
{
return http_request(url, result, HTTP_REQUEST_STRBUF, options);
int http_ret = http_request(url, result, HTTP_REQUEST_STRBUF, options);
if (http_ret == HTTP_REAUTH) {
http_ret = http_request(url, result, HTTP_REQUEST_STRBUF, options);
}
return http_ret;
}

/*

2
http.h

@ -127,6 +127,8 @@ extern void end_url_with_slash(struct strbuf *buf, const char *url); @@ -127,6 +127,8 @@ extern void end_url_with_slash(struct strbuf *buf, const char *url);
#define HTTP_MISSING_TARGET 1
#define HTTP_ERROR 2
#define HTTP_START_FAILED 3
#define HTTP_REAUTH 4
#define HTTP_NOAUTH 5

/*
* Requests an url and stores the result in a strbuf.

2
remote-curl.c

@ -132,6 +132,8 @@ static struct discovery* discover_refs(const char *service) @@ -132,6 +132,8 @@ static struct discovery* discover_refs(const char *service)
case HTTP_MISSING_TARGET:
die("%s not found: did you run git update-server-info on the"
" server?", refs_url);
case HTTP_NOAUTH:
die("Authentication failed");
default:
http_error(refs_url, http_ret);
die("HTTP request failed");

Loading…
Cancel
Save