Fixed a problem with any FTP URL or any URLs containing an IPv6 address
authorDan Fandrich <dan@coneharvesters.com>
Thu, 31 Jul 2008 22:46:29 +0000 (22:46 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Thu, 31 Jul 2008 22:46:29 +0000 (22:46 +0000)
being mangled when passed to proxies when CURLOPT_PORT is also set
(reported by Pramod Sharma).

CHANGES
RELEASE-NOTES
lib/url.c

diff --git a/CHANGES b/CHANGES
index 1970b56..6081514 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,10 @@ Daniel Fandrich (31 Jul 2008)
   as well as IPv4 addresses in IPv6 format. Also, better handle the case
   of a malformatted IPv6 address (avoid empty and NULL strings).
 
+- 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).
+
 Daniel Stenberg (30 Jul 2008)
 - Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL
   parser to allow numerical IPv6-addresses to be specified with the scope
index 40fb77f..76b545f 100644 (file)
@@ -40,6 +40,7 @@ This release includes the following bugfixes:
  o CURL_READFUNC_PAUSE problems fixed
  o --use-ascii now works on Symbian OS, MS-DOS and OS/2
  o CURLINFO_SSL_VERIFYRESULT is fixed
+ o FTP URLs and IPv6 URLs mangled when sent to proxy with CURLOPT_PORT set
 
 This release includes the following known bugs:
 
@@ -60,7 +61,7 @@ advice from friends like these:
  Rob Crittenden, Dengminwen, Christopher Palow, Hans-Jurgen May,
  Phil Pellouchoud, Eduard Bloch, John Lightsey, Stephen Collyer, Tor Arntsen,
  Rolland Dudemaine, Phil Blundell, Scott Barrett, Andreas Schuldei,
- Peter Lamberg, David Bau
+ Peter Lamberg, David Bau, Pramod Sharma
 
 
         Thanks! (and sorry if I forgot to mention someone)
index 2aec565..abad3ba 100644 (file)
--- 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;