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:
parent
3b825bcbfb
commit
cac5251a98
@ -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
|
||||||
/*
|
/*
|
||||||
|
13
lib/http.c
13
lib/http.c
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user