ScriptXmlHttpRequest.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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.
  11. namespace System.Data.Services.Http
  12. {
  13. #region Namespaces.
  14. using System;
  15. using System.Data.Services.Client;
  16. using System.Diagnostics;
  17. using System.Windows.Browser;
  18. #endregion Namespaces.
  19. internal sealed class ScriptXmlHttpRequest
  20. {
  21. #region Private fields.
  22. private ScriptObject request;
  23. #endregion Private fields.
  24. #region Constructors.
  25. public ScriptXmlHttpRequest()
  26. {
  27. this.request = CreateNativeRequest();
  28. Debug.Assert(this.request != null, "this.request != null");
  29. }
  30. #endregion Constructors.
  31. #region Properties.
  32. internal bool IsCompleted
  33. {
  34. get
  35. {
  36. return
  37. this.request == null ||
  38. (Convert.ToInt32((double)this.request.GetProperty("readyState")) == 4);
  39. }
  40. }
  41. #endregion Properties.
  42. #region Methods.
  43. public void Dispose()
  44. {
  45. var currentRequest = this.request;
  46. if (currentRequest != null)
  47. {
  48. try
  49. {
  50. ScriptObjectUtility.SetReadyStateChange(currentRequest, null);
  51. }
  52. finally
  53. {
  54. this.request = null;
  55. }
  56. }
  57. }
  58. public string GetResponseHeaders()
  59. {
  60. string responseHeaders = (string)this.request.Invoke("getAllResponseHeaders", new object[0]);
  61. if (string.IsNullOrEmpty(responseHeaders))
  62. {
  63. return string.Empty;
  64. }
  65. int indexOfColon = responseHeaders.IndexOf(':');
  66. int indexOfSeparator = responseHeaders.IndexOf('\n');
  67. if (indexOfColon > indexOfSeparator)
  68. {
  69. responseHeaders = responseHeaders.Substring(indexOfSeparator + 1);
  70. }
  71. if (responseHeaders.IndexOf("\r\n", StringComparison.Ordinal) == -1)
  72. {
  73. responseHeaders = responseHeaders.Replace("\n", "\r\n");
  74. }
  75. if (responseHeaders.EndsWith("\r\n\r\n", StringComparison.Ordinal))
  76. {
  77. return responseHeaders;
  78. }
  79. if (!responseHeaders.EndsWith("\r\n", StringComparison.Ordinal))
  80. {
  81. return (responseHeaders + "\r\n\r\n");
  82. }
  83. return (responseHeaders + "\r\n");
  84. }
  85. public void GetResponseStatus(out int statusCode)
  86. {
  87. try
  88. {
  89. statusCode = Convert.ToInt32((double)this.request.GetProperty("status"));
  90. }
  91. catch (Exception e)
  92. {
  93. string message = System.Data.Services.Client.Strings.HttpWeb_Internal("ScriptXmlHttpRequest.HttpWebRequest");
  94. throw new WebException(message, e);
  95. }
  96. }
  97. public void Open(string uri, string method, Action readyStateChangeCallback)
  98. {
  99. Util.CheckArgumentNull(uri, "uri");
  100. Util.CheckArgumentNull(method, "method");
  101. Util.CheckArgumentNull(readyStateChangeCallback, "readyStateChangeCallback");
  102. ScriptObject callback = ScriptObjectUtility.ToScriptFunction(readyStateChangeCallback);
  103. ScriptObjectUtility.CallOpen(this.request, method, uri);
  104. ScriptObjectUtility.SetReadyStateChange(this.request, callback);
  105. }
  106. public string ReadResponseAsString()
  107. {
  108. Debug.Assert(this.request != null, "this.request != null");
  109. return (string)this.request.GetProperty("responseText");
  110. }
  111. public void Send(string content)
  112. {
  113. Debug.Assert(this.request != null, "this.request != null");
  114. this.request.Invoke("send", content ?? string.Empty);
  115. }
  116. public void SetRequestHeader(string header, string value)
  117. {
  118. Debug.Assert(this.request != null, "this.request != null");
  119. this.request.Invoke("setRequestHeader", header, value);
  120. }
  121. internal void Abort()
  122. {
  123. var requestValue = this.request;
  124. if (requestValue != null)
  125. {
  126. requestValue.Invoke("abort", new object[0]);
  127. }
  128. }
  129. private static bool CreateInstance(string typeName, object arg, out ScriptObject request)
  130. {
  131. request = null;
  132. try
  133. {
  134. object[] args = (arg == null) ? null : new object[] { arg };
  135. request = HtmlPage.Window.CreateInstance(typeName, args);
  136. }
  137. catch (Exception exception)
  138. {
  139. if (Util.DoNotHandleException(exception))
  140. {
  141. throw;
  142. }
  143. }
  144. return (null != request);
  145. }
  146. private static ScriptObject CreateNativeRequest()
  147. {
  148. ScriptObject result;
  149. if (!CreateInstance("XMLHttpRequest", null, out result) &&
  150. !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP.6.0", out result) &&
  151. !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP.3.0", out result) &&
  152. !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP.2.0", out result) &&
  153. !CreateInstance("ActiveXObject", "MSXML2.XMLHTTP", out result) &&
  154. !CreateInstance("ActiveXObject", "XMLHttpRequest", out result) &&
  155. !CreateInstance("ActiveXObject", "Microsoft.XMLHTTP", out result))
  156. {
  157. throw WebException.CreateInternal("ScriptXmlHttpRequest.CreateNativeRequest");
  158. }
  159. Debug.Assert(result != null, "result != null -- otherwise CreateInstance should not have returned true");
  160. return result;
  161. }
  162. #endregion Methods.
  163. }
  164. }