diff options
author | Michael Kaufmann <mail@michael-kaufmann.ch> | 2016-11-30 11:51:29 +0100 |
---|---|---|
committer | Michael Kaufmann <mail@michael-kaufmann.ch> | 2016-11-30 12:02:44 +0100 |
commit | b34ea05d9d856c421be3a0f70ab84c6ad28e3f37 (patch) | |
tree | accab68e355bc0c217000f7a2abdcfa9ed8e80e1 | |
parent | 12d6794b103623e432beda441a6d3c56993d948b (diff) |
CURLOPT_CONNECT_TO: Skip non-matching "connect-to" entries properly
If a port number in a "connect-to" entry does not match, skip this
entry instead of connecting to port 0.
If a port number in a "connect-to" entry matches, use this entry
and look no further.
Reported-by: Jay Satiro
Assisted-by: Jay Satiro, Daniel Stenberg
Closes #1148
-rw-r--r-- | lib/url.c | 10 | ||||
-rw-r--r-- | tests/data/Makefile.inc | 2 | ||||
-rw-r--r-- | tests/data/test2053 | 56 | ||||
-rw-r--r-- | tests/data/test2054 | 64 |
4 files changed, 128 insertions, 4 deletions
@@ -5677,6 +5677,9 @@ static CURLcode parse_connect_to_string(struct Curl_easy *data, int host_match = FALSE; int port_match = FALSE; + *host_result = NULL; + *port_result = -1; + if(*ptr == ':') { /* an empty hostname always matches */ host_match = TRUE; @@ -5739,9 +5742,9 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data, { CURLcode result = CURLE_OK; char *host = NULL; - int port = 0; + int port = -1; - while(conn_to_host && !host) { + while(conn_to_host && !host && port == -1) { result = parse_connect_to_string(data, conn, conn_to_host->data, &host, &port); if(result) @@ -5760,7 +5763,7 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data, else { /* no "connect to host" */ conn->bits.conn_to_host = FALSE; - free(host); + Curl_safefree(host); } if(port >= 0) { @@ -5771,6 +5774,7 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data, else { /* no "connect to port" */ conn->bits.conn_to_port = FALSE; + port = -1; } conn_to_host = conn_to_host->next; diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index a2c4fd25f..370c3dd45 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -175,4 +175,4 @@ test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \ test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \ test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \ test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \ -test2048 test2049 test2050 test2051 test2052 +test2048 test2049 test2050 test2051 test2052 test2053 test2054 diff --git a/tests/data/test2053 b/tests/data/test2053 new file mode 100644 index 000000000..98e78454e --- /dev/null +++ b/tests/data/test2053 @@ -0,0 +1,56 @@ +<testcase> +<info> +<keywords> +HTTP +HTTP GET +CURLOPT_CONNECT_TO +</keywords> +</info> + +# +# Server-side +<reply> +<data> +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 3 +Content-Type: text/plain + +OK +</data> +</reply> + +# +# Client-side +<client> +<server> +http +</server> + <name> +Connect to specific host with IP addresses + </name> + + <command> +http://10.0.0.1:8081/2053 --connect-to 10.0.0.1:8081:%HOSTIP:%HTTPPORT --next http://[fc00::1]:8082/2053 --connect-to [fc00::1]:8082:%HOSTIP:%HTTPPORT +</command> +</client> + +# +# Verify data after the test has been "shot" +<verify> +<strip> +^User-Agent:.* +</strip> +<protocol> +GET /2053 HTTP/1.1
+Host: 10.0.0.1:8081
+Accept: */*
+
+GET /2053 HTTP/1.1
+Host: [fc00::1]:8082
+Accept: */*
+
+</protocol> + +</verify> +</testcase> diff --git a/tests/data/test2054 b/tests/data/test2054 new file mode 100644 index 000000000..2a0b54ebc --- /dev/null +++ b/tests/data/test2054 @@ -0,0 +1,64 @@ +<testcase> +<info> +<keywords> +HTTP +HTTP GET +CURLOPT_CONNECT_TO +</keywords> +</info> + +# +# Server-side +<reply> +<data> +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 3 +Content-Type: text/plain + +OK +</data> +</reply> + +# +# Client-side +<client> +<server> +http +</server> + <name> +Connect to specific host: use the first "connect-to" string that matches + </name> + + <command> +http://%HOSTIP:%HTTPPORT/2054 --connect-to foo::bar: --connect-to :123::456 --next http://www.example.com:%HTTPPORT/2054 --connect-to www.example.com::%HOSTIP: --connect-to www.example.com::foo: --next http://%HOSTIP:8083/2054 --connect-to :8083::%HTTPPORT --connect-to :8083::123 --next http://www.example.com:8084/2054 --connect-to www.example.com:8084:%HOSTIP:%HTTPPORT --connect-to www.example.com:8084:foo:123 +</command> +</client> + +# +# Verify data after the test has been "shot" +<verify> +<strip> +^User-Agent:.* +</strip> +<protocol> +GET /2054 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /2054 HTTP/1.1
+Host: www.example.com:%HTTPPORT
+Accept: */*
+
+GET /2054 HTTP/1.1
+Host: %HOSTIP:8083
+Accept: */*
+
+GET /2054 HTTP/1.1
+Host: www.example.com:8084
+Accept: */*
+
+</protocol> + +</verify> +</testcase> |