diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/http.c | 58 | ||||
-rw-r--r-- | lib/url.c | 1 | ||||
-rw-r--r-- | lib/urldata.h | 1 |
3 files changed, 38 insertions, 22 deletions
diff --git a/lib/http.c b/lib/http.c index 8457b51f4..f69c5aaaf 100644 --- a/lib/http.c +++ b/lib/http.c @@ -2060,6 +2060,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) CURLcode result=CURLE_OK; struct HTTP *http; const char *ppath = data->state.path; + bool paste_ftp_userpwd = FALSE; char ftp_typecode[sizeof(";type=?")] = ""; const char *host = conn->host.name; const char *te = ""; /* transfer-encoding */ @@ -2288,24 +2289,26 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) } } ppath = data->change.url; - if (data->set.proxy_transfer_mode) { - /* when doing ftp, append ;type=<a|i> if not present */ - if(checkprefix("ftp://", ppath) || checkprefix("ftps://", ppath)) { - char *p = strstr(ppath, ";type="); - if(p && p[6] && p[7] == 0) { - switch (Curl_raw_toupper(p[6])) { - case 'A': - case 'D': - case 'I': - break; - default: - p = NULL; + if(checkprefix("ftp://", ppath)) { + if (data->set.proxy_transfer_mode) { + /* when doing ftp, append ;type=<a|i> if not present */ + char *p = strstr(ppath, ";type="); + if(p && p[6] && p[7] == 0) { + switch (Curl_raw_toupper(p[6])) { + case 'A': + case 'D': + case 'I': + break; + default: + p = NULL; + } } - } - if(!p) - snprintf(ftp_typecode, sizeof(ftp_typecode), ";type=%c", - data->set.prefer_ascii ? 'a' : 'i'); + if(!p) + snprintf(ftp_typecode, sizeof(ftp_typecode), ";type=%c", + data->set.prefer_ascii ? 'a' : 'i'); } + if (conn->bits.user_passwd && !conn->bits.userpwd_in_url) + paste_ftp_userpwd = TRUE; } } #endif /* CURL_DISABLE_PROXY */ @@ -2464,10 +2467,23 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) return CURLE_OUT_OF_MEMORY; /* add the main request stuff */ - result = - add_bufferf(req_buffer, - "%s " /* GET/HEAD/POST/PUT */ - "%s%s HTTP/%s\r\n" /* path + HTTP version */ + /* GET/HEAD/POST/PUT */ + result = add_bufferf(req_buffer, "%s ", request); + if (result) + return result; + + /* url */ + if (paste_ftp_userpwd) + result = add_bufferf(req_buffer, "ftp://%s:%s@%s", + conn->user, conn->passwd, ppath + sizeof("ftp://") - 1); + else + result = add_buffer(req_buffer, ppath, strlen(ppath)); + if (result) + return result; + + result = add_bufferf(req_buffer, + "%s" /* ftp typecode (;type=x) */ + " HTTP/%s\r\n" /* HTTP version */ "%s" /* proxyuserpwd */ "%s" /* userpwd */ "%s" /* range */ @@ -2479,8 +2495,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) "%s" /* Proxy-Connection */ "%s",/* transfer-encoding */ - request, - ppath, ftp_typecode, httpstring, conn->allocptr.proxyuserpwd? @@ -3831,6 +3831,7 @@ static CURLcode parse_url_userpass(struct SessionHandle *data, * set user/passwd, but doing that first adds more cases here :-( */ + conn->bits.userpwd_in_url = 1; if(data->set.use_netrc != CURL_NETRC_REQUIRED) { /* We could use the one in the URL */ diff --git a/lib/urldata.h b/lib/urldata.h index f41b6583e..a1d9be739 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -625,6 +625,7 @@ struct ConnectBits { EPRT doesn't work we disable it for the forthcoming requests */ bool netrc; /* name+password provided by netrc */ + bool userpwd_in_url; /* name+password found in url */ bool done; /* set to FALSE when Curl_do() is called and set to TRUE when Curl_done() is called, to prevent Curl_done() to |