mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
NTLM: re-use existing connection better
If we need an NTLM connection and one already exists, always choose that one.
This commit is contained in:
parent
3b7d31c1ed
commit
5ede86ae51
32
lib/url.c
32
lib/url.c
@ -2928,10 +2928,14 @@ ConnectionExists(struct SessionHandle *data,
|
||||
{
|
||||
long i;
|
||||
struct connectdata *check;
|
||||
struct connectdata *chosen = 0;
|
||||
bool canPipeline = IsPipeliningPossible(data, needle);
|
||||
bool wantNTLM = (data->state.authhost.want==CURLAUTH_NTLM) ||
|
||||
(data->state.authhost.want==CURLAUTH_NTLM_WB);
|
||||
|
||||
for(i=0; i< data->state.connc->num; i++) {
|
||||
bool match = FALSE;
|
||||
bool credentialsMatch = FALSE;
|
||||
size_t pipeLen = 0;
|
||||
/*
|
||||
* Note that if we use a HTTP proxy, we check connections to that
|
||||
@ -3102,9 +3106,7 @@ ConnectionExists(struct SessionHandle *data,
|
||||
}
|
||||
}
|
||||
if((needle->handler->protocol & CURLPROTO_FTP) ||
|
||||
((needle->handler->protocol & CURLPROTO_HTTP) &&
|
||||
((data->state.authhost.want==CURLAUTH_NTLM) ||
|
||||
(data->state.authhost.want==CURLAUTH_NTLM_WB)))) {
|
||||
((needle->handler->protocol & CURLPROTO_HTTP) && wantNTLM)) {
|
||||
/* This is FTP or HTTP+NTLM, verify that we're using the same name
|
||||
and password as well */
|
||||
if(!strequal(needle->user, check->user) ||
|
||||
@ -3112,6 +3114,7 @@ ConnectionExists(struct SessionHandle *data,
|
||||
/* one of them was different */
|
||||
continue;
|
||||
}
|
||||
credentialsMatch = TRUE;
|
||||
}
|
||||
match = TRUE;
|
||||
}
|
||||
@ -3129,14 +3132,29 @@ ConnectionExists(struct SessionHandle *data,
|
||||
}
|
||||
|
||||
if(match) {
|
||||
check->inuse = TRUE; /* mark this as being in use so that no other
|
||||
handle in a multi stack may nick it */
|
||||
chosen = check;
|
||||
|
||||
*usethis = check;
|
||||
return TRUE; /* yes, we found one to use! */
|
||||
/* If we are not looking for an NTLM connection, we can choose this one
|
||||
immediately. */
|
||||
if(!wantNTLM)
|
||||
break;
|
||||
|
||||
/* Otherwise, check if this is already authenticating with the right
|
||||
credentials. If not, keep looking so that we can reuse NTLM
|
||||
connections if possible. (Especially we must reuse the same
|
||||
connection if partway through a handshake!) */
|
||||
if(credentialsMatch && chosen->ntlm.state != NTLMSTATE_NONE)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(chosen) {
|
||||
chosen->inuse = TRUE; /* mark this as being in use so that no other
|
||||
handle in a multi stack may nick it */
|
||||
*usethis = chosen;
|
||||
return TRUE; /* yes, we found one to use! */
|
||||
}
|
||||
|
||||
return FALSE; /* no matching connecting exists */
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user