// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2003 Ximian, Inc (http://www.ximian.com)
+// Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
//
//
queue = new Queue ();
}
- public WebConnection GetConnection ()
+ public void Close ()
+ {
+ //TODO: what do we do with the queue? Empty it out and abort the requests?
+ //TODO: abort requests or wait for them to finish
+ lock (connections) {
+ WeakReference cncRef = null;
+
+ int end = connections.Count;
+ // ArrayList removed = null;
+ for (int i = 0; i < end; i++) {
+ cncRef = (WeakReference) connections [i];
+ WebConnection cnc = cncRef.Target as WebConnection;
+ if (cnc != null) {
+ cnc.Close (false);
+ }
+ }
+ connections.Clear ();
+ }
+ }
+
+ public WebConnection GetConnection (HttpWebRequest request)
{
WebConnection cnc = null;
lock (connections) {
connections.RemoveAt ((int) removed [i]);
}
- cnc = CreateOrReuseConnection ();
+ cnc = CreateOrReuseConnection (request);
}
return cnc;
}
- WebConnection CreateOrReuseConnection ()
+ static void PrepareSharingNtlm (WebConnection cnc, HttpWebRequest request)
+ {
+ if (!cnc.NtlmAuthenticated)
+ return;
+
+ bool needs_reset = false;
+ NetworkCredential cnc_cred = cnc.NtlmCredential;
+
+ 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;
+ }
+
+ if (!needs_reset) {
+ bool req_sharing = request.UnsafeAuthenticatedConnectionSharing;
+ bool cnc_sharing = cnc.UnsafeAuthenticatedConnectionSharing;
+ needs_reset = (req_sharing == false || req_sharing != cnc_sharing);
+ }
+ if (needs_reset) {
+ cnc.Close (false); // closes the authenticated connection
+ cnc.ResetNtlm ();
+ }
+ }
+
+ WebConnection CreateOrReuseConnection (HttpWebRequest request)
{
// lock is up there.
WebConnection cnc;
if (cnc.Busy)
continue;
+ PrepareSharingNtlm (cnc, request);
return cnc;
}
if (rnd == null)
rnd = new Random ();
- int idx = (count > 1) ? rnd.Next (0, count - 1) : 0;
+ int idx = (count > 1) ? rnd.Next (0, count) : 0;
cncRef = (WeakReference) connections [idx];
cnc = cncRef.Target as WebConnection;
if (cnc == null) {