Просмотр исходного кода

2003-06-21 Gonzalo Paniagua Javier <[email protected]>

	* HttpWebClientProtocol.cs: handle cookies if the request is a
	HttpWebRequest. It gets the cookies set in the response and sends them
	on subsequent requests.

	* SoapHttpClientProtocol.cs:
	(GetWebRequest): just calls the base method.
	(SendRequest): set the method here.
	(Invoke): call GetWebResponse instead of request.GetResponse.

	* WebClientProtocol.cs:
	(GetWebRequest): set some properties of the request.
	(GetWebResponse): if we get a WebException containing a response, return
	that as the response and ignore the exception.
	(GetWebResponse (req, async)): only call EndGetResponse.

svn path=/trunk/mcs/; revision=15536
Gonzalo Paniagua Javier 22 лет назад
Родитель
Сommit
ae5983eb06

+ 17 - 0
mcs/class/System.Web.Services/System.Web.Services.Protocols/ChangeLog

@@ -1,3 +1,20 @@
+2003-06-21  Gonzalo Paniagua Javier <[email protected]>
+
+	* HttpWebClientProtocol.cs: handle cookies if the request is a
+	HttpWebRequest. It gets the cookies set in the response and sends them
+	on subsequent requests.
+
+	* SoapHttpClientProtocol.cs:
+	(GetWebRequest): just calls the base method.
+	(SendRequest): set the method here.
+	(Invoke): call GetWebResponse instead of request.GetResponse.
+
+	* WebClientProtocol.cs:
+	(GetWebRequest): set some properties of the request.
+	(GetWebResponse): if we get a WebException containing a response, return
+	that as the response and ignore the exception.
+	(GetWebResponse (req, async)): only call EndGetResponse.
+
 2003-06-14  Lluis Sanchez Gual  <[email protected]>
 
 	* Methods.cs: Added information about headers in MethodStubInfo. Added cache of serializers

+ 72 - 9
mcs/class/System.Web.Services/System.Web.Services.Protocols/HttpWebClientProtocol.cs

@@ -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

+ 3 - 5
mcs/class/System.Web.Services/System.Web.Services.Protocols/SoapHttpClientProtocol.cs

@@ -55,10 +55,7 @@ namespace System.Web.Services.Protocols {
 
 		protected override WebRequest GetWebRequest (Uri uri)
 		{
-			WebRequest request = WebRequest.Create (uri);
-			request.Method = "POST";
-
-			return request;
+			return base.GetWebRequest (uri);
 		}
 
 		//
@@ -94,6 +91,7 @@ namespace System.Web.Services.Protocols {
 
 		void SendRequest (WebRequest request, SoapClientMessage message)
 		{
+			request.Method = "POST";
 			WebHeaderCollection headers = request.Headers;
 			headers.Add ("SOAPAction", message.Action);
 
@@ -199,7 +197,7 @@ namespace System.Web.Services.Protocols {
 			{
 				WebRequest request = GetWebRequest (uri);
 				SendRequest (request, message);
-				response = request.GetResponse ();
+				response = GetWebResponse (request);
 			}
 			catch (WebException ex)
 			{

+ 18 - 6
mcs/class/System.Web.Services/System.Web.Services.Protocols/WebClientProtocol.cs

@@ -132,13 +132,16 @@ namespace System.Web.Services.Protocols {
 
 		protected virtual WebRequest GetWebRequest (Uri uri)
 		{
+			if (uri == null)
+				throw new InvalidOperationException ("uri is null");
+
 			current_request = WebRequest.Create (uri);
-			current_request.Timeout = Timeout;
+			current_request.Timeout = timeout;
+			current_request.PreAuthenticate = preAuthenticate;
+			current_request.ConnectionGroupName = connectionGroupName;
 
 			if (credentials != null)
 				current_request.Credentials = credentials;
-			if (connectionGroupName != String.Empty)
-				current_request.ConnectionGroupName = connectionGroupName;
 
 			return current_request;
 		}
@@ -147,7 +150,18 @@ namespace System.Web.Services.Protocols {
 		{
 			if (abort)
 				throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
-			return request.GetResponse ();
+
+			WebResponse response = null;
+			try {
+				request.Timeout = timeout;
+				response = request.GetResponse ();
+			} catch (WebException e) {
+				response = e.Response;
+				if (response == null)
+					throw;
+			}
+
+			return response;
 		}
 
 		protected virtual WebResponse GetWebResponse (WebRequest request, IAsyncResult result)
@@ -155,8 +169,6 @@ namespace System.Web.Services.Protocols {
 			if (abort)
 				throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
 
-			IAsyncResult ar = request.BeginGetResponse (null, null);
-			ar.AsyncWaitHandle.WaitOne ();
 			return request.EndGetResponse (result);
 		}