BaseRequest.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.IO;
  3. using System.Web;
  4. using System.Collections;
  5. using System.Net;
  6. using System.Collections.Specialized;
  7. namespace MonoTests.SystemWeb.Framework
  8. {
  9. /// <summary>
  10. /// The base request container. Provides access to <see cref="Url"/> and
  11. /// <see cref="UserAgent"/> and creates <see cref="BaseWorkerRequest"/>
  12. /// in web appdomain.
  13. /// </summary>
  14. /// <seealso cref="Url"/>
  15. /// <seealso cref="UserAgent"/>
  16. /// <seealso cref="BaseWorkerRequest"/>
  17. [Serializable]
  18. public class BaseRequest
  19. {
  20. string _url;
  21. /// <summary>
  22. /// The default constructor. Does nothing.
  23. /// </summary>
  24. public BaseRequest ()
  25. {
  26. }
  27. /// <summary>
  28. /// Creates instance of <see cref="BaseRequest"/> and initializes
  29. /// <see cref="Url"/> property.
  30. /// </summary>
  31. /// <param name="url">The initial value of <see cref="Url"/> property.</param>
  32. /// <seealso cref="Url"/>
  33. public BaseRequest (string url)
  34. : this ()
  35. {
  36. this._url = url;
  37. }
  38. /// <summary>
  39. /// The URL to make the request to.
  40. /// </summary>
  41. public virtual string Url
  42. {
  43. get { return _url; }
  44. set { _url = value; }
  45. }
  46. string _userAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";
  47. /// <summary>
  48. /// The user-agent HTTP header string. By default is initialized by the same
  49. /// string as sent by Internet Explorer 6.
  50. /// </summary>
  51. public virtual string UserAgent
  52. {
  53. get { return _userAgent; }
  54. set { _userAgent = value; }
  55. }
  56. /// <summary>
  57. /// Create a new <see cref="HttpWorkerRequest"/> from data contained in this
  58. /// <see cref="BaseRequest"/>. The returned object must also implement
  59. /// <see cref="IForeignData"/> interface. <see cref="BaseRequest"/> stores
  60. /// the TextWriter in foreign data of the worker request, to use it later in
  61. /// <see cref="ExtractResponse"/>.
  62. /// </summary>
  63. /// <returns>A new <see cref="HttpWorkerRequest"/>.</returns>
  64. /// <seealso cref="HttpWorkerRequest"/>
  65. /// <seealso cref="IForeignData"/>
  66. /// <seealso cref="HttpWorkerRequest"/>
  67. /// <seealso cref="ExtractResponse"/>
  68. public virtual HttpWorkerRequest CreateWorkerRequest ()
  69. {
  70. StringWriter wr = new StringWriter ();
  71. BaseWorkerRequest br = CreateBaseWorkerRequest (wr);
  72. ((IForeignData) br) [GetType ()] = wr;
  73. return br;
  74. }
  75. public virtual WebRequest CreateWebRequest (Uri baseUri, NameValueCollection headers)
  76. {
  77. return CreateHttpWebRequest (baseUri, headers);
  78. }
  79. protected virtual HttpWebRequest CreateHttpWebRequest (Uri baseUri, NameValueCollection headers)
  80. {
  81. string reqUrl = Url;
  82. if (QueryString != null && QueryString != string.Empty)
  83. reqUrl += "?" + QueryString;
  84. Uri uri = new Uri (baseUri, Url);
  85. HttpWebRequest wr = (HttpWebRequest) WebRequest.Create (uri);
  86. wr.UserAgent = UserAgent;
  87. wr.Headers.Add (headers);
  88. return wr;
  89. }
  90. /// <summary>
  91. /// This function is used by subclasses of <see cref="BaseRequest"/> to create a
  92. /// subclass of <see cref="BaseWorkerRequest"/>.
  93. /// </summary>
  94. /// <param name="wr">TextWriter that must be passed to <see cref="BaseWorkerRequest"/>.</param>
  95. /// <returns>A new instance of <see cref="BaseWorkerRequest"/>, created
  96. /// with <see cref="Url"/>, <see cref="QueryString"/> and <see cref="UserAgent"/>.</returns>
  97. /// <seealso cref="BaseWorkerRequest"/>
  98. /// <seealso cref="UserAgent"/>
  99. /// <seealso cref="Url"/>
  100. protected virtual BaseWorkerRequest CreateBaseWorkerRequest (TextWriter wr)
  101. {
  102. return new BaseWorkerRequest (Url, QueryString, wr, UserAgent);
  103. }
  104. /// <summary>
  105. /// The query string, passed to the constructor of <see cref="BaseWorkerRequest"/>.
  106. /// </summary>
  107. /// <seealso cref="BaseWorkerRequest"/>
  108. protected virtual string QueryString
  109. {
  110. get { return ""; }
  111. }
  112. /// <summary>
  113. /// Extracts the response from the completed <see cref="System.Web.HttpWorkerRequest"/>
  114. /// and returns a new <see cref="Response"/> instance.
  115. /// </summary>
  116. /// <param name="request">this must be the same request that was returned by
  117. /// CreateWorkerRequest</param>
  118. /// <returns>New <see cref="Response"/> instance, containing the results of the
  119. /// request.</returns>
  120. /// <seealso cref="System.Web.HttpWorkerRequest"/>
  121. /// <seealso cref="Response"/>
  122. public virtual Response ExtractResponse (HttpWorkerRequest request)
  123. {
  124. BaseWorkerRequest br = (BaseWorkerRequest) request;
  125. IForeignData d = (IForeignData) br;
  126. TextWriter wr = (TextWriter) d[GetType ()];
  127. d[GetType ()] = null;
  128. wr.Close ();
  129. Response r = new Response ();
  130. r.Body = wr.ToString ();
  131. return r;
  132. }
  133. public virtual Response ExtractResponse (WebResponse response)
  134. {
  135. Response r = new Response ();
  136. byte [] b = new byte [response.ContentLength];
  137. using (Stream s = response.GetResponseStream ()) {
  138. StreamReader sr = new StreamReader(s);
  139. r.Body = sr.ReadToEnd ();
  140. }
  141. return r;
  142. }
  143. }
  144. }