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

ip_version: moved to connection struct

The IP version choice was previously only in the UserDefined struct
within the SessionHandle, but since we sometimes alter that option
during a request we need to have it on a per-connection basis.

I also moved more "init conn" code into the allocate_conn() function
which is designed for that purpose more or less.
This commit is contained in:
Daniel Stenberg 2010-11-11 14:51:39 +01:00
parent fec5f03e22
commit a1f32ffee5
9 changed files with 89 additions and 80 deletions

View File

@ -310,20 +310,20 @@ static CURLcode bindlocal(struct connectdata *conn,
* of the connection. The resolve functions should really be changed * of the connection. The resolve functions should really be changed
* to take a type parameter instead. * to take a type parameter instead.
*/ */
long ipver = data->set.ip_version; long ipver = conn->ip_version;
int rc; int rc;
if (af == AF_INET) if (af == AF_INET)
data->set.ip_version = CURL_IPRESOLVE_V4; conn->ip_version = CURL_IPRESOLVE_V4;
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
else if (af == AF_INET6) else if (af == AF_INET6)
data->set.ip_version = CURL_IPRESOLVE_V6; conn->ip_version = CURL_IPRESOLVE_V6;
#endif #endif
rc = Curl_resolv(conn, dev, 0, &h); rc = Curl_resolv(conn, dev, 0, &h);
if(rc == CURLRESOLV_PENDING) if(rc == CURLRESOLV_PENDING)
(void)Curl_wait_for_resolv(conn, &h); (void)Curl_wait_for_resolv(conn, &h);
data->set.ip_version = ipver; conn->ip_version = ipver;
if(h) { if(h) {
/* convert the resolved address, sizeof myhost >= INET_ADDRSTRLEN */ /* convert the resolved address, sizeof myhost >= INET_ADDRSTRLEN */

View File

@ -378,7 +378,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
return Curl_ip2addr(AF_INET6, &in6, hostname, port); return Curl_ip2addr(AF_INET6, &in6, hostname, port);
} }
switch(data->set.ip_version) { switch(conn->ip_version) {
default: default:
#if ARES_VERSION >= 0x010601 #if ARES_VERSION >= 0x010601
family = PF_UNSPEC; /* supported by c-ares since 1.6.1, so for older family = PF_UNSPEC; /* supported by c-ares since 1.6.1, so for older

View File

@ -444,7 +444,7 @@ int Curl_resolv(struct connectdata *conn,
/* Check what IP specifics the app has requested and if we can provide it. /* Check what IP specifics the app has requested and if we can provide it.
* If not, bail out. */ * If not, bail out. */
if(!Curl_ipvalid(data)) if(!Curl_ipvalid(conn))
return CURLRESOLV_ERROR; return CURLRESOLV_ERROR;
/* If Curl_getaddrinfo() returns NULL, 'respwait' might be set to a /* If Curl_getaddrinfo() returns NULL, 'respwait' might be set to a

View File

@ -111,7 +111,7 @@ int Curl_resolv_timeout(struct connectdata *conn, const char *hostname,
* Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've
* been set and returns TRUE if they are OK. * been set and returns TRUE if they are OK.
*/ */
bool Curl_ipvalid(struct SessionHandle *data); bool Curl_ipvalid(struct connectdata *conn);
/* /*
* Curl_getaddrinfo() is the generic low-level name resolve API within this * Curl_getaddrinfo() is the generic low-level name resolve API within this

View File

@ -77,9 +77,9 @@
* Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've
* been set and returns TRUE if they are OK. * been set and returns TRUE if they are OK.
*/ */
bool Curl_ipvalid(struct SessionHandle *data) bool Curl_ipvalid(struct connectdata *conn)
{ {
if(data->set.ip_version == CURL_IPRESOLVE_V6) if(conn->ip_version == CURL_IPRESOLVE_V6)
/* an ipv6 address was requested and we can't get/use one */ /* an ipv6 address was requested and we can't get/use one */
return FALSE; return FALSE;

View File

@ -112,9 +112,9 @@ int curl_dogetnameinfo(GETNAMEINFO_QUAL_ARG1 GETNAMEINFO_TYPE_ARG1 sa,
* Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've
* been set and returns TRUE if they are OK. * been set and returns TRUE if they are OK.
*/ */
bool Curl_ipvalid(struct SessionHandle *data) bool Curl_ipvalid(struct connectdata *conn)
{ {
if(data->set.ip_version == CURL_IPRESOLVE_V6) { if(conn->ip_version == CURL_IPRESOLVE_V6) {
/* see if we have an IPv6 stack */ /* see if we have an IPv6 stack */
curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0); curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
if(s == CURL_SOCKET_BAD) if(s == CURL_SOCKET_BAD)
@ -174,7 +174,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
/* /*
* Check if a limited name resolve has been requested. * Check if a limited name resolve has been requested.
*/ */
switch(data->set.ip_version) { switch(conn->ip_version) {
case CURL_IPRESOLVE_V4: case CURL_IPRESOLVE_V4:
pf = PF_INET; pf = PF_INET;
break; break;

View File

@ -518,7 +518,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
/* /*
* Check if a limited name resolve has been requested. * Check if a limited name resolve has been requested.
*/ */
switch(data->set.ip_version) { switch(conn->ip_version) {
case CURL_IPRESOLVE_V4: case CURL_IPRESOLVE_V4:
pf = PF_INET; pf = PF_INET;
break; break;

137
lib/url.c
View File

@ -2196,7 +2196,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
break; break;
case CURLOPT_IPRESOLVE: case CURLOPT_IPRESOLVE:
data->set.ip_version = va_arg(param, long); data->set.ipver = va_arg(param, long);
break; break;
case CURLOPT_MAXFILESIZE_LARGE: case CURLOPT_MAXFILESIZE_LARGE:
@ -3455,14 +3455,19 @@ static void fix_hostname(struct SessionHandle *data,
#endif #endif
} }
static void llist_dtor(void *user, void *element)
{
(void)user;
(void)element;
/* Do nothing */
}
/* /*
* Allocate and initialize a new connectdata object. * Allocate and initialize a new connectdata object.
*/ */
static struct connectdata *allocate_conn(void) static struct connectdata *allocate_conn(struct SessionHandle *data)
{ {
struct connectdata *conn; struct connectdata *conn = calloc(1, sizeof(struct connectdata));
conn = calloc(1, sizeof(struct connectdata));
if(!conn) if(!conn)
return NULL; return NULL;
@ -3485,7 +3490,66 @@ static struct connectdata *allocate_conn(void)
/* Store creation time to help future close decision making */ /* Store creation time to help future close decision making */
conn->created = Curl_tvnow(); conn->created = Curl_tvnow();
conn->data = data; /* Setup the association between this connection
and the SessionHandle */
conn->proxytype = data->set.proxytype; /* type */
#ifdef CURL_DISABLE_PROXY
conn->bits.proxy = FALSE;
conn->bits.httpproxy = FALSE;
conn->bits.proxy_user_passwd = FALSE;
conn->bits.tunnel_proxy = FALSE;
#else /* CURL_DISABLE_PROXY */
conn->bits.proxy = (bool)(data->set.str[STRING_PROXY] &&
*data->set.str[STRING_PROXY]);
conn->bits.httpproxy = (bool)(conn->bits.proxy &&
(conn->proxytype == CURLPROXY_HTTP ||
conn->proxytype == CURLPROXY_HTTP_1_0));
conn->bits.proxy_user_passwd =
(bool)(NULL != data->set.str[STRING_PROXYUSERNAME]);
conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
#endif /* CURL_DISABLE_PROXY */
conn->bits.user_passwd = (bool)(NULL != data->set.str[STRING_USERNAME]);
conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
conn->verifypeer = data->set.ssl.verifypeer;
conn->verifyhost = data->set.ssl.verifyhost;
conn->ip_version = data->set.ipver;
if(data->multi && Curl_multi_canPipeline(data->multi) &&
!conn->master_buffer) {
/* Allocate master_buffer to be used for pipelining */
conn->master_buffer = calloc(BUFSIZE, sizeof (char));
if(!conn->master_buffer)
goto error;
}
/* Initialize the pipeline lists */
conn->send_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
conn->recv_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
conn->pend_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
conn->done_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
if(!conn->send_pipe || !conn->recv_pipe || !conn->pend_pipe ||
!conn->done_pipe)
goto error;
return conn; return conn;
error:
Curl_llist_destroy(conn->send_pipe, NULL);
Curl_llist_destroy(conn->recv_pipe, NULL);
Curl_llist_destroy(conn->pend_pipe, NULL);
Curl_llist_destroy(conn->done_pipe, NULL);
Curl_safefree(conn->master_buffer);
Curl_safefree(conn);
return NULL;
} }
static CURLcode findprotocol(struct SessionHandle *data, static CURLcode findprotocol(struct SessionHandle *data,
@ -3751,13 +3815,6 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
return findprotocol(data, conn, protop); return findprotocol(data, conn, protop);
} }
static void llist_dtor(void *user, void *element)
{
(void)user;
(void)element;
/* Do nothing */
}
/* /*
* If we're doing a resumed transfer, we need to setup our stuff * If we're doing a resumed transfer, we need to setup our stuff
* properly. * properly.
@ -4595,66 +4652,16 @@ static CURLcode create_conn(struct SessionHandle *data,
parts for checking against the already present connections. In order parts for checking against the already present connections. In order
to not have to modify everything at once, we allocate a temporary to not have to modify everything at once, we allocate a temporary
connection data struct and fill in for comparison purposes. */ connection data struct and fill in for comparison purposes. */
conn = allocate_conn(data);
conn = allocate_conn(); if(!conn)
return CURLE_OUT_OF_MEMORY;
/* We must set the return variable as soon as possible, so that our /* We must set the return variable as soon as possible, so that our
parent can cleanup any possible allocs we may have done before parent can cleanup any possible allocs we may have done before
any failure */ any failure */
*in_connect = conn; *in_connect = conn;
if(!conn)
return CURLE_OUT_OF_MEMORY;
conn->data = data; /* Setup the association between this connection
and the SessionHandle */
conn->proxytype = data->set.proxytype; /* type */
#ifdef CURL_DISABLE_PROXY
conn->bits.proxy = FALSE;
conn->bits.httpproxy = FALSE;
conn->bits.proxy_user_passwd = FALSE;
conn->bits.tunnel_proxy = FALSE;
#else /* CURL_DISABLE_PROXY */
conn->bits.proxy = (bool)(data->set.str[STRING_PROXY] &&
*data->set.str[STRING_PROXY]);
conn->bits.httpproxy = (bool)(conn->bits.proxy &&
(conn->proxytype == CURLPROXY_HTTP ||
conn->proxytype == CURLPROXY_HTTP_1_0));
conn->bits.proxy_user_passwd =
(bool)(NULL != data->set.str[STRING_PROXYUSERNAME]);
conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
#endif /* CURL_DISABLE_PROXY */
conn->bits.user_passwd = (bool)(NULL != data->set.str[STRING_USERNAME]);
conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
conn->verifypeer = data->set.ssl.verifypeer;
conn->verifyhost = data->set.ssl.verifyhost;
if(data->multi && Curl_multi_canPipeline(data->multi) &&
!conn->master_buffer) {
/* Allocate master_buffer to be used for pipelining */
conn->master_buffer = calloc(BUFSIZE, sizeof (char));
if(!conn->master_buffer)
return CURLE_OUT_OF_MEMORY;
}
/* Initialize the pipeline lists */
conn->send_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
conn->recv_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
conn->pend_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
conn->done_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
if(!conn->send_pipe || !conn->recv_pipe || !conn->pend_pipe ||
!conn->done_pipe)
return CURLE_OUT_OF_MEMORY;
/* This initing continues below, see the comment "Continue connectdata /* This initing continues below, see the comment "Continue connectdata
* initialization here" */ * initialization here" */

View File

@ -779,6 +779,8 @@ struct connectdata {
const struct Curl_handler * handler; /* Connection's protocol handler. */ const struct Curl_handler * handler; /* Connection's protocol handler. */
long ip_version; /* copied from the SessionHandle at creation time */
/**** curl_get() phase fields */ /**** curl_get() phase fields */
curl_socket_t sockfd; /* socket to read from or CURL_SOCKET_BAD */ curl_socket_t sockfd; /* socket to read from or CURL_SOCKET_BAD */
@ -1355,8 +1357,8 @@ struct UserDefined {
struct curl_slist *http200aliases; /* linked list of aliases for http200 */ struct curl_slist *http200aliases; /* linked list of aliases for http200 */
long ip_version; /* the CURL_IPRESOLVE_* defines in the public header file long ipver; /* the CURL_IPRESOLVE_* defines in the public header file
0 - whatever, 1 - v2, 2 - v6 */ 0 - whatever, 1 - v2, 2 - v6 */
curl_off_t max_filesize; /* Maximum file size to download */ curl_off_t max_filesize; /* Maximum file size to download */