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

- Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL

parser to allow numerical IPv6-addresses to be specified with the scope
  given, as per RFC4007 - with a percent letter that itself needs to be URL
  escaped. For example, for an address of fe80::1234%1 the HTTP URL is:
  "http://[fe80::1234%251]/"
This commit is contained in:
Daniel Stenberg 2008-07-30 21:55:26 +00:00
parent 011e5dd864
commit 5aed78e183
7 changed files with 51 additions and 1 deletions

View File

@ -7,6 +7,12 @@
Changelog Changelog
Daniel Stenberg (30 Jul 2008) Daniel Stenberg (30 Jul 2008)
- Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL
parser to allow numerical IPv6-addresses to be specified with the scope
given, as per RFC4007 - with a percent letter that itself needs to be URL
escaped. For example, for an address of fe80::1234%1 the HTTP URL is:
"http://[fe80::1234%251]/"
- PHP's bug report #43158 (http://bugs.php.net/bug.php?id=43158) identifies a - PHP's bug report #43158 (http://bugs.php.net/bug.php?id=43158) identifies a
true bug in libcurl built with OpenSSL. It made curl_easy_getinfo() more or true bug in libcurl built with OpenSSL. It made curl_easy_getinfo() more or
less always return 0 for CURLINFO_SSL_VERIFYRESULT because the function that less always return 0 for CURLINFO_SSL_VERIFYRESULT because the function that

View File

@ -19,6 +19,7 @@ This release includes the following changes:
o Added CURLINFO_APPCONNECT_TIME o Added CURLINFO_APPCONNECT_TIME
o Added test selection by key word in runtests.pl o Added test selection by key word in runtests.pl
o the curl tool's -w option support the %{ssl_verify_result} variable o the curl tool's -w option support the %{ssl_verify_result} variable
o Added CURLOPT_SCOPE and scope parsing of the URL according to RFC4007
This release includes the following bugfixes: This release includes the following bugfixes:

View File

@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl_easy_setopt 3 "5 Jan 2008" "libcurl 7.19.0" "libcurl Manual" .TH curl_easy_setopt 3 "30 Jul 2008" "libcurl 7.19.0" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_setopt \- set options for a curl easy handle curl_easy_setopt \- set options for a curl easy handle
.SH SYNOPSIS .SH SYNOPSIS
@ -547,6 +547,9 @@ notably telnet or rlogin) small segments may need to be sent
without delay. This is less efficient than sending larger amounts of without delay. This is less efficient than sending larger amounts of
data at a time, and can contribute to congestion on the network if data at a time, and can contribute to congestion on the network if
overdone. overdone.
.IP CURLOPT_ADDRESS_SCOPE
Pass a long specifying the scope_id value to use when connecting to IPv6
link-local or site-local addresses.
.SH NAMES and PASSWORDS OPTIONS (Authentication) .SH NAMES and PASSWORDS OPTIONS (Authentication)
.IP CURLOPT_NETRC .IP CURLOPT_NETRC
This parameter controls the preference of libcurl between using user names and This parameter controls the preference of libcurl between using user names and

View File

@ -1211,6 +1211,9 @@ typedef enum {
/* Issuer certificate */ /* Issuer certificate */
CINIT(ISSUERCERT, OBJECTPOINT, 170), CINIT(ISSUERCERT, OBJECTPOINT, 170),
/* (IPv6) Address scope */
CINIT(ADDRESS_SCOPE, LONG, 171),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;

View File

@ -773,6 +773,13 @@ singleipconnect(struct connectdata *conn,
*connected = FALSE; /* default is not connected */ *connected = FALSE; /* default is not connected */
#ifdef CURLRES_IPV6
if (conn->scope && (addr->family == AF_INET6)) {
struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)&addr->addr;
in6->sin6_scope_id = conn->scope;
}
#endif
/* FIXME: do we have Curl_printable_address-like with struct sockaddr* as /* FIXME: do we have Curl_printable_address-like with struct sockaddr* as
argument? */ argument? */
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX) #if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)

View File

@ -2091,6 +2091,15 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
} }
break; break;
case CURLOPT_ADDRESS_SCOPE:
/*
* We always get longs when passed plain numericals, but for this value we
* know that an unsigned int will always hold the value so we blindly
* typecast to this type
*/
data->set.scope = (unsigned int) va_arg(param, long);
break;
default: default:
/* unknown tag and its companion, just ignore: */ /* unknown tag and its companion, just ignore: */
result = CURLE_FAILED_INIT; /* correct this */ result = CURLE_FAILED_INIT; /* correct this */
@ -3080,6 +3089,24 @@ static CURLcode ParseURLAndFillConnection(struct SessionHandle *data,
path[0] = '/'; path[0] = '/';
} }
if (conn->host.name[0] == '[' && !data->state.this_is_a_follow) {
/* This looks like an IPv6 address literal. See if there is an address
scope. */
char *percent = strstr (conn->host.name, "%25");
if (percent) {
char *endp;
conn->scope = strtoul (percent + 3, &endp, 10);
if (*endp == ']') {
/* The address scope was well formed. Knock it out of the hostname. */
strcpy (percent, "]");
}
}
}
if (data->set.scope)
/* Override any scope that was set above. */
conn->scope = data->set.scope;
/* /*
* So if the URL was A://B/C, * So if the URL was A://B/C,
* conn->protostr is A * conn->protostr is A

View File

@ -903,6 +903,8 @@ struct connectdata {
set. */ set. */
char *ip_addr_str; char *ip_addr_str;
unsigned int scope; /* address scope for IPv6 */
char protostr[16]; /* store the protocol string in this buffer */ char protostr[16]; /* store the protocol string in this buffer */
int socktype; /* SOCK_STREAM or SOCK_DGRAM */ int socktype; /* SOCK_STREAM or SOCK_DGRAM */
@ -1478,6 +1480,7 @@ struct UserDefined {
bool proxy_transfer_mode; /* set transfer mode (;type=<a|i>) when doing FTP bool proxy_transfer_mode; /* set transfer mode (;type=<a|i>) when doing FTP
via an HTTP proxy */ via an HTTP proxy */
char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */ char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
unsigned int scope; /* address scope for IPv6 */
}; };
struct Names { struct Names {