if (request == null)
return null;
- int hashcode = request.Address.GetHashCode () ^ credentials.GetHashCode ();
+ DigestSession currDS = new DigestSession();
+ if (!currDS.Parse (challenge))
+ return null;
+
+ int hashcode = request.Address.GetHashCode () ^ credentials.GetHashCode () ^ currDS.Nonce.GetHashCode ();
DigestSession ds = (DigestSession) Cache [hashcode];
bool addDS = (ds == null);
if (addDS)
- ds = new DigestSession ();
-
- if (!ds.Parse (challenge))
+ ds = currDS;
+ else if (!ds.Parse (challenge))
return null;
if (addDS)
bool needs_reset = false;
NetworkCredential cnc_cred = cnc.NtlmCredential;
- NetworkCredential req_cred = request.Credentials.GetCredential (request.RequestUri, "NTLM");
- if (cnc_cred.Domain != req_cred.Domain || cnc_cred.UserName != req_cred.UserName ||
+
+ bool isProxy = (request.Proxy != null && !request.Proxy.IsBypassed (request.RequestUri));
+ ICredentials req_icreds = (!isProxy) ? request.Credentials : request.Proxy.Credentials;
+ NetworkCredential req_cred = (req_icreds != null) ? req_icreds.GetCredential (request.RequestUri, "NTLM") : null;
+
+ if (cnc_cred == null || req_cred == null ||
+ cnc_cred.Domain != req_cred.Domain || cnc_cred.UserName != req_cred.UserName ||
cnc_cred.Password != req_cred.Password) {
needs_reset = true;
}