]> granicus.if.org Git - curl/commitdiff
host: get the custom Host: name more genericly
authorDaniel Stenberg <daniel@haxx.se>
Thu, 4 Nov 2010 13:58:15 +0000 (14:58 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 4 Nov 2010 13:58:15 +0000 (14:58 +0100)
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
lib/ssluse.c
lib/url.c
lib/urldata.h

index ed0730c0a1d8168ec19e72956bea19383c060d71..0804ce050cc0adac9b8779f42c720394148e8cc7 100644 (file)
@@ -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);
     }
index fce8680e8d4bb751c3a444f60ef208473d6f823e..01e688c7dbc0d4dcc9b26a8dc84b1ac96d52181c 100644 (file)
@@ -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! */
index b715e998fc1434eaa3807da0759e46e115887fd4..ef02b4f31f810e46935c393c157b0df575105923 100644 (file)
--- 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 */
index 4d6059152adc0e59817a8d5ce85491f93d450cb5..7b63b496b3552fb5132f852118c5e965c5e9350a 100644 (file)
@@ -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;