1 //Copyright 2010 Microsoft Corporation
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
6 //http://www.apache.org/licenses/LICENSE-2.0
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
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.
34 public ScriptXmlHttpRequest()
36 this.request
= CreateNativeRequest();
37 Debug
.Assert(this.request
!= null, "this.request != null");
40 #endregion Constructors.
44 internal bool IsCompleted
49 this.request
== null ||
50 (Convert
.ToInt32((double)this.request
.GetProperty("readyState")) == 4);
54 #endregion Properties.
60 var currentRequest
= this.request
;
61 if (currentRequest
!= null)
65 ScriptObjectUtility
.SetReadyStateChange(currentRequest
, null);
75 public string GetResponseHeaders()
77 string responseHeaders
= (string)this.request
.Invoke("getAllResponseHeaders", new object[0]);
78 if (string.IsNullOrEmpty(responseHeaders
))
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"));
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
)
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
))
176 return (null != request
);
179 private static ScriptObject
CreateNativeRequest()
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");