1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

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
This commit is contained in:
Michael Kaufmann 2016-11-30 11:51:29 +01:00
parent 12d6794b10
commit b34ea05d9d
4 changed files with 128 additions and 4 deletions

View File

@ -5677,6 +5677,9 @@ static CURLcode parse_connect_to_string(struct Curl_easy *data,
int host_match = FALSE; int host_match = FALSE;
int port_match = FALSE; int port_match = FALSE;
*host_result = NULL;
*port_result = -1;
if(*ptr == ':') { if(*ptr == ':') {
/* an empty hostname always matches */ /* an empty hostname always matches */
host_match = TRUE; host_match = TRUE;
@ -5739,9 +5742,9 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
{ {
CURLcode result = CURLE_OK; CURLcode result = CURLE_OK;
char *host = NULL; 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, result = parse_connect_to_string(data, conn, conn_to_host->data,
&host, &port); &host, &port);
if(result) if(result)
@ -5760,7 +5763,7 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
else { else {
/* no "connect to host" */ /* no "connect to host" */
conn->bits.conn_to_host = FALSE; conn->bits.conn_to_host = FALSE;
free(host); Curl_safefree(host);
} }
if(port >= 0) { if(port >= 0) {
@ -5771,6 +5774,7 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
else { else {
/* no "connect to port" */ /* no "connect to port" */
conn->bits.conn_to_port = FALSE; conn->bits.conn_to_port = FALSE;
port = -1;
} }
conn_to_host = conn_to_host->next; conn_to_host = conn_to_host->next;

View File

@ -175,4 +175,4 @@ test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \ test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \ test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \ test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2048 test2049 test2050 test2051 test2052 test2053 test2054

56
tests/data/test2053 Normal file
View File

@ -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>

64
tests/data/test2054 Normal file
View File

@ -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>