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 string val = contentType.ToLower ();
\r
126 int pos = val.IndexOf ("charset=");
\r
128 return "ISO-8859-1";
\r
130 int pos2 = val.IndexOf (';', pos);
\r
131 return (pos2 == -1)
\r
132 ? contentType.Substring (pos)
\r
133 : contentType.Substring (pos, pos2 - pos);
\r
137 public string Server
\r
141 return Headers ["Server"];
\r
145 public DateTime LastModified
\r
151 string val = Headers["Last-Modified"];
\r
152 return MonoHttpDate.Parse(val);
\r
156 return DateTime.Now;
\r
161 public HttpStatusCode StatusCode
\r
165 if(_isStatusCodeInitialized == false)
\r
167 int status = _httpMethod.getStatusCode();
\r
168 _statusCode = (HttpStatusCode)Enum.Parse(_httpStatusCodeType,
\r
169 Enum.GetName(_httpStatusCodeType, status));
\r
170 _isStatusCodeInitialized = true;
\r
173 return _statusCode;
\r
177 public string StatusDescription
\r
181 if(_statusDescription == null)
\r
182 _statusDescription = _httpMethod.getStatusText();
\r
183 return _statusDescription;
\r
187 public Version ProtocolVersion
\r
191 if(_version == null)
\r
197 public override Uri ResponseUri
\r
205 public string Method
\r
216 internal void ReadAllAndClose()
\r
218 if (_responseBody != null)
\r
221 object temp = null;
\r
222 if(_cookies == null)
\r
224 temp = this.Cookies;
\r
226 if(_headers == null)
\r
228 temp = this.Headers;
\r
230 if(_isStatusCodeInitialized == false)
\r
232 temp = this.StatusCode;
\r
234 if(_statusDescription == null)
\r
236 temp = this.StatusDescription;
\r
238 if(_version == null)
\r
240 temp = this.ProtocolVersion;
\r
243 _responseBody = _httpMethod.getResponseBody();
\r
245 Console.WriteLine("The response body as string == {0}", System.Text.Encoding.UTF8.GetString((byte[])vmw.common.TypeUtils.ToByteArray(_responseBody)));
\r
250 public override Stream GetResponseStream()
\r
254 if(_responseStream == null)
\r
256 Type t = Type.GetType("System.IO.ConsoleReadStream", true);
\r
257 object [] param = null;
\r
258 if (_responseBody == null)
\r
260 param = new object[]{_httpMethod.getResponseBodyAsStream()};
\r
264 param = new object[]{new java.io.ByteArrayInputStream(_responseBody)};
\r
266 _responseStream = (Stream) Activator.CreateInstance(t, param);
\r
268 return _responseStream;
\r
272 Console.WriteLine("Exception caught!");
\r
273 Console.WriteLine(e.GetType() + ":" + e.Message + "\n" + e.StackTrace);
\r
278 public override void Close()
\r
282 if(_responseStream != null)
\r
283 _responseStream.Close();
\r
287 _responseStream = null;
\r
289 if (!_isHttpMethodClosed)
\r
291 _httpMethod.releaseConnection();
\r
292 if(_stateCache != null && _state != null)
\r
294 _stateCache.ReleaseHttpState(_state);
\r
296 _stateCache = null;
\r
298 _isHttpMethodClosed = true;
\r
303 public string GetResponseHeader(string headerName)
\r
305 return Headers[headerName];
\r
308 public override int GetHashCode()
\r
310 return base.GetHashCode();
\r
314 protected virtual void Dispose(bool disposing)
\r
318 if(_responseStream != null)
\r
319 _responseStream.Close();
\r
323 _responseStream = null;
\r
325 if (!_isHttpMethodClosed)
\r
327 _httpMethod.releaseConnection();
\r
328 _isHttpMethodClosed = true;
\r
333 private void FillHeaders()
\r
335 mainsoft.apache.commons.httpclient.Header[] respHeaders =
\r
336 _httpMethod.getResponseHeaders();
\r
337 if(respHeaders == null)
\r
339 for(int i = 0; i < respHeaders.Length; i++)
\r
342 mainsoft.apache.commons.httpclient.HeaderElement[] elements = respHeaders[i].getElements();
\r
343 for(int j = 0; j < elements.Length; j++)
\r
345 string key = elements[j].getName();
\r
346 string val = elements[j].getValue();
\r
347 string pair = (key == null) ? ((val == null) ? "" : val) : ((val==null) ? key : key + "=" + val);
\r
348 _headers.Add(respHeaders[i].getName(), pair);
\r
355 private void ParseVersion()
\r
357 mainsoft.apache.commons.httpclient.StatusLine statusLine =
\r
358 _httpMethod.getStatusLine();
\r
359 string ver = statusLine.getHttpVersion().Trim().ToUpper();
\r
360 if(ver == "HTTP/1.1")
\r
361 _version = HttpVersion.Version11;
\r
362 else if(ver == "HTTP/1.0")
\r
363 _version = HttpVersion.Version10;
\r
368 private void FillCookies()
\r
373 mainsoft.apache.commons.httpclient.Cookie[] javaCookies =
\r
374 _state.getCookies();
\r
376 if(javaCookies == null)
\r
379 for(int i = 0; i < javaCookies.Length; i++)
\r
381 bool httpsProtocol = _httpMethod.getURI().ToString().StartsWith("https");
\r
382 if(!httpsProtocol && javaCookies[i].getSecure())
\r
384 Cookie c = new Cookie(javaCookies[i].getName(),
\r
385 javaCookies[i].getValue(),
\r
386 (javaCookies[i].getPath() == null) ? "" : javaCookies[i].getPath(),
\r
387 (javaCookies[i].getDomain() == null) ? "" : javaCookies[i].getDomain());
\r
388 java.util.Calendar jCalendar = java.util.Calendar.getInstance();
\r
389 java.util.Date jDate = javaCookies[i].getExpiryDate();
\r
392 jCalendar.setTime(javaCookies[i].getExpiryDate());
\r
393 c.Expires = (DateTime) vmw.common.DateTimeUtils.CalendarToDateTime(jCalendar);
\r
401 //todo remove unused methods
\r
402 private void FillCookies_old ()
\r
405 string val = Headers["Set-Cookie"];
\r
406 if (val != null && val.Trim () != "")
\r
409 val = Headers["Set-Cookie2"];
\r
410 if (val != null && val.Trim () != "")
\r
414 static string [] SplitValue (string input)
\r
416 string [] result = new string [2];
\r
417 int eq = input.IndexOf ('=');
\r
420 result [0] = "invalid";
\r
424 result [0] = input.Substring (0, eq).Trim ().ToUpper ();
\r
425 result [1] = input.Substring (eq + 1);
\r
431 private void SetCookie(string val)
\r
433 // Console.WriteLine("in set cookie 1 - got value : " + val);
\r
434 string[] parts = null;
\r
435 Collections.Queue options = null;
\r
436 Cookie cookie = null;
\r
438 options = new Collections.Queue (val.Split (';'));
\r
439 parts = SplitValue ((string) options.Dequeue()); // NAME=VALUE must be first
\r
441 cookie = new Cookie (parts[0], parts[1]);
\r
443 while (options.Count > 0)
\r
445 parts = SplitValue ((string) options.Dequeue());
\r
446 switch (parts [0])
\r
449 if (cookie.Comment == null)
\r
450 cookie.Comment = parts[1];
\r
453 if (cookie.CommentUri == null)
\r
454 cookie.CommentUri = new Uri(parts[1]);
\r
457 cookie.Discard = true;
\r
460 if (cookie.Domain == "")
\r
461 cookie.Domain = parts[1];
\r
463 case "MAX-AGE": // RFC Style Set-Cookie2
\r
464 if (cookie.Expires == DateTime.MinValue)
\r
465 cookie.Expires = cookie.TimeStamp.AddSeconds (Int32.Parse (parts[1]));
\r
467 case "EXPIRES": // Netscape Style Set-Cookie
\r
468 if (cookie.Expires == DateTime.MinValue)
\r
470 //FIXME: Does DateTime parse something like: "Sun, 17-Jan-2038 19:14:07 GMT"?
\r
471 //cookie.Expires = DateTime.ParseExact (parts[1]);
\r
472 cookie.Expires = DateTime.Now.AddDays (1);
\r
476 cookie.Path = parts[1];
\r
479 if (cookie.Port == null)
\r
480 cookie.Port = parts[1];
\r
483 cookie.Secure = true;
\r
486 cookie.Version = Int32.Parse (parts[1]);
\r
491 if (_cookies == null)
\r
492 _cookies = new CookieCollection();
\r
494 if (cookie.Domain == "")
\r
495 cookie.Domain = _uri.Host;
\r
497 // Console.WriteLine("adding cookie " + cookie + " to collection");
\r
498 _cookies.Add (cookie);
\r
499 // Console.WriteLine("exit from method...");
\r
502 private void SetCookie2 (string cookies_str)
\r
504 string [] cookies = cookies_str.Split (',');
\r
505 foreach (string cookie_str in cookies)
\r
506 SetCookie (cookie_str);
\r