diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-05-08 22:33:16 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-05-08 22:33:16 -0700 |
commit | f350e1faaa7070030a5c40acdaec650b47dfdc12 (patch) | |
tree | 2c2c5f86caec5cc5642544891ffce9e271eeb1b1 | |
parent | Merge branch 'jk/cached-textconv' (diff) | |
parent | Prompt for a username when an HTTP request 401s (diff) | |
download | tgif-f350e1faaa7070030a5c40acdaec650b47dfdc12.tar.xz |
Merge branch 'sc/http-late-auth'
* sc/http-late-auth:
Prompt for a username when an HTTP request 401s
-rw-r--r-- | http.c | 22 | ||||
-rw-r--r-- | http.h | 2 | ||||
-rw-r--r-- | remote-curl.c | 2 |
3 files changed, 24 insertions, 2 deletions
@@ -815,7 +815,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); @@ -831,7 +845,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; } /* @@ -126,6 +126,8 @@ extern char *get_remote_object_url(const char *url, const char *hex, #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. diff --git a/remote-curl.c b/remote-curl.c index b76bfcb3d3..07827562b5 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -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"); |