2 using System.Collections.Specialized;
\r
3 using System.Globalization;
\r
5 using System.Runtime;
\r
6 using System.Runtime.Serialization;
\r
7 using System.Security.Cryptography.X509Certificates;
\r
12 public class HttpWebResponse : WebResponse, IDisposable
\r
15 private mainsoft.apache.commons.httpclient.HttpMethod _httpMethod;
\r
16 private CookieCollection _cookies;
\r
17 private WebHeaderCollection _headers;
\r
18 private string _statusDescription;
\r
19 private Version _version = null;
\r
21 private string _method;
\r
22 private Stream _responseStream;
\r
23 private mainsoft.apache.commons.httpclient.HttpState _state;
\r
24 private HttpStateCache _stateCache;
\r
25 private HttpStatusCode _statusCode;
\r
26 private bool _isStatusCodeInitialized = false;
\r
28 private Type _httpStatusCodeType = typeof(HttpStatusCode);
\r
30 private sbyte [] _responseBody;
\r
31 private bool _isHttpMethodClosed = false;
\r
34 #region Constructors
\r
36 internal HttpWebResponse(mainsoft.apache.commons.httpclient.HttpMethod httpMethod,
\r
37 mainsoft.apache.commons.httpclient.HttpState state,
\r
38 HttpStateCache stateCache,
\r
39 Uri uri, string method)
\r
41 _httpMethod = httpMethod;
\r
45 _stateCache = stateCache;
\r
52 public CookieCollection Cookies
\r
56 if(_cookies == null)
\r
58 _cookies = new CookieCollection();
\r
71 public override WebHeaderCollection Headers
\r
75 if(_headers == null)
\r
77 _headers = new WebHeaderCollection();
\r
83 public override long ContentLength
\r
87 string val = Headers["Content-Length"];
\r
88 if(val == null || val.Trim().Equals(""))
\r
92 return Int64.Parse(val);
\r
102 public string ContentEncoding
\r
106 return Headers["Content-Encoding"];
\r
110 public override string ContentType
\r
114 return Headers["Content-Type"];
\r
118 public string CharacterSet
\r
122 string contentType = ContentType;
\r
123 if (contentType == null)
\r
124 return "ISO-8859-1";
\r
125 int pos = contentType.IndexOf ("charset=", StringComparison.OrdinalIgnoreCase);
\r
127 return "ISO-8859-1";
\r
129 int pos2 = contentType.IndexOf (';', pos);
\r
130 return (pos2 == -1)
\r
131 ? contentType.Substring (pos)
\r
132 : contentType.Substring (pos, pos2 - pos);
\r
136 public string Server
\r
140 return Headers ["Server"];
\r
144 public DateTime LastModified
\r
150 string val = Headers["Last-Modified"];
\r
151 return MonoHttpDate.Parse(val);
\r
155 return DateTime.Now;
\r
160 public HttpStatusCode StatusCode
\r
164 if(_isStatusCodeInitialized == false)
\r
166 int status = _httpMethod.getStatusCode();
\r
167 _statusCode = (HttpStatusCode)Enum.Parse(_httpStatusCodeType,
\r
168 Enum.GetName(_httpStatusCodeType, status));
\r
169 _isStatusCodeInitialized = true;
\r
172 return _statusCode;
\r
176 public string StatusDescription
\r
180 if(_statusDescription == null)
\r
181 _statusDescription = _httpMethod.getStatusText();
\r
182 return _statusDescription;
\r
186 public Version ProtocolVersion
\r
190 if(_version == null)
\r
196 public override Uri ResponseUri
\r
204 public string Method
\r
215 internal void ReadAllAndClose()
\r
217 if (_responseBody != null)
\r
220 object temp = null;
\r
221 if(_cookies == null)
\r
223 temp = this.Cookies;
\r
225 if(_headers == null)
\r
227 temp = this.Headers;
\r
229 if(_isStatusCodeInitialized == false)
\r
231 temp = this.StatusCode;
\r
233 if(_statusDescription == null)
\r
235 temp = this.StatusDescription;
\r
237 if(_version == null)
\r
239 temp = this.ProtocolVersion;
\r
242 _responseBody = _httpMethod.getResponseBody();
\r
244 Console.WriteLine("The response body as string == {0}", System.Text.Encoding.UTF8.GetString((byte[])vmw.common.TypeUtils.ToByteArray(_responseBody)));
\r
249 public override Stream GetResponseStream()
\r
253 if(_responseStream == null)
\r
255 Type t = Type.GetType("System.IO.ConsoleReadStream", true);
\r
256 object [] param = null;
\r
257 if (_responseBody == null)
\r
259 param = new object[]{_httpMethod.getResponseBodyAsStream()};
\r
263 param = new object[]{new java.io.ByteArrayInputStream(_responseBody)};
\r
265 _responseStream = (Stream) Activator.CreateInstance(t, param);
\r
267 return _responseStream;
\r
271 Console.WriteLine("Exception caught!");
\r
272 Console.WriteLine(e.GetType() + ":" + e.Message + "\n" + e.StackTrace);
\r
277 public override void Close()
\r
281 if(_responseStream != null)
\r
282 _responseStream.Close();
\r
286 _responseStream = null;
\r
288 if (!_isHttpMethodClosed)
\r
290 _httpMethod.releaseConnection();
\r
291 if(_stateCache != null && _state != null)
\r
293 _stateCache.ReleaseHttpState(_state);
\r
295 _stateCache = null;
\r
297 _isHttpMethodClosed = true;
\r
302 public string GetResponseHeader(string headerName)
\r
304 return Headers[headerName];
\r
307 public override int GetHashCode()
\r
309 return base.GetHashCode();
\r
313 protected virtual void Dispose(bool disposing)
\r
317 if(_responseStream != null)
\r
318 _responseStream.Close();
\r
322 _responseStream = null;
\r
324 if (!_isHttpMethodClosed)
\r
326 _httpMethod.releaseConnection();
\r
327 _isHttpMethodClosed = true;
\r
332 private void FillHeaders()
\r
334 mainsoft.apache.commons.httpclient.Header[] respHeaders =
\r
335 _httpMethod.getResponseHeaders();
\r
336 if(respHeaders == null)
\r
338 for(int i = 0; i < respHeaders.Length; i++)
\r
341 mainsoft.apache.commons.httpclient.HeaderElement[] elements = respHeaders[i].getElements();
\r
342 for(int j = 0; j < elements.Length; j++)
\r
344 string key = elements[j].getName();
\r
345 string val = elements[j].getValue();
\r
346 string pair = (key == null) ? ((val == null) ? "" : val) : ((val==null) ? key : key + "=" + val);
\r
347 _headers.Add(respHeaders[i].getName(), pair);
\r
354 private void ParseVersion()
\r
356 mainsoft.apache.commons.httpclient.StatusLine statusLine =
\r
357 _httpMethod.getStatusLine();
\r
358 string ver = statusLine.getHttpVersion().Trim().ToUpper();
\r
359 if(ver == "HTTP/1.1")
\r
360 _version = HttpVersion.Version11;
\r
361 else if(ver == "HTTP/1.0")
\r
362 _version = HttpVersion.Version10;
\r
367 private mainsoft.apache.commons.httpclient.Cookie FindCookie (mainsoft.apache.commons.httpclient.Cookie [] cookies, string name) {
\r
368 for (int i = 0; i < cookies.Length; ++i)
\r
369 if (cookies [i].getName () == name)
\r
370 return cookies [i];
\r
374 private mainsoft.apache.commons.httpclient.Cookie [] FetchResponseCookies (mainsoft.apache.commons.httpclient.Header [] headers,
\r
375 mainsoft.apache.commons.httpclient.Cookie [] stateCookies) {
\r
376 System.Collections.ArrayList list = new System.Collections.ArrayList();
\r
377 foreach (mainsoft.apache.commons.httpclient.Header h in headers) {
\r
378 foreach (mainsoft.apache.commons.httpclient.HeaderElement element in h.getValues ()) {
\r
379 mainsoft.apache.commons.httpclient.Cookie c = FindCookie (stateCookies, element.getName ());
\r
385 return (mainsoft.apache.commons.httpclient.Cookie[]) list.ToArray(typeof(mainsoft.apache.commons.httpclient.Cookie));
\r
388 private void FillCookies ()
\r
393 mainsoft.apache.commons.httpclient.Cookie[] javaCookies =
\r
394 _state.getCookies();
\r
396 if(javaCookies == null)
\r
399 mainsoft.apache.commons.httpclient.Header [] headers = _httpMethod.getResponseHeaders ("Set-Cookie");
\r
400 if (headers != null)
\r
401 javaCookies = FetchResponseCookies (headers, javaCookies);
\r
403 for(int i = 0; i < javaCookies.Length; i++)
\r
405 bool httpsProtocol = _httpMethod.getURI().ToString().StartsWith("https");
\r
406 if(!httpsProtocol && javaCookies[i].getSecure())
\r
408 Cookie c = new Cookie(javaCookies[i].getName(),
\r
409 javaCookies[i].getValue(),
\r
410 (javaCookies[i].getPath() == null) ? "" : javaCookies[i].getPath(),
\r
411 (javaCookies[i].getDomain() == null) ? "" : javaCookies[i].getDomain());
\r
412 java.util.Calendar jCalendar = java.util.Calendar.getInstance();
\r
413 java.util.Date jDate = javaCookies[i].getExpiryDate();
\r
416 jCalendar.setTime(javaCookies[i].getExpiryDate());
\r
417 c.Expires = (DateTime) vmw.common.DateTimeUtils.CalendarToDateTime(jCalendar);
\r
425 //todo remove unused methods
\r
426 private void FillCookies_old ()
\r
429 string val = Headers["Set-Cookie"];
\r
430 if (val != null && val.Trim () != "")
\r
433 val = Headers["Set-Cookie2"];
\r
434 if (val != null && val.Trim () != "")
\r
438 static string [] SplitValue (string input)
\r
440 string [] result = new string [2];
\r
441 int eq = input.IndexOf ('=');
\r
444 result [0] = "invalid";
\r
448 result [0] = input.Substring (0, eq).Trim ().ToUpper ();
\r
449 result [1] = input.Substring (eq + 1);
\r
455 private void SetCookie(string val)
\r
457 // Console.WriteLine("in set cookie 1 - got value : " + val);
\r
458 string[] parts = null;
\r
459 Collections.Queue options = null;
\r
460 Cookie cookie = null;
\r
462 options = new Collections.Queue (val.Split (';'));
\r
463 parts = SplitValue ((string) options.Dequeue()); // NAME=VALUE must be first
\r
465 cookie = new Cookie (parts[0], parts[1]);
\r
467 while (options.Count > 0)
\r
469 parts = SplitValue ((string) options.Dequeue());
\r
470 switch (parts [0])
\r
473 if (cookie.Comment == null)
\r
474 cookie.Comment = parts[1];
\r
477 if (cookie.CommentUri == null)
\r
478 cookie.CommentUri = new Uri(parts[1]);
\r
481 cookie.Discard = true;
\r
484 if (cookie.Domain == "")
\r
485 cookie.Domain = parts[1];
\r
487 case "MAX-AGE": // RFC Style Set-Cookie2
\r
488 if (cookie.Expires == DateTime.MinValue)
\r
489 cookie.Expires = cookie.TimeStamp.AddSeconds (Int32.Parse (parts[1]));
\r
491 case "EXPIRES": // Netscape Style Set-Cookie
\r
492 if (cookie.Expires == DateTime.MinValue)
\r
494 //FIXME: Does DateTime parse something like: "Sun, 17-Jan-2038 19:14:07 GMT"?
\r
495 //cookie.Expires = DateTime.ParseExact (parts[1]);
\r
496 cookie.Expires = DateTime.Now.AddDays (1);
\r
500 cookie.Path = parts[1];
\r
503 if (cookie.Port == null)
\r
504 cookie.Port = parts[1];
\r
507 cookie.Secure = true;
\r
510 cookie.Version = Int32.Parse (parts[1]);
\r
515 if (_cookies == null)
\r
516 _cookies = new CookieCollection();
\r
518 if (cookie.Domain == "")
\r
519 cookie.Domain = _uri.Host;
\r
521 // Console.WriteLine("adding cookie " + cookie + " to collection");
\r
522 _cookies.Add (cookie);
\r
523 // Console.WriteLine("exit from method...");
\r
526 private void SetCookie2 (string cookies_str)
\r
528 string [] cookies = cookies_str.Split (',');
\r
529 foreach (string cookie_str in cookies)
\r
530 SetCookie (cookie_str);
\r