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:
		| @@ -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 | ||||
|   /* | ||||
|   | ||||
							
								
								
									
										13
									
								
								lib/http.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								lib/http.c
									
									
									
									
									
								
							| @@ -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); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -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 */ | ||||
|   | ||||
| @@ -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 */ | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Daniel Stenberg
					Daniel Stenberg