From afecd1aa13b4f40c54d195514af113715b0e0f9f Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 4 Nov 2010 14:58:15 +0100 Subject: [PATCH] host: get the custom Host: name more genericly When given a custom host name in a Host: header, we can use it for several different purposes other than just cookies, so we rename it and use it for SSL SNI etc. --- lib/http.c | 25 ++++++++++++------------- lib/ssluse.c | 20 ++++++-------------- lib/url.c | 2 +- lib/urldata.h | 2 +- 4 files changed, 20 insertions(+), 29 deletions(-) diff --git a/lib/http.c b/lib/http.c index ed0730c0a..0804ce050 100644 --- a/lib/http.c +++ b/lib/http.c @@ -2254,26 +2254,25 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) ptr = Curl_checkheaders(data, "Host:"); if(ptr && (!data->state.this_is_a_follow || Curl_raw_equal(data->state.first_host, conn->host.name))) { -#if !defined(CURL_DISABLE_COOKIES) + /* If we have a given custom Host: header, we extract the host name in order to possibly use it for cookie reasons later on. We only allow the custom Host: header if this is NOT a redirect, as setting Host: in the redirected request is being out on thin ice. Except if the host name is the same as the first one! */ - char *cookiehost = Curl_copy_header_value(ptr); - if (!cookiehost) + char *chost = Curl_copy_header_value(ptr); + if (!chost) return CURLE_OUT_OF_MEMORY; - if (!*cookiehost) + if (!*chost) /* ignore empty data */ - free(cookiehost); + free(chost); else { - char *colon = strchr(cookiehost, ':'); + char *colon = strchr(chost, ':'); if (colon) *colon = 0; /* The host must not include an embedded port number */ - Curl_safefree(conn->allocptr.cookiehost); - conn->allocptr.cookiehost = cookiehost; + Curl_safefree(conn->allocptr.customhost); + conn->allocptr.customhost = chost; } -#endif conn->allocptr.host = NULL; } @@ -2597,8 +2596,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(data->cookies) { Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); co = Curl_cookie_getlist(data->cookies, - conn->allocptr.cookiehost? - conn->allocptr.cookiehost:host, + conn->allocptr.customhost? + conn->allocptr.customhost:host, data->state.path, (bool)(conn->protocol&PROT_HTTPS?TRUE:FALSE)); Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); @@ -3689,8 +3688,8 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, data->cookies, TRUE, k->p+11, /* If there is a custom-set Host: name, use it here, or else use real peer host name. */ - conn->allocptr.cookiehost? - conn->allocptr.cookiehost:conn->host.name, + conn->allocptr.customhost? + conn->allocptr.customhost:conn->host.name, data->state.path); Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); } diff --git a/lib/ssluse.c b/lib/ssluse.c index fce8680e8..01e688c7d 100644 --- a/lib/ssluse.c +++ b/lib/ssluse.c @@ -1430,7 +1430,6 @@ ossl_connect_step1(struct connectdata *conn, struct ssl_connect_data *connssl = &conn->ssl[sockindex]; #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME const char *hostname; - bool hostname_static; bool sni; #ifdef ENABLE_IPV6 struct in6_addr addr; @@ -1643,18 +1642,13 @@ ossl_connect_step1(struct connectdata *conn, connssl->server_cert = 0x0; #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - hostname = Curl_checkheaders(data, "Host:"); - if(hostname && (!data->state.this_is_a_follow || - Curl_raw_equal(data->state.first_host, conn->host.name))) { - hostname_static = FALSE; - hostname = Curl_copy_header_value(hostname); - if(!hostname) { - return CURLE_OUT_OF_MEMORY; - } - } else { - hostname_static = TRUE; + if((!data->state.this_is_a_follow || + Curl_raw_equal(data->state.first_host, conn->host.name)) && + conn->allocptr.customhost) + hostname = conn->allocptr.customhost; + else hostname = conn->host.name; - } + if ((0 == Curl_inet_pton(AF_INET, hostname, &addr)) && #ifdef ENABLE_IPV6 (0 == Curl_inet_pton(AF_INET6, hostname, &addr)) && @@ -1663,8 +1657,6 @@ ossl_connect_step1(struct connectdata *conn, !SSL_set_tlsext_host_name(connssl->handle, hostname)) infof(data, "WARNING: failed to configure server name indication (SNI) " "TLS extension\n"); - if(!hostname_static) - free((char *) hostname); #endif /* Check if there's a cached ID we can/should use here! */ diff --git a/lib/url.c b/lib/url.c index b715e998f..ef02b4f31 100644 --- a/lib/url.c +++ b/lib/url.c @@ -2534,7 +2534,7 @@ static void conn_free(struct connectdata *conn) Curl_safefree(conn->allocptr.rangeline); Curl_safefree(conn->allocptr.ref); Curl_safefree(conn->allocptr.host); - Curl_safefree(conn->allocptr.cookiehost); + Curl_safefree(conn->allocptr.customhost); Curl_safefree(conn->allocptr.rtsp_transport); Curl_safefree(conn->trailer); Curl_safefree(conn->host.rawalloc); /* host name buffer */ diff --git a/lib/urldata.h b/lib/urldata.h index 4d6059152..7b63b496b 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -796,7 +796,7 @@ struct connectdata { char *rangeline; /* free later if not NULL! */ char *ref; /* free later if not NULL! */ char *host; /* free later if not NULL */ - char *cookiehost; /* free later if not NULL */ + char *customhost; /* free later if not NULL */ char *rtsp_transport; /* free later if not NULL */ } allocptr;