1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 16:18:48 -05:00

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

when talking to a IPv6-server using IPv6 IP address only.
This commit is contained in:
Daniel Stenberg 2002-09-11 10:32:37 +00:00
parent 3b825bcbfb
commit cac5251a98
4 changed files with 20 additions and 4 deletions

View File

@ -463,7 +463,11 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
} }
hostname = data->change.proxy?conn->proxyhost:conn->hostname; 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 #ifdef ENABLE_IPV6
/* /*

View File

@ -581,13 +581,22 @@ CURLcode Curl_http(struct connectdata *conn)
if(conn->allocptr.host) if(conn->allocptr.host)
free(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)) || if(((conn->protocol&PROT_HTTPS) && (conn->remote_port == PORT_HTTPS)) ||
(!(conn->protocol&PROT_HTTPS) && (conn->remote_port == PORT_HTTP)) ) (!(conn->protocol&PROT_HTTPS) && (conn->remote_port == PORT_HTTP)) )
/* If (HTTPS on port 443) OR (non-HTTPS on port 80) then don't include /* If (HTTPS on port 443) OR (non-HTTPS on port 80) then don't include
the port number in the host string */ 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 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); conn->remote_port);
} }

View File

@ -2279,8 +2279,10 @@ static CURLcode CreateConnection(struct SessionHandle *data,
if((1 == sscanf(conn->name, "[%*39[0-9a-fA-F:.]%c", &endbracket)) && if((1 == sscanf(conn->name, "[%*39[0-9a-fA-F:.]%c", &endbracket)) &&
(']' == endbracket)) { (']' == endbracket)) {
/* this is a RFC2732-style specified IP-address */ /* this is a RFC2732-style specified IP-address */
conn->bits.ipv6_ip = TRUE;
conn->name++; /* pass the starting bracket */ conn->name++; /* pass the starting bracket */
conn->hostname++;
tmp = strchr(conn->name, ']'); tmp = strchr(conn->name, ']');
*tmp = 0; /* zero terminate */ *tmp = 0; /* zero terminate */
tmp++; /* pass the ending bracket */ tmp++; /* pass the ending bracket */

View File

@ -210,7 +210,8 @@ struct ConnectBits {
bool httpproxy; /* if set, this transfer is done through a http proxy */ bool httpproxy; /* if set, this transfer is done through a http proxy */
bool user_passwd; /* do we use user+password for this connection? */ bool user_passwd; /* do we use user+password for this connection? */
bool proxy_user_passwd; /* user+password for the proxy? */ 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 use_range;
bool rangestringalloc; /* the range string is malloc()'ed */ bool rangestringalloc; /* the range string is malloc()'ed */
}; };