From afecd1aa13b4f40c54d195514af113715b0e0f9f Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
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 ed0730c..0804ce0 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 fce8680..01e688c 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 b715e99..ef02b4f 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 4d60591..7b63b49 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;
 
-- 
1.7.2.3

