aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDan Fandrich <dan@coneharvesters.com>2008-07-31 22:46:29 +0000
committerDan Fandrich <dan@coneharvesters.com>2008-07-31 22:46:29 +0000
commitb4a5ce89c24a8015c1cb3226fd7a53a7af2048bc (patch)
treeedffcd4c32f67bb352f4b51a0e47a08ec64fb417 /lib
parent660516914e35631714c73a2002ccfa4d854a0290 (diff)
Fixed a problem with any FTP URL or any URLs containing an IPv6 address
being mangled when passed to proxies when CURLOPT_PORT is also set (reported by Pramod Sharma).
Diffstat (limited to 'lib')
-rw-r--r--lib/url.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/url.c b/lib/url.c
index 2aec5656d..abad3ba97 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -3863,15 +3863,14 @@ static CURLcode create_conn(struct SessionHandle *data,
* The conn->host.name is currently [user:passwd@]host[:port] where host
* could be a hostname, IPv4 address or IPv6 address.
*************************************************************/
- if((1 == sscanf(conn->host.name, "[%*39[0123456789abcdefABCDEF:.]%c", &endbracket)) &&
+ if((1 == sscanf(conn->host.name, "[%*39[0123456789abcdefABCDEF:.%]%c", &endbracket)) &&
(']' == endbracket)) {
/* this is a RFC2732-style specified IP-address */
conn->bits.ipv6_ip = TRUE;
- conn->host.name++; /* pass the starting bracket */
+ conn->host.name++; /* skip over the starting bracket */
tmp = strchr(conn->host.name, ']');
- *tmp = 0; /* zero terminate */
- tmp++; /* pass the ending bracket */
+ *tmp++ = 0; /* zero terminate, killing the bracket */
if(':' != *tmp)
tmp = NULL; /* no port number available */
}
@@ -3887,9 +3886,18 @@ static CURLcode create_conn(struct SessionHandle *data,
if(conn->bits.httpproxy) {
/* we need to create new URL with the new port number */
char *url;
+ bool isftp = strequal("ftp", conn->protostr) ||
+ strequal("ftps", conn->protostr);
- url = aprintf("%s://%s:%d%s", conn->protostr, conn->host.name,
- conn->remote_port, data->state.path);
+ /*
+ * This synthesized URL isn't always right--suffixes like ;type=A
+ * are stripped off. It would be better to work directly from the
+ * original URL and simply replace the port part of it.
+ */
+ url = aprintf("%s://%s%s%s:%d%s%s", conn->protostr,
+ conn->bits.ipv6_ip?"[":"", conn->host.name,
+ conn->bits.ipv6_ip?"]":"", conn->remote_port,
+ isftp?"/":"", data->state.path);
if(!url)
return CURLE_OUT_OF_MEMORY;