Commit 79b6f4a2 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

CONNECT: fix ipv6 address in the Request-Line

Commit 466150bc 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"
parent 54300072
Loading
Loading
Loading
Loading
+22 −17
Original line number Original line Diff line number Diff line
@@ -124,11 +124,15 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
        const char *useragent="";
        const char *useragent="";
        const char *http = (conn->proxytype == CURLPROXY_HTTP_1_0) ?
        const char *http = (conn->proxytype == CURLPROXY_HTTP_1_0) ?
          "1.0" : "1.1";
          "1.0" : "1.1";

        char *hostheader= /* host:port with IPv6 support */
        if(!Curl_checkheaders(data, "Host:")) {
          aprintf("%s%s%s:%hu", conn->bits.ipv6_ip?"[":"",
          host = aprintf("Host: %s%s%s:%hu\r\n", conn->bits.ipv6_ip?"[":"",
                  hostname, conn->bits.ipv6_ip?"]":"",
                  hostname, conn->bits.ipv6_ip?"]":"",
                  remote_port);
                  remote_port);
        if(!hostheader)
          return CURLE_OUT_OF_MEMORY;

        if(!Curl_checkheaders(data, "Host:")) {
          host = aprintf("Host: %s\r\n", hostheader);
          if(!host) {
          if(!host) {
            free(req_buffer);
            free(req_buffer);
            return CURLE_OUT_OF_MEMORY;
            return CURLE_OUT_OF_MEMORY;
@@ -141,16 +145,15 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
           data->set.str[STRING_USERAGENT])
           data->set.str[STRING_USERAGENT])
          useragent = conn->allocptr.uagent;
          useragent = conn->allocptr.uagent;


        /* Send the connect request to the proxy */
        /* BLOCKING */
        result =
        result =
          Curl_add_bufferf(req_buffer,
          Curl_add_bufferf(req_buffer,
                      "CONNECT %s:%hu HTTP/%s\r\n"
                           "CONNECT %s HTTP/%s\r\n"
                           "%s"  /* Host: */
                           "%s"  /* Host: */
                           "%s"  /* Proxy-Authorization */
                           "%s"  /* Proxy-Authorization */
                           "%s"  /* User-Agent */
                           "%s"  /* User-Agent */
                           "%s", /* Proxy-Connection */
                           "%s", /* Proxy-Connection */
                      hostname, remote_port, http,
                           hostheader,
                           http,
                           host,
                           host,
                           conn->allocptr.proxyuserpwd?
                           conn->allocptr.proxyuserpwd?
                           conn->allocptr.proxyuserpwd:"",
                           conn->allocptr.proxyuserpwd:"",
@@ -159,6 +162,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,


        if(host && *host)
        if(host && *host)
          free(host);
          free(host);
        free(hostheader);


        if(CURLE_OK == result)
        if(CURLE_OK == result)
          result = Curl_add_custom_headers(conn, req_buffer);
          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");
          result = Curl_add_bufferf(req_buffer, "\r\n");


        if(CURLE_OK == result) {
        if(CURLE_OK == result) {
          /* Now send off the request */
          /* Send the connect request to the proxy */
          /* BLOCKING */
          result =
          result =
            Curl_add_buffer_send(req_buffer, conn,
            Curl_add_buffer_send(req_buffer, conn,
                                 &data->info.request_size, 0, sockindex);
                                 &data->info.request_size, 0, sockindex);