]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
CONNECT: fix ipv6 address in the Request-Line
authorDaniel Stenberg <daniel@haxx.se>
Fri, 24 Feb 2012 22:33:14 +0000 (23:33 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 24 Feb 2012 22:33:14 +0000 (23:33 +0100)
Commit 466150bc64d fixed the Host: header with CONNECT, but I then
forgot the preceeding request-line. Now this too uses [brackets]
properly if a ipv6 numerical address was given.

Bug: http://curl.haxx.se/bug/view.cgi?id=3493129
Reported by: "Blacat"

lib/http_proxy.c

index 1c2aa59c817778a8919b7a78f296423de2f184bb..b12d370113e0871aaed84504b3ff492aec49b936 100644 (file)
@@ -124,11 +124,15 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
         const char *useragent="";
         const char *http = (conn->proxytype == CURLPROXY_HTTP_1_0) ?
           "1.0" : "1.1";
+        char *hostheader= /* host:port with IPv6 support */
+          aprintf("%s%s%s:%hu", conn->bits.ipv6_ip?"[":"",
+                  hostname, conn->bits.ipv6_ip?"]":"",
+                  remote_port);
+        if(!hostheader)
+          return CURLE_OUT_OF_MEMORY;
 
         if(!Curl_checkheaders(data, "Host:")) {
-          host = aprintf("Host: %s%s%s:%hu\r\n", conn->bits.ipv6_ip?"[":"",
-                         hostname, conn->bits.ipv6_ip?"]":"",
-                         remote_port);
+          host = aprintf("Host: %s\r\n", hostheader);
           if(!host) {
             free(req_buffer);
             return CURLE_OUT_OF_MEMORY;
@@ -141,24 +145,24 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
            data->set.str[STRING_USERAGENT])
           useragent = conn->allocptr.uagent;
 
-        /* Send the connect request to the proxy */
-        /* BLOCKING */
         result =
           Curl_add_bufferf(req_buffer,
-                      "CONNECT %s:%hu HTTP/%s\r\n"
-                      "%s"  /* Host: */
-                      "%s"  /* Proxy-Authorization */
-                      "%s"  /* User-Agent */
-                      "%s", /* Proxy-Connection */
-                      hostname, remote_port, http,
-                      host,
-                      conn->allocptr.proxyuserpwd?
-                      conn->allocptr.proxyuserpwd:"",
-                      useragent,
-                      proxyconn);
+                           "CONNECT %s HTTP/%s\r\n"
+                           "%s"  /* Host: */
+                           "%s"  /* Proxy-Authorization */
+                           "%s"  /* User-Agent */
+                           "%s", /* Proxy-Connection */
+                           hostheader,
+                           http,
+                           host,
+                           conn->allocptr.proxyuserpwd?
+                           conn->allocptr.proxyuserpwd:"",
+                           useragent,
+                           proxyconn);
 
         if(host && *host)
           free(host);
+        free(hostheader);
 
         if(CURLE_OK == result)
           result = Curl_add_custom_headers(conn, req_buffer);
@@ -168,7 +172,8 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
           result = Curl_add_bufferf(req_buffer, "\r\n");
 
         if(CURLE_OK == result) {
-          /* Now send off the request */
+          /* Send the connect request to the proxy */
+          /* BLOCKING */
           result =
             Curl_add_buffer_send(req_buffer, conn,
                                  &data->info.request_size, 0, sockindex);