Commit cac5251a authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Lukasz Czekierda correctly pointed out that curl used a bad Host: header

when talking to a IPv6-server using IPv6 IP address only.
parent 3b825bcb
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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
  /*
+11 −2
Original line number Diff line number Diff line
@@ -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);
  }

+2 −0
Original line number Diff line number Diff line
@@ -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 */
+2 −1
Original line number Diff line number Diff line
@@ -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 */
};