|
|
@@ -24,6 +24,7 @@ namespace System.Web.Services.Protocols {
|
|
|
CookieContainer cookieContainer;
|
|
|
IWebProxy proxy;
|
|
|
string userAgent;
|
|
|
+ CookieCollection prevCookies;
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
@@ -32,7 +33,7 @@ namespace System.Web.Services.Protocols {
|
|
|
protected HttpWebClientProtocol ()
|
|
|
{
|
|
|
allowAutoRedirect = false;
|
|
|
- clientCertificates = new X509CertificateCollection ();
|
|
|
+ clientCertificates = null;
|
|
|
cookieContainer = null;
|
|
|
proxy = null; // FIXME
|
|
|
userAgent = String.Format ("Mono Web Services Client Protocol {0}", Environment.Version);
|
|
|
@@ -53,7 +54,11 @@ namespace System.Web.Services.Protocols {
|
|
|
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
|
|
|
[WebServicesDescription ("The client certificates that will be sent to the server, if the server requests them.")]
|
|
|
public X509CertificateCollection ClientCertificates {
|
|
|
- get { return clientCertificates; }
|
|
|
+ get {
|
|
|
+ if (clientCertificates == null)
|
|
|
+ clientCertificates = new X509CertificateCollection ();
|
|
|
+ return clientCertificates;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[DefaultValue (null)]
|
|
|
@@ -80,23 +85,81 @@ namespace System.Web.Services.Protocols {
|
|
|
|
|
|
#region Methods
|
|
|
|
|
|
+ internal virtual void AddCookies (Uri uri)
|
|
|
+ {
|
|
|
+ if (cookieContainer == null)
|
|
|
+ cookieContainer = new CookieContainer ();
|
|
|
+
|
|
|
+ if (prevCookies == null || prevCookies.Count == 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ CookieCollection coll = cookieContainer.GetCookies (uri);
|
|
|
+ foreach (Cookie prev in prevCookies) {
|
|
|
+ bool dont = false;
|
|
|
+ foreach (Cookie c in coll) {
|
|
|
+ if (c.Equals (prev)) {
|
|
|
+ dont = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dont == false)
|
|
|
+ cookieContainer.Add (prev);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ internal virtual void CheckForCookies (HttpWebResponse response)
|
|
|
+ {
|
|
|
+ CookieCollection cookies = response.Cookies;
|
|
|
+ if (cookies.Count == 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (prevCookies == null)
|
|
|
+ prevCookies = new CookieCollection ();
|
|
|
+
|
|
|
+ foreach (Cookie c in cookies)
|
|
|
+ prevCookies.Add (c);
|
|
|
+ }
|
|
|
+
|
|
|
protected override WebRequest GetWebRequest (Uri uri)
|
|
|
{
|
|
|
- if (null == uri)
|
|
|
- throw new InvalidOperationException ("The uri parameter is a null reference.");
|
|
|
- return WebRequest.Create (uri);
|
|
|
+ WebRequest req = base.GetWebRequest (uri);
|
|
|
+ HttpWebRequest request = req as HttpWebRequest;
|
|
|
+ if (request == null)
|
|
|
+ return req;
|
|
|
+
|
|
|
+ request.AllowAutoRedirect = allowAutoRedirect;
|
|
|
+ if (clientCertificates != null)
|
|
|
+ request.ClientCertificates.AddRange (clientCertificates);
|
|
|
+
|
|
|
+ AddCookies (uri);
|
|
|
+ request.CookieContainer = cookieContainer;
|
|
|
+ if (proxy != null)
|
|
|
+ request.Proxy = proxy;
|
|
|
+
|
|
|
+ request.UserAgent = userAgent;
|
|
|
+
|
|
|
+ return request;
|
|
|
}
|
|
|
|
|
|
protected override WebResponse GetWebResponse (WebRequest request)
|
|
|
{
|
|
|
- return request.GetResponse ();
|
|
|
+ WebResponse response = base.GetWebResponse (request);
|
|
|
+ HttpWebResponse wr = response as HttpWebResponse;
|
|
|
+ if (wr != null)
|
|
|
+ CheckForCookies (wr);
|
|
|
+
|
|
|
+ return response;
|
|
|
}
|
|
|
|
|
|
protected override WebResponse GetWebResponse (WebRequest request, IAsyncResult result)
|
|
|
{
|
|
|
- IAsyncResult ar = request.BeginGetResponse (null, null);
|
|
|
- ar.AsyncWaitHandle.WaitOne ();
|
|
|
- return request.EndGetResponse (result);
|
|
|
+ WebResponse response = base.GetWebResponse (request, result);
|
|
|
+ HttpWebResponse wr = response as HttpWebResponse;
|
|
|
+ if (wr != null)
|
|
|
+ CheckForCookies (wr);
|
|
|
+
|
|
|
+ return response;
|
|
|
}
|
|
|
|
|
|
#endregion // Methods
|