Lukasz Czekierda correctly pointed out that curl used a bad Host: header
authorDaniel Stenberg <daniel@haxx.se>
Wed, 11 Sep 2002 10:32:37 +0000 (10:32 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 11 Sep 2002 10:32:37 +0000 (10:32 +0000)
when talking to a IPv6-server using IPv6 IP address only.

lib/connect.c
lib/http.c
lib/url.c
lib/urldata.h

index 0272f2e..2032535 100644 (file)
@@ -463,7 +463,11 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
   }
 
   hostname = data->change.proxy?conn->proxyhost:conn->hostname;
-  infof(data, "About to connect() to %s:%d\n", hostname, port);
+  infof(data, "About to connect() to %s%s%s:%d\n",
+        conn->bits.ipv6_ip?"[":"",
+        hostname,
+        conn->bits.ipv6_ip?"]":"",
+        port);
 
 #ifdef ENABLE_IPV6
   /*
index 788309d..6a71e47 100644 (file)
@@ -581,13 +581,22 @@ CURLcode Curl_http(struct connectdata *conn)
     if(conn->allocptr.host)
       free(conn->allocptr.host);
 
+    /* When building Host: headers, we must put the host name within
+       [brackets] if the host name is a plain IPv6-address. RFC2732-style. */
+       
     if(((conn->protocol&PROT_HTTPS) && (conn->remote_port == PORT_HTTPS)) ||
        (!(conn->protocol&PROT_HTTPS) && (conn->remote_port == PORT_HTTP)) )
       /* If (HTTPS on port 443) OR (non-HTTPS on port 80) then don't include
          the port number in the host string */
-      conn->allocptr.host = aprintf("Host: %s\r\n", host);
+      conn->allocptr.host = aprintf("Host: %s%s%s\r\n",
+                                    conn->bits.ipv6_ip?"[":"",
+                                    host,
+                                    conn->bits.ipv6_ip?"]":"");
     else
-      conn->allocptr.host = aprintf("Host: %s:%d\r\n", host,
+      conn->allocptr.host = aprintf("Host: %s%s%s:%d\r\n",
+                                    conn->bits.ipv6_ip?"[":"",
+                                    host,
+                                    conn->bits.ipv6_ip?"]":"",
                                     conn->remote_port);
   }
 
index ee4c772..394d3d0 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -2279,8 +2279,10 @@ static CURLcode CreateConnection(struct SessionHandle *data,
   if((1 == sscanf(conn->name, "[%*39[0-9a-fA-F:.]%c", &endbracket)) &&
      (']' == endbracket)) {
     /* this is a RFC2732-style specified IP-address */
+    conn->bits.ipv6_ip = TRUE;
 
     conn->name++; /* pass the starting bracket */ 
+    conn->hostname++;
     tmp = strchr(conn->name, ']');
     *tmp = 0; /* zero terminate */
     tmp++; /* pass the ending bracket */
index 233abce..6d3f9ce 100644 (file)
@@ -210,7 +210,8 @@ struct ConnectBits {
   bool httpproxy;    /* if set, this transfer is done through a http proxy */
   bool user_passwd;    /* do we use user+password for this connection? */
   bool proxy_user_passwd; /* user+password for the proxy? */
-
+  bool ipv6_ip; /* we communicate with a remove site specified with pure IPv6
+                   IP address */
   bool use_range;
   bool rangestringalloc; /* the range string is malloc()'ed */
 };