Factor mono_get_exception_missing_field and mono_get_exception_missin… (#9282)
[mono-project.git] / mcs / class / System.Data.Services.Client / Client_SL / System / Data / Services / Http / ScriptXmlHttpRequest.cs
blobac62da5f1f3b78cdbe03ae5bd5cf615c038f7f53
1 //Copyright 2010 Microsoft Corporation
2 //
3 //Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
4 //You may obtain a copy of the License at
5 //
6 //http://www.apache.org/licenses/LICENSE-2.0
7 //
8 //Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
9 //"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 //See the License for the specific language governing permissions and limitations under the License.
13 namespace System.Data.Services.Http
15 #region Namespaces.
17 using System;
18 using System.Data.Services.Client;
19 using System.Diagnostics;
20 using System.Windows.Browser;
22 #endregion Namespaces.
24 internal sealed class ScriptXmlHttpRequest
26 #region Private fields.
28 private ScriptObject request;
30 #endregion Private fields.
32 #region Constructors.
34 public ScriptXmlHttpRequest()
36 this.request = CreateNativeRequest();
37 Debug.Assert(this.request != null, "this.request != null");
40 #endregion Constructors.
42 #region Properties.
44 internal bool IsCompleted
46 get
48 return
49 this.request == null ||
50 (Convert.ToInt32((double)this.request.GetProperty("readyState")) == 4);
54 #endregion Properties.
56 #region Methods.
58 public void Dispose()
60 var currentRequest = this.request;
61 if (currentRequest != null)
63 try
65 ScriptObjectUtility.SetReadyStateChange(currentRequest, null);
67 finally
69 this.request = null;
75 public string GetResponseHeaders()
77 string responseHeaders = (string)this.request.Invoke("getAllResponseHeaders", new object[0]);
78 if (string.IsNullOrEmpty(responseHeaders))
80 return string.Empty;
83 int indexOfColon = responseHeaders.IndexOf(':');
84 int indexOfSeparator = responseHeaders.IndexOf('\n');
85 if (indexOfColon > indexOfSeparator)
87 responseHeaders = responseHeaders.Substring(indexOfSeparator + 1);
90 if (responseHeaders.IndexOf("\r\n", StringComparison.Ordinal) == -1)
92 responseHeaders = responseHeaders.Replace("\n", "\r\n");
95 if (responseHeaders.EndsWith("\r\n\r\n", StringComparison.Ordinal))
97 return responseHeaders;
100 if (!responseHeaders.EndsWith("\r\n", StringComparison.Ordinal))
102 return (responseHeaders + "\r\n\r\n");
105 return (responseHeaders + "\r\n");
108 public void GetResponseStatus(out int statusCode)
112 statusCode = Convert.ToInt32((double)this.request.GetProperty("status"));
114 catch (Exception e)
116 string message = System.Data.Services.Client.Strings.HttpWeb_Internal("ScriptXmlHttpRequest.HttpWebRequest");
117 throw new WebException(message, e);
121 public void Open(string uri, string method, Action readyStateChangeCallback)
123 Util.CheckArgumentNull(uri, "uri");
124 Util.CheckArgumentNull(method, "method");
125 Util.CheckArgumentNull(readyStateChangeCallback, "readyStateChangeCallback");
127 ScriptObject callback = ScriptObjectUtility.ToScriptFunction(readyStateChangeCallback);
128 ScriptObjectUtility.CallOpen(this.request, method, uri);
129 ScriptObjectUtility.SetReadyStateChange(this.request, callback);
132 public string ReadResponseAsString()
134 Debug.Assert(this.request != null, "this.request != null");
135 return (string)this.request.GetProperty("responseText");
138 public void Send(string content)
140 Debug.Assert(this.request != null, "this.request != null");
141 this.request.Invoke("send", content ?? string.Empty);
144 public void SetRequestHeader(string header, string value)
146 Debug.Assert(this.request != null, "this.request != null");
147 this.request.Invoke("setRequestHeader", header, value);
150 internal void Abort()
152 var requestValue = this.request;
153 if (requestValue != null)
155 requestValue.Invoke("abort", new object[0]);
159 private static bool CreateInstance(string typeName, object arg, out ScriptObject request)
161 request = null;
164 object[] args = (arg == null) ? null : new object[] { arg };
165 request = HtmlPage.Window.CreateInstance(typeName, args);
167 catch (Exception exception)
169 if (Util.DoNotHandleException(exception))
171 throw;
176 return (null != request);
179 private static ScriptObject CreateNativeRequest()
181 ScriptObject result;
182 if (!CreateInstance("XMLHttpRequest", null, out result) &&
183 !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP.6.0", out result) &&
184 !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP.3.0", out result) &&
185 !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP.2.0", out result) &&
186 !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP", out result) &&
187 !CreateInstance("ActiveXObject", "XMLHttpRequest", out result) &&
188 !CreateInstance("ActiveXObject", "Microsoft.XMLHTTP", out result))
190 throw WebException.CreateInternal("ScriptXmlHttpRequest.CreateNativeRequest");
193 Debug.Assert(result != null, "result != null -- otherwise CreateInstance should not have returned true");
194 return result;
197 #endregion Methods.