Unverified Commit 715f1f53 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

resolve: allow IP address within [] brackets

... so that IPv6 addresses can be passed like they can for connect-to
and how they're used in URLs.

Added test 1324 to verify
Reported-by: Alex Malinovich

Fixes #2087
Closes #2091
parent 6ce98456
Loading
Loading
Loading
Loading
+2 −0
Changes for docs/cmdline-opts/resolve.d: 2 added lines, 0 removed lines.
Original line number Original line Diff line number Diff line
@@ -14,4 +14,6 @@ different ports.
The provided address set by this option will be used even if --ipv4 or --ipv6
The provided address set by this option will be used even if --ipv4 or --ipv6
is set to make curl use another IP version.
is set to make curl use another IP version.


Support for providing the IP address within [brackets] was added in 7.57.0.

This option can be used many times to add many host names to resolve.
This option can be used many times to add many host names to resolve.
+3 −1
Changes for docs/libcurl/opts/CURLOPT_RESOLVE.3: 3 added lines, 1 removed line.
Original line number Original line Diff line number Diff line
@@ -5,7 +5,7 @@
.\" *                            | (__| |_| |  _ <| |___
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" *
.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * you should have received as part of this distribution. The terms
@@ -55,6 +55,8 @@ Remove names from the DNS cache again, to stop providing these fake resolves,
by including a string in the linked list that uses the format
by including a string in the linked list that uses the format
\&"-HOST:PORT". The host name must be prefixed with a dash, and the host name
\&"-HOST:PORT". The host name must be prefixed with a dash, and the host name
and port number must exactly match what was already added previously.
and port number must exactly match what was already added previously.

Support for providing the ADDRESS within [brackets] was added in 7.57.0.
.SH DEFAULT
.SH DEFAULT
NULL
NULL
.SH PROTOCOLS
.SH PROTOCOLS
+12 −1
Changes for lib/hostip.c: 12 added lines, 1 removed line.
Original line number Original line Diff line number Diff line
@@ -778,7 +778,6 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
{
{
  struct curl_slist *hostp;
  struct curl_slist *hostp;
  char hostname[256];
  char hostname[256];
  char address[256];
  int port;
  int port;


  for(hostp = data->change.resolve; hostp; hostp = hostp->next) {
  for(hostp = data->change.resolve; hostp; hostp = hostp->next) {
@@ -820,6 +819,8 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
      Curl_addrinfo *addr;
      Curl_addrinfo *addr;
      char *entry_id;
      char *entry_id;
      size_t entry_len;
      size_t entry_len;
      char buffer[256];
      char *address = &buffer[0];


      if(3 != sscanf(hostp->data, "%255[^:]:%d:%255s", hostname, &port,
      if(3 != sscanf(hostp->data, "%255[^:]:%d:%255s", hostname, &port,
                     address)) {
                     address)) {
@@ -828,6 +829,16 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
        continue;
        continue;
      }
      }


      /* allow IP(v6) address within [brackets] */
      if(address[0] == '[') {
        size_t alen = strlen(address);
        if(address[alen-1] != ']')
          /* it needs to also end with ] to be valid */
          continue;
        address[alen-1] = 0; /* zero terminate there */
        address++; /* pass the open bracket */
      }

      addr = Curl_str2addr(address, port);
      addr = Curl_str2addr(address, port);
      if(!addr) {
      if(!addr) {
        infof(data, "Address in '%s' found illegal!\n", hostp->data);
        infof(data, "Address in '%s' found illegal!\n", hostp->data);
+1 −1
Changes for tests/data/Makefile.inc: 1 added line, 1 removed line.
Original line number Original line Diff line number Diff line
@@ -142,7 +142,7 @@ test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
         test1325 test1326 test1327 test1328 test1329 test1330 test1331 \
test1324 test1325 test1326 test1327 test1328 test1329 test1330 test1331 \
test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \
test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \
test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \
test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \
test1348 test1349 test1350 test1351 test1352 test1353 test1354 test1355 \
test1348 test1349 test1350 test1351 test1352 test1353 test1354 test1355 \

tests/data/test1324

0 → 100644
+56 −0
Changes for tests/data/test1324: 56 added lines, 0 removed lines.
Original line number Original line Diff line number Diff line
<testcase>
<info>
<keywords>
HTTP
HTTP GET
--resolve
</keywords>
</info>

#
# Server-side
<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
ETag: "21025-dc7-39462498"
Accept-Ranges: bytes
Content-Length: 6
Connection: close
Content-Type: text/html
Funny-head: yesyes

-foo-
</data>
</reply>

#
# Client-side
<client>
<server>
http-ipv6
</server>
<name>
HTTP with --resolve and [ipv6address]
</name>
<command>
--resolve example.com:%HTTP6PORT:%HOST6IP http://example.com:%HTTP6PORT/1324
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent:.*
</strip>
<protocol>
GET /1324 HTTP/1.1
Host: example.com:%HTTP6PORT
Accept: */*

</protocol>
</verify>
</testcase>