aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--RELEASE-NOTES3
-rw-r--r--docs/KNOWN_BUGS5
-rw-r--r--docs/libcurl/curl_easy_setopt.320
-rw-r--r--include/curl/curl.h4
-rw-r--r--include/curl/typecheck-gcc.h4
-rw-r--r--lib/url.c101
-rw-r--r--lib/urldata.h3
8 files changed, 99 insertions, 47 deletions
diff --git a/CHANGES b/CHANGES
index d16b3ed55..ff90a0c1f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,12 @@
Changelog
+Daniel Stenberg (16 Oct 2008)
+- Igor Novoseltsev added CURLOPT_PROXYUSER and CURLOPT_PROXYPASSWORD that then
+ make CURLOPT_PROXYUSERPWD sort of deprecated. The primary motive for adding
+ these new options is that they have no problems with the colon separator
+ that the CURLOPT_PROXYUSERPWD option does.
+
Daniel Stenberg (15 Oct 2008)
- Pascal Terjan filed bug #2154627
(http://curl.haxx.se/bug/view.cgi?id=2154627) which pointed out that libcurl
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index cba3eed21..bf78c157c 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -2,7 +2,7 @@ Curl and libcurl 7.19.1
Public curl releases: 107
Command line options: 128
- curl_easy_setopt() options: 156
+ curl_easy_setopt() options: 158
Public functions in libcurl: 58
Known libcurl bindings: 37
Contributors: 672
@@ -16,6 +16,7 @@ This release includes the following changes:
o configure --disable-proxy disables proxy
o Added CURLOPT_USERNAME and CURLOPT_PASSWORD
o --interface now works with IPv6 connections on glibc systems
+ o Added CURLOPT_PROXYUSER and CURLOPT_PROXYPASSWORD
This release includes the following bugfixes:
diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS
index dcc693cb9..e9ecd5103 100644
--- a/docs/KNOWN_BUGS
+++ b/docs/KNOWN_BUGS
@@ -160,11 +160,6 @@ may have been fixed since this was written!
doesn't do a HEAD first to get the initial size. This needs to be done
manually for HTTP PUT resume to work, and then '-C [index]'.
-7. CURLOPT_PROXYUSERPWD has no way of providing user names that contain a
- colon. This can't be fixed easily in a backwards compatible way without
- adding new options. CURLOPT_USERPWD was split into CURLOPT_USERNAME and
- CURLOPT_PASSWORD for this reason.
-
6. libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that
such parts should be sent to the server as 'CWD ' (without an argument).
The only exception to this rule, is that we knowingly break this if the
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index cface443c..9759e8fcc 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -620,6 +620,26 @@ password to use for the transfer.
The CURLOPT_PASSWORD option should be used in conjunction with
as the \fICURLOPT_USERNAME\fP option. (Added in 7.19.1)
+.IP CURLOPT_PROXYUSERNAME
+Pass a char * as parameter, which should be pointing to the zero terminated
+user name to use for the transfer while connecting to Proxy.
+
+The CURLOPT_PROXYUSERNAME option should be used in same way as the
+\fICURLOPT_PROXYUSERPWD\fP is used. In comparison to \fICURLOPT_PROXYUSERPWD\fP
+the CURLOPT_PROXYUSERNAME allows the username to contain colon,
+like in following example: "sip:user@example.com".
+Note the CURLOPT_PROXYUSERNAME option is an alternative way to set the user name
+while connecting to Proxy. There is no meaning to use it together
+with the \fICURLOPT_PROXYUSERPWD\fP option.
+
+In order to specify the password to be used in conjunction with the user name
+use the \fICURLOPT_PROXYPASSWORD\fP option. (Added in 7.19.1)
+.IP CURLOPT_PROXYPASSWORD
+Pass a char * as parameter, which should be pointing to the zero terminated
+password to use for the transfer while connecting to Proxy.
+
+The CURLOPT_PROXYPASSWORD option should be used in conjunction with
+as the \fICURLOPT_PROXYUSERNAME\fP option. (Added in 7.19.1)
.IP CURLOPT_HTTPAUTH
Pass a long as parameter, which is set to a bitmask, to tell libcurl what
authentication method(s) you want it to use. The available bits are listed
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 7a0960f03..0d4fdbbb2 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -1144,6 +1144,10 @@ typedef enum {
/* "name" and "pwd" to use when fetching. */
CINIT(USERNAME, OBJECTPOINT, 173),
CINIT(PASSWORD, OBJECTPOINT, 174),
+
+ /* "name" and "pwd" to use with Proxy when fetching. */
+ CINIT(PROXYUSERNAME, OBJECTPOINT, 175),
+ CINIT(PROXYPASSWORD, OBJECTPOINT, 176),
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h
index 33e264771..6f5313f1f 100644
--- a/include/curl/typecheck-gcc.h
+++ b/include/curl/typecheck-gcc.h
@@ -198,7 +198,9 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
(option) == CURLOPT_USERPWD || \
(option) == CURLOPT_USERNAME || \
(option) == CURLOPT_PASSWORD || \
- (option) == CURLOPT_PROXYUSERPWD || \
+ (option) == CURLOPT_PROXYUSERPWD || \
+ (option) == CURLOPT_PROXYUSERNAME || \
+ (option) == CURLOPT_PROXYPASSWORD || \
(option) == CURLOPT_ENCODING || \
(option) == CURLOPT_REFERER || \
(option) == CURLOPT_USERAGENT || \
diff --git a/lib/url.c b/lib/url.c
index 0f007fa39..b385e2dee 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -280,6 +280,39 @@ static CURLcode setstropt(char **charp, char * s)
return CURLE_OK;
}
+static CURLcode setstropt_userpwd(char *option, char **user_storage,
+ char **pwd_storage)
+{
+ char* separator;
+ CURLcode result = CURLE_OK;
+
+ separator = strchr(option, ':');
+ if (separator != NULL) {
+
+ /* store username part of option */
+ char * p;
+ size_t username_len = (size_t)(separator-option);
+ p = malloc(username_len+1);
+ if(!p)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ memcpy(p, option, username_len);
+ p[username_len] = '\0';
+ Curl_safefree(*user_storage);
+ *user_storage = p;
+ }
+
+ /* store password part of option */
+ if (result == CURLE_OK) {
+ result = setstropt(pwd_storage, separator+1);
+ }
+ }
+ else {
+ result = setstropt(user_storage, option);
+ }
+ return result;
+}
+
CURLcode Curl_dupset(struct SessionHandle * dst, struct SessionHandle * src)
{
CURLcode r = CURLE_OK;
@@ -1500,39 +1533,9 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
/*
* user:password to use in the operation
*/
- {
- char* userpwd;
- char* separator;
-
- userpwd = va_arg(param, char *);
- if(userpwd == NULL)
- break;
-
- separator = strchr(userpwd, ':');
- if (separator != NULL) {
-
- /* store username part of option */
- char * p;
- size_t username_len = (size_t)(separator-userpwd);
- p = malloc(username_len+1);
- if(!p)
- result = CURLE_OUT_OF_MEMORY;
- else {
- memcpy(p, userpwd, username_len);
- p[username_len] = '\0';
- Curl_safefree(data->set.str[STRING_USERNAME]);
- data->set.str[STRING_USERNAME] = p;
- }
-
- /* store password part of option */
- if (result == CURLE_OK) {
- result = setstropt(&data->set.str[STRING_PASSWORD], separator+1);
- }
- }
- else {
- result = setstropt(&data->set.str[STRING_USERNAME], userpwd);
- }
- }
+ result = setstropt_userpwd(va_arg(param, char *),
+ &data->set.str[STRING_USERNAME],
+ &data->set.str[STRING_PASSWORD]);
break;
case CURLOPT_USERNAME:
/*
@@ -1587,7 +1590,22 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
/*
* user:password needed to use the proxy
*/
- result = setstropt(&data->set.str[STRING_PROXYUSERPWD],
+ result = setstropt_userpwd(va_arg(param, char *),
+ &data->set.str[STRING_PROXYUSERNAME],
+ &data->set.str[STRING_PROXYPASSWORD]);
+ break;
+ case CURLOPT_PROXYUSERNAME:
+ /*
+ * authentication user name to use in the operation
+ */
+ result = setstropt(&data->set.str[STRING_PROXYUSERNAME],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXYPASSWORD:
+ /*
+ * authentication password to use in the operation
+ */
+ result = setstropt(&data->set.str[STRING_PROXYPASSWORD],
va_arg(param, char *));
break;
case CURLOPT_RANGE:
@@ -3545,10 +3563,15 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,
char proxyuser[MAX_CURL_USER_LENGTH]="";
char proxypasswd[MAX_CURL_PASSWORD_LENGTH]="";
- sscanf(data->set.str[STRING_PROXYUSERPWD],
- "%" MAX_CURL_USER_LENGTH_TXT "[^:]:"
- "%" MAX_CURL_PASSWORD_LENGTH_TXT "[^\n]",
- proxyuser, proxypasswd);
+ if(data->set.str[STRING_PROXYUSERNAME] != NULL) {
+ strncpy(proxyuser, data->set.str[STRING_PROXYUSERNAME], MAX_CURL_USER_LENGTH);
+ proxyuser[MAX_CURL_USER_LENGTH-1] = '\0'; /*To be on safe side*/
+ }
+ if(data->set.str[STRING_PROXYPASSWORD] != NULL) {
+ strncpy(proxypasswd, data->set.str[STRING_PROXYPASSWORD],
+ MAX_CURL_PASSWORD_LENGTH);
+ proxypasswd[MAX_CURL_PASSWORD_LENGTH-1] = '\0'; /*To be on safe side*/
+ }
conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);
if(!conn->proxyuser)
@@ -4032,7 +4055,7 @@ static CURLcode create_conn(struct SessionHandle *data,
conn->bits.user_passwd = (bool)(NULL != data->set.str[STRING_USERNAME]);
- conn->bits.proxy_user_passwd = (bool)(NULL != data->set.str[STRING_PROXYUSERPWD]);
+ conn->bits.proxy_user_passwd = (bool)(NULL != data->set.str[STRING_PROXYUSERNAME]);
conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
diff --git a/lib/urldata.h b/lib/urldata.h
index a1a95ef44..079c7716b 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1322,7 +1322,6 @@ enum dupstring {
$HOME/.netrc */
STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */
STRING_PROXY, /* proxy to use */
- STRING_PROXYUSERPWD, /* Proxy <user:password>, if used */
STRING_SET_RANGE, /* range, if used */
STRING_SET_REFERER, /* custom string for the HTTP referer field */
STRING_SET_URL, /* what original URL to work on */
@@ -1339,6 +1338,8 @@ enum dupstring {
STRING_SSL_ISSUERCERT, /* issuer cert file to check certificate */
STRING_USERNAME, /* <username>, if used */
STRING_PASSWORD, /* <password>, if used */
+ STRING_PROXYUSERNAME, /* Proxy <username>, if used */
+ STRING_PROXYPASSWORD, /* Proxy <password>, if used */
/* -- end of strings -- */
STRING_LAST /* not used, just an end-of-list marker */