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
13 public class HttpWebResponse : WebResponse, IDisposable
\r
16 private mainsoft.apache.commons.httpclient.HttpMethod _httpMethod;
\r
17 private CookieCollection _cookies;
\r
18 private WebHeaderCollection _headers;
\r
19 private string _statusDescription;
\r
20 private Version _version = null;
\r
22 private string _method;
\r
23 private Stream _responseStream;
\r
24 private mainsoft.apache.commons.httpclient.HttpState _state;
\r
25 private HttpStateCache _stateCache;
\r
26 private HttpStatusCode _statusCode;
\r
27 private bool _isStatusCodeInitialized = false;
\r
29 private Type _httpStatusCodeType = typeof(HttpStatusCode);
\r
31 private sbyte [] _responseBody;
\r
32 private bool _isHttpMethodClosed = false;
\r
35 #region Constructors
\r
37 internal HttpWebResponse(mainsoft.apache.commons.httpclient.HttpMethod httpMethod,
\r
38 mainsoft.apache.commons.httpclient.HttpState state,
\r
39 HttpStateCache stateCache,
\r
40 Uri uri, string method)
\r
42 _httpMethod = httpMethod;
\r
46 _stateCache = stateCache;
\r
53 public CookieCollection Cookies
\r
57 if(_cookies == null)
\r
59 _cookies = new CookieCollection();
\r
72 public override WebHeaderCollection Headers
\r
76 if(_headers == null)
\r
78 _headers = new WebHeaderCollection();
\r
84 public override long ContentLength
\r
88 string val = Headers["Content-Length"];
\r
89 if(val == null || val.Trim().Equals(""))
\r
93 return Int64.Parse(val);
\r
103 public string ContentEncoding
\r
107 return Headers["Content-Encoding"];
\r
111 public override string ContentType
\r
115 return Headers["Content-Type"];
\r
119 public string CharacterSet
\r
123 string contentType = ContentType;
124 if (contentType == null)
126 string val = contentType.ToLower ();
127 int pos = val.IndexOf ("charset=");
131 int pos2 = val.IndexOf (';', pos);
133 ? contentType.Substring (pos)
134 : contentType.Substring (pos, pos2 - pos);
\r
138 public string Server
\r
142 return Headers ["Server"];
\r
146 public DateTime LastModified
\r
152 string val = Headers["Last-Modified"];
\r
153 return MonoHttpDate.Parse(val);
\r
157 return DateTime.Now;
\r
162 public HttpStatusCode StatusCode
\r
166 if(_isStatusCodeInitialized == false)
\r
168 int status = _httpMethod.getStatusCode();
\r
169 _statusCode = (HttpStatusCode)Enum.Parse(_httpStatusCodeType,
\r
170 Enum.GetName(_httpStatusCodeType, status));
\r
171 _isStatusCodeInitialized = true;
\r
174 return _statusCode;
\r
178 public string StatusDescription
\r
182 if(_statusDescription == null)
\r
183 _statusDescription = _httpMethod.getStatusText();
\r
184 return _statusDescription;
\r
188 public Version ProtocolVersion
\r
192 if(_version == null)
\r
198 public override Uri ResponseUri
\r
206 public string Method
\r
217 internal void ReadAllAndClose()
\r
219 if (_responseBody != null)
\r
222 object temp = null;
\r
223 if(_cookies == null)
\r
225 temp = this.Cookies;
\r
227 if(_headers == null)
\r
229 temp = this.Headers;
\r
231 if(_isStatusCodeInitialized == false)
\r
233 temp = this.StatusCode;
\r
235 if(_statusDescription == null)
\r
237 temp = this.StatusDescription;
\r
239 if(_version == null)
\r
241 temp = this.ProtocolVersion;
\r
244 _responseBody = _httpMethod.getResponseBody();
\r
246 Console.WriteLine("The response body as string == {0}", System.Text.Encoding.UTF8.GetString((byte[])vmw.common.TypeUtils.ToByteArray(_responseBody)));
\r
251 public override Stream GetResponseStream()
\r
255 if(_responseStream == null)
\r
257 Type t = Type.GetType("System.IO.ConsoleReadStream", true);
\r
258 object [] param = null;
\r
259 if (_responseBody == null)
\r
261 param = new object[]{_httpMethod.getResponseBodyAsStream()};
\r
265 param = new object[]{new java.io.ByteArrayInputStream(_responseBody)};
\r
267 _responseStream = (Stream) Activator.CreateInstance(t, param);
\r
269 return _responseStream;
\r
273 Console.WriteLine("Exception caught!");
\r
274 Console.WriteLine(e.GetType() + ":" + e.Message + "\n" + e.StackTrace);
\r
279 public override void Close()
\r
283 if(_responseStream != null)
\r
284 _responseStream.Close();
\r
288 _responseStream = null;
\r
290 if (!_isHttpMethodClosed)
\r
292 _httpMethod.releaseConnection();
\r
293 if(_stateCache != null && _state != null)
\r
295 _stateCache.ReleaseHttpState(_state);
\r
297 _stateCache = null;
\r
299 _isHttpMethodClosed = true;
\r
304 public string GetResponseHeader(string headerName)
\r
306 return Headers[headerName];
\r
309 public override int GetHashCode()
\r
311 return base.GetHashCode();
\r
315 protected virtual void Dispose(bool disposing)
\r
319 if(_responseStream != null)
\r
320 _responseStream.Close();
\r
324 _responseStream = null;
\r
326 if (!_isHttpMethodClosed)
\r
328 _httpMethod.releaseConnection();
\r
329 _isHttpMethodClosed = true;
\r
334 private void FillHeaders()
\r
336 mainsoft.apache.commons.httpclient.Header[] respHeaders =
\r
337 _httpMethod.getResponseHeaders();
\r
338 if(respHeaders == null)
\r
340 for(int i = 0; i < respHeaders.Length; i++)
\r
343 mainsoft.apache.commons.httpclient.HeaderElement[] elements = respHeaders[i].getElements();
\r
344 for(int j = 0; j < elements.Length; j++)
\r
346 string key = elements[j].getName();
\r
347 string val = elements[j].getValue();
\r
348 string pair = (key == null) ? ((val == null) ? "" : val) : ((val==null) ? key : key + "=" + val);
\r
349 _headers.Add(respHeaders[i].getName(), pair);
\r
356 private void ParseVersion()
\r
358 mainsoft.apache.commons.httpclient.StatusLine statusLine =
\r
359 _httpMethod.getStatusLine();
\r
360 string ver = statusLine.getHttpVersion().Trim().ToUpper();
\r
361 if(ver == "HTTP/1.1")
\r
362 _version = HttpVersion.Version11;
\r
363 else if(ver == "HTTP/1.0")
\r
364 _version = HttpVersion.Version10;
\r
369 private void FillCookies()
374 mainsoft.apache.commons.httpclient.Cookie[] javaCookies =
377 if(javaCookies == null)
380 for(int i = 0; i < javaCookies.Length; i++)
382 bool httpsProtocol = _httpMethod.getURI().ToString().StartsWith("https");
383 if(!httpsProtocol && javaCookies[i].getSecure())
385 Cookie c = new Cookie(javaCookies[i].getName(),
386 javaCookies[i].getValue(),
387 (javaCookies[i].getPath() == null) ? "" : javaCookies[i].getPath(),
388 (javaCookies[i].getDomain() == null) ? "" : javaCookies[i].getDomain());
389 java.util.Calendar jCalendar = java.util.Calendar.getInstance();
390 java.util.Date jDate = javaCookies[i].getExpiryDate();
393 jCalendar.setTime(javaCookies[i].getExpiryDate());
394 c.Expires = (DateTime) vmw.common.DateTimeUtils.CalendarToDateTime(jCalendar);
402 //todo remove unused methods
403 private void FillCookies_old ()
406 string val = Headers["Set-Cookie"];
407 if (val != null && val.Trim () != "")
410 val = Headers["Set-Cookie2"];
411 if (val != null && val.Trim () != "")
415 static string [] SplitValue (string input)
417 string [] result = new string [2];
418 int eq = input.IndexOf ('=');
421 result [0] = "invalid";
425 result [0] = input.Substring (0, eq).Trim ().ToUpper ();
426 result [1] = input.Substring (eq + 1);
432 private void SetCookie(string val)
\r
434 // Console.WriteLine("in set cookie 1 - got value : " + val);
435 string[] parts = null;
436 Collections.Queue options = null;
437 Cookie cookie = null;
439 options = new Collections.Queue (val.Split (';'));
440 parts = SplitValue ((string) options.Dequeue()); // NAME=VALUE must be first
442 cookie = new Cookie (parts[0], parts[1]);
444 while (options.Count > 0)
\r
446 parts = SplitValue ((string) options.Dequeue());
447 switch (parts [0])
\r
450 if (cookie.Comment == null)
451 cookie.Comment = parts[1];
454 if (cookie.CommentUri == null)
455 cookie.CommentUri = new Uri(parts[1]);
458 cookie.Discard = true;
461 if (cookie.Domain == "")
462 cookie.Domain = parts[1];
464 case "MAX-AGE": // RFC Style Set-Cookie2
465 if (cookie.Expires == DateTime.MinValue)
466 cookie.Expires = cookie.TimeStamp.AddSeconds (Int32.Parse (parts[1]));
468 case "EXPIRES": // Netscape Style Set-Cookie
469 if (cookie.Expires == DateTime.MinValue)
\r
471 //FIXME: Does DateTime parse something like: "Sun, 17-Jan-2038 19:14:07 GMT"?
472 //cookie.Expires = DateTime.ParseExact (parts[1]);
473 cookie.Expires = DateTime.Now.AddDays (1);
477 cookie.Path = parts[1];
480 if (cookie.Port == null)
481 cookie.Port = parts[1];
484 cookie.Secure = true;
487 cookie.Version = Int32.Parse (parts[1]);
492 if (_cookies == null)
493 _cookies = new CookieCollection();
495 if (cookie.Domain == "")
496 cookie.Domain = _uri.Host;
498 // Console.WriteLine("adding cookie " + cookie + " to collection");
499 _cookies.Add (cookie);
500 // Console.WriteLine("exit from method...");
503 private void SetCookie2 (string cookies_str)
505 string [] cookies = cookies_str.Split (',');
506 foreach (string cookie_str in cookies)
507 SetCookie (cookie_str);