New test.
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / HttpSimpleClientProtocol.cs
1 // \r
2 // System.Web.Services.Protocols.HttpSimpleClientProtocol.cs\r
3 //\r
4 // Author:\r
5 //   Tim Coleman (tim@timcoleman.com)\r
6 //   Lluis Sanchez Gual (lluis@ximian.com)\r
7 //\r
8 // Copyright (C) Tim Coleman, 2002\r
9 //\r
10
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31 \r
32 using System.Web.Services;\r
33 using System.Net;\r
34 using System.IO;\r
35 using System.Threading;\r
36 \r
37 namespace System.Web.Services.Protocols {\r
38         public abstract class HttpSimpleClientProtocol : HttpWebClientProtocol {\r
39 \r
40                 #region Fields\r
41 \r
42                 internal HttpSimpleTypeStubInfo TypeStub;\r
43                 \r
44                 #endregion // Fields\r
45 \r
46                 #region Constructors\r
47 \r
48                 protected HttpSimpleClientProtocol () \r
49                 {\r
50                 }\r
51                 \r
52                 #endregion // Constructors\r
53 \r
54                 #region Methods\r
55 \r
56                 protected IAsyncResult BeginInvoke (string methodName, string requestUrl, object[] parameters, AsyncCallback callback, object asyncState)\r
57                 {\r
58                         HttpSimpleMethodStubInfo method = (HttpSimpleMethodStubInfo) TypeStub.GetMethod (methodName);\r
59                         SimpleWebClientAsyncResult ainfo = null;\r
60                         \r
61                         try\r
62                         {\r
63                                 MimeParameterWriter parameterWriter = (MimeParameterWriter) method.ParameterWriterType.Create ();\r
64                                 string url = parameterWriter.GetRequestUrl (requestUrl, parameters);\r
65                                 WebRequest req = GetWebRequest (new Uri(url));\r
66                                 \r
67                                 ainfo = new SimpleWebClientAsyncResult (req, callback, asyncState);\r
68                                 ainfo.Parameters = parameters;\r
69                                 ainfo.ParameterWriter = parameterWriter;\r
70                                 ainfo.Method = method;\r
71                                 \r
72                                 ainfo.Request = req;\r
73                                 ainfo.Request.BeginGetRequestStream (new AsyncCallback (AsyncGetRequestStreamDone), ainfo);\r
74                         }\r
75                         catch (Exception ex)\r
76                         {\r
77                                 if (ainfo != null)\r
78                                         ainfo.SetCompleted (null, ex, false);\r
79                                 else\r
80                                         throw ex;\r
81                         }\r
82 \r
83                         return ainfo;\r
84 \r
85                 }\r
86 \r
87                 void AsyncGetRequestStreamDone (IAsyncResult ar)\r
88                 {\r
89                         SimpleWebClientAsyncResult ainfo = (SimpleWebClientAsyncResult) ar.AsyncState;\r
90                         try\r
91                         {\r
92                                 if (ainfo.ParameterWriter.UsesWriteRequest)\r
93                                 {\r
94                                         Stream stream = ainfo.Request.GetRequestStream ();\r
95                                         ainfo.ParameterWriter.WriteRequest (stream, ainfo.Parameters);\r
96                                         stream.Close ();\r
97                                 }\r
98 \r
99                                 ainfo.Request.BeginGetResponse (new AsyncCallback (AsyncGetResponseDone), ainfo);\r
100                         }\r
101                         catch (Exception ex)\r
102                         {\r
103                                 ainfo.SetCompleted (null, ex, true);\r
104                         }\r
105                 }\r
106 \r
107                 void AsyncGetResponseDone (IAsyncResult ar)\r
108                 {\r
109                         SimpleWebClientAsyncResult ainfo = (SimpleWebClientAsyncResult) ar.AsyncState;\r
110                         WebResponse response = null;\r
111 \r
112                         try {\r
113                                 response = GetWebResponse (ainfo.Request, ar);\r
114                         }\r
115                         catch (WebException ex) {\r
116                                 response = ex.Response;\r
117                                 HttpWebResponse http_response = response as HttpWebResponse;\r
118                                 if (http_response == null || http_response.StatusCode != HttpStatusCode.InternalServerError) {\r
119                                         ainfo.SetCompleted (null, ex, true);\r
120                                         return;\r
121                                 }\r
122                         }\r
123                         catch (Exception ex) {\r
124                                 ainfo.SetCompleted (null, ex, true);\r
125                                 return;\r
126                         }\r
127 \r
128                         try {\r
129                                 MimeReturnReader returnReader = (MimeReturnReader) ainfo.Method.ReturnReaderType.Create ();\r
130                                 object result = returnReader.Read (response, response.GetResponseStream ());\r
131                                 ainfo.SetCompleted (result, null, true);\r
132                         }\r
133                         catch (Exception ex) {\r
134                                 ainfo.SetCompleted (null, ex, true);\r
135                         }\r
136                 }\r
137 \r
138 \r
139                 protected object EndInvoke (IAsyncResult asyncResult)\r
140                 {\r
141                         if (!(asyncResult is SimpleWebClientAsyncResult)) throw new ArgumentException ("asyncResult is not the return value from BeginInvoke");\r
142 \r
143                         SimpleWebClientAsyncResult ainfo = (SimpleWebClientAsyncResult) asyncResult;\r
144                         lock (ainfo)\r
145                         {\r
146                                 if (!ainfo.IsCompleted) ainfo.WaitForComplete ();\r
147                                 if (ainfo.Exception != null) throw ainfo.Exception;\r
148                                 else return ainfo.Result;\r
149                         }\r
150                 }\r
151 \r
152                 protected object Invoke (string methodName, string requestUrl, object[] parameters)\r
153                 {\r
154                         HttpSimpleMethodStubInfo method = (HttpSimpleMethodStubInfo) TypeStub.GetMethod (methodName);\r
155                         MimeParameterWriter parameterWriter = (MimeParameterWriter) method.ParameterWriterType.Create ();\r
156                         \r
157                         string url = parameterWriter.GetRequestUrl (requestUrl, parameters);\r
158                         WebRequest request = GetWebRequest (new Uri(url, true));\r
159                         \r
160                         parameterWriter.InitializeRequest (request, parameters);\r
161                         \r
162                         if (parameterWriter.UsesWriteRequest)\r
163                         {\r
164                                 Stream stream = request.GetRequestStream ();\r
165                                 parameterWriter.WriteRequest (stream, parameters);\r
166                                 stream.Close ();\r
167                         }\r
168                         \r
169                         WebResponse response = GetWebResponse (request);\r
170                         \r
171                         MimeReturnReader returnReader = (MimeReturnReader) method.ReturnReaderType.Create ();\r
172                         return returnReader.Read (response, response.GetResponseStream ());\r
173                 }\r
174                 \r
175 #if NET_2_0\r
176 \r
177                 protected void InvokeAsync (string methodName, string requestUrl, object[] parameters, SendOrPostCallback callback)\r
178                 {\r
179                         InvokeAsync (methodName, requestUrl, parameters, callback, null);\r
180                 }\r
181 \r
182                 protected void InvokeAsync (string methodName, string requestUrl, object[] parameters, SendOrPostCallback callback, object userState)\r
183                 {\r
184                         InvokeAsyncInfo info = new InvokeAsyncInfo (callback, userState);\r
185                         BeginInvoke (methodName, requestUrl, parameters, new AsyncCallback (InvokeAsyncCallback), info);\r
186                 }\r
187 \r
188                 void InvokeAsyncCallback (IAsyncResult ar)\r
189                 {\r
190                         InvokeAsyncInfo info = (InvokeAsyncInfo) ar.AsyncState;\r
191                         SimpleWebClientAsyncResult sar = (SimpleWebClientAsyncResult) ar;\r
192                         InvokeCompletedEventArgs args = new InvokeCompletedEventArgs (sar.Exception, false, info.UserState, (object[]) sar.Result);\r
193                         if (info.Context != null)\r
194                                 info.Context.Send (info.Callback, args);\r
195                         else\r
196                                 info.Callback (args);\r
197                 }\r
198 #endif\r
199                 \r
200                 #endregion // Methods\r
201         }\r
202         \r
203         internal class SimpleWebClientAsyncResult : WebClientAsyncResult\r
204         {\r
205                 public SimpleWebClientAsyncResult (WebRequest request, AsyncCallback callback, object asyncState)\r
206                 : base (request, callback, asyncState)\r
207                 {\r
208                 }\r
209                 \r
210                 public object[] Parameters;\r
211                 public HttpSimpleMethodStubInfo Method;\r
212                 public MimeParameterWriter ParameterWriter;\r
213         }\r
214 }