diff options
author | Joe Mason <jmason@rim.com> | 2012-08-20 17:00:40 -0400 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2012-08-31 22:54:23 +0200 |
commit | 5ede86ae51b8f71be35152584815f80dbd5a327a (patch) | |
tree | a4fb7292af33ff6602ed8df522cd0b63bb2200b9 | |
parent | 3b7d31c1eddc52431d8944aae6c7ab8aa7e29570 (diff) |
NTLM: re-use existing connection better
If we need an NTLM connection and one already exists, always choose that
one.
-rw-r--r-- | lib/url.c | 32 |
1 files changed, 25 insertions, 7 deletions
@@ -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 */ } |