2 // System.Web.HttpRequest
\r
5 // Patrik Torstensson (Patrik.Torstensson@labs2.com)
\r
6 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
\r
8 // (c) 2001, 2002 Patrick Torstensson
\r
9 // (c) 2002 Ximian, Inc. (http://www.ximian.com)
\r
12 using System.Collections;
\r
13 using System.Collections.Specialized;
\r
16 using System.Web.Configuration;
\r
17 using System.Web.Util;
\r
19 namespace System.Web {
\r
20 [MonoTODO("Review security in all path access function")]
\r
21 public sealed class HttpRequest {
\r
22 private string [] _arrAcceptTypes;
\r
23 private string [] _arrUserLanguages;
\r
25 private byte [] _arrRawContent;
\r
26 private int _iContentLength;
\r
28 private string _sContentType;
\r
29 private string _sHttpMethod;
\r
30 private string _sRawUrl;
\r
31 private string _sUserAgent;
\r
32 private string _sUserHostAddress;
\r
33 private string _sUserHostName;
\r
34 private string _sPath;
\r
35 private string _sPathInfo;
\r
36 private string _sFilePath;
\r
37 private string baseVirtualDir;
\r
38 private string _sPathTranslated;
\r
39 private string _sQueryStringRaw;
\r
40 private string _sRequestType;
\r
41 private string _sRequestRootVirtualDir;
\r
43 private Encoding _oContentEncoding;
\r
45 private Uri _oUriReferrer;
\r
48 private int _iTotalBytes;
\r
50 private HttpContext _oContext;
\r
52 private HttpWorkerRequest _WorkerRequest;
\r
53 private HttpRequestStream _oInputStream;
\r
54 private HttpClientCertificate _ClientCert;
\r
56 private HttpValueCollection _oServerVariables;
\r
57 private HttpValueCollection _oHeaders;
\r
58 private HttpValueCollection _oQueryString;
\r
59 private HttpValueCollection _oFormData;
\r
60 private HttpValueCollection _oParams;
\r
62 private HttpBrowserCapabilities _browser;
\r
64 private HttpCookieCollection cookies;
\r
65 private bool rewritten;
\r
67 HttpRequestStream requestFilter;
69 public HttpRequest(string Filename, string Url, string Querystring) {
\r
70 _iContentLength = -1;
\r
73 _WorkerRequest = null;
\r
74 _sPathTranslated = Filename;
\r
75 _sRequestType = "GET";
\r
77 _oUrl = new Uri(Url);
\r
78 _sPath = _oUrl.AbsolutePath;
\r
80 _sQueryStringRaw = Querystring;
\r
81 _oQueryString = new HttpValueCollection(Querystring, true, WebEncoding.Encoding);
\r
84 internal HttpRequest(HttpWorkerRequest WorkRequest, HttpContext Context) {
\r
85 _WorkerRequest = WorkRequest;
\r
86 _oContext = Context;
\r
88 _iContentLength = -1;
\r
92 static private string MakeServerVariableFromHeader(string header) {
\r
93 return "HTTP_" + header.ToUpper().Replace("-", "_");
\r
96 [MonoTODO("Need to support non-raw mode also..")]
\r
97 private string GetAllHeaders(bool Raw) {
\r
98 StringBuilder oData;
\r
100 if (null == _WorkerRequest) {
\r
104 oData = new StringBuilder(512);
\r
106 string sHeaderValue;
\r
107 string sHeaderName;
\r
110 // Add all know headers
\r
111 for (; iCount != 40; iCount++) {
\r
112 sHeaderValue = _WorkerRequest.GetKnownRequestHeader(iCount);
\r
113 if (null != sHeaderValue && sHeaderValue.Length > 0) {
\r
114 sHeaderName = _WorkerRequest.GetKnownRequestHeader(iCount);
\r
115 if (null != sHeaderName && sHeaderName.Length > 0) {
\r
116 oData.Append(sHeaderName);
\r
117 oData.Append(": ");
\r
118 oData.Append(sHeaderValue);
\r
119 oData.Append("\r\n");
\r
124 // Get all other headers
\r
125 string [][] arrUnknownHeaders = _WorkerRequest.GetUnknownRequestHeaders();
\r
126 if (null != arrUnknownHeaders) {
\r
127 for (iCount = 0; iCount != arrUnknownHeaders.Length; iCount++) {
\r
128 oData.Append(arrUnknownHeaders[iCount][0]);
\r
129 oData.Append(": ");
\r
130 oData.Append(arrUnknownHeaders[iCount][1]);
\r
131 oData.Append("\r\n");
\r
135 return oData.ToString();
\r
138 [MonoTODO("We need to handly 'dynamic' variables like AUTH_USER, that can be changed during runtime... special collection")]
\r
139 private void ParseServerVariables() {
\r
140 if (null == _WorkerRequest) {
\r
144 if (_oServerVariables == null) {
\r
147 _oServerVariables = new HttpValueCollection();
\r
149 _oServerVariables.Add("ALL_HTTP", GetAllHeaders(false));
\r
150 _oServerVariables.Add("ALL_RAW", GetAllHeaders(true));
\r
152 _oServerVariables.Add("APPL_MD_PATH", _WorkerRequest.GetServerVariable("APPL_MD_PATH"));
\r
153 _oServerVariables.Add("AUTH_PASSWORD", _WorkerRequest.GetServerVariable("AUTH_PASSWORD"));
\r
154 _oServerVariables.Add("CERT_COOKIE", _WorkerRequest.GetServerVariable("CERT_COOKIE"));
\r
155 _oServerVariables.Add("CERT_FLAGS", _WorkerRequest.GetServerVariable("CERT_FLAGS"));
\r
156 _oServerVariables.Add("CERT_ISSUER", _WorkerRequest.GetServerVariable("CERT_ISSUER"));
\r
157 _oServerVariables.Add("CERT_KEYSIZE", _WorkerRequest.GetServerVariable("CERT_KEYSIZE"));
\r
158 _oServerVariables.Add("CERT_SECRETKEYSIZE", _WorkerRequest.GetServerVariable("CERT_SECRETKEYSIZE"));
\r
159 _oServerVariables.Add("CERT_SERIALNUMBER", _WorkerRequest.GetServerVariable("CERT_SERIALNUMBER"));
\r
160 _oServerVariables.Add("CERT_SERVER_ISSUER", _WorkerRequest.GetServerVariable("CERT_SERVER_ISSUER"));
\r
161 _oServerVariables.Add("CERT_SERVER_SUBJECT", _WorkerRequest.GetServerVariable("CERT_SERVER_SUBJECT"));
\r
162 _oServerVariables.Add("CERT_SUBJECT", _WorkerRequest.GetServerVariable("CERT_SUBJECT"));
\r
164 _oServerVariables.Add("GATEWAY_INTERFACE", _WorkerRequest.GetServerVariable("GATEWAY_INTERFACE"));
\r
165 _oServerVariables.Add("HTTPS", _WorkerRequest.GetServerVariable("HTTPS"));
\r
166 _oServerVariables.Add("HTTPS_KEYSIZE", _WorkerRequest.GetServerVariable("HTTPS_KEYSIZE"));
\r
167 _oServerVariables.Add("HTTPS_SECRETKEYSIZE", _WorkerRequest.GetServerVariable("HTTPS_SECRETKEYSIZE"));
\r
169 _oServerVariables.Add("CONTENT_TYPE", ContentType);
\r
170 _oServerVariables.Add("HTTPS_SERVER_ISSUER", _WorkerRequest.GetServerVariable("HTTPS_SERVER_ISSUER"));
\r
171 _oServerVariables.Add("HTTPS_SERVER_SUBJECT", _WorkerRequest.GetServerVariable("HTTPS_SERVER_SUBJECT"));
\r
172 _oServerVariables.Add("INSTANCE_ID", _WorkerRequest.GetServerVariable("INSTANCE_ID"));
\r
173 _oServerVariables.Add("INSTANCE_META_PATH", _WorkerRequest.GetServerVariable("INSTANCE_META_PATH"));
\r
174 _oServerVariables.Add("LOCAL_ADDR", _WorkerRequest.GetLocalAddress());
\r
175 _oServerVariables.Add("REMOTE_ADDR", UserHostAddress);
\r
176 _oServerVariables.Add("REMOTE_HOST", UserHostName);
\r
177 _oServerVariables.Add("REMOTE_PORT", _WorkerRequest.GetRemotePort ().ToString ());
\r
178 _oServerVariables.Add("REQUEST_METHOD", HttpMethod);
\r
179 _oServerVariables.Add("SERVER_NAME", _WorkerRequest.GetServerName());
\r
180 _oServerVariables.Add("SERVER_PORT", _WorkerRequest.GetLocalPort().ToString());
\r
181 _oServerVariables.Add("SERVER_PROTOCOL", _WorkerRequest.GetHttpVersion());
\r
182 _oServerVariables.Add("SERVER_SOFTWARE", _WorkerRequest.GetServerVariable("SERVER_SOFTWARE"));
\r
184 if (_WorkerRequest.IsSecure()) {
\r
185 _oServerVariables.Add("SERVER_PORT_SECURE", "1");
\r
187 _oServerVariables.Add("SERVER_PORT_SECURE", "0");
\r
190 sTmp = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);
\r
191 if (null != sTmp) {
\r
192 _oServerVariables.Add("CONTENT_LENGTH", sTmp);
\r
195 // TODO: Should be dynamic
\r
196 if (null != _oContext.User && _oContext.User.Identity.IsAuthenticated) {
\r
197 _oServerVariables.Add("AUTH_TYPE", _oContext.User.Identity.AuthenticationType);
\r
198 _oServerVariables.Add("AUTH_USER", _oContext.User.Identity.Name);
\r
200 _oServerVariables.Add("AUTH_TYPE", "");
\r
201 _oServerVariables.Add("AUTH_USER", "");
\r
204 _oServerVariables.Add("PATH_INFO", PathInfo);
\r
205 _oServerVariables.Add("PATH_TRANSLATED", PhysicalPath);
\r
206 _oServerVariables.Add("QUERY_STRING", QueryStringRaw);
\r
207 _oServerVariables.Add("SCRIPT_NAME", FilePath);
\r
210 _oServerVariables.MakeReadOnly();
\r
214 private void ParseFormData ()
\r
216 if (_oFormData != null)
\r
219 string contentType = ContentType;
\r
220 if (0 == String.Compare (contentType, "application/x-www-form-urlencoded", true)) {
221 byte [] arrData = GetRawContent ();
222 Encoding enc = ContentEncoding;
223 string data = enc.GetString (arrData);
224 _oFormData = new HttpValueCollection (data, true, enc);
\r
226 if (!ContentType.StartsWith ("multipart/form-data")) {
\r
227 if (contentType.Length > 0)
228 Console.WriteLine ("Content-Type -> {0} not supported", contentType);
229 _oFormData = new HttpValueCollection ();
233 MultipartContentElement [] parts = GetMultipartFormData ();
234 _oFormData = new HttpValueCollection ();
235 if (parts == null) return;
237 foreach (MultipartContentElement p in parts) {
238 if (!p.IsFormItem) continue;
239 _oFormData.Add (p.Name, p.GetString (ContentEncoding));
244 [MonoTODO("void Dispose")]
\r
245 internal void Dispose() {
\r
248 private byte [] GetRawContent ()
\r
250 if (_arrRawContent != null)
\r
251 return _arrRawContent;
\r
253 if (null == _WorkerRequest) {
\r
254 if (QueryStringRaw == null)
\r
256 char [] q = QueryStringRaw.ToCharArray ();
\r
257 _arrRawContent = new byte [q.Length];
\r
258 for (int i = 0; i < q.Length; i++)
\r
259 _arrRawContent [i] = (byte) q [i];
\r
260 return _arrRawContent;
\r
263 _arrRawContent = _WorkerRequest.GetPreloadedEntityBody ();
\r
264 if (_arrRawContent == null)
\r
265 _arrRawContent = new byte [0];
\r
267 int length = ContentLength;
\r
268 if (_WorkerRequest.IsEntireEntityBodyIsPreloaded () || length <= _arrRawContent.Length)
\r
269 return _arrRawContent;
\r
271 byte [] arrBuffer = new byte [Math.Min (16384, length)];
\r
272 MemoryStream ms = new MemoryStream (arrBuffer.Length);
\r
273 ms.Write (_arrRawContent, 0, _arrRawContent.Length);
\r
275 for (int loaded = _arrRawContent.Length; loaded < length; loaded += read) {
\r
276 read = _WorkerRequest.ReadEntityBody (arrBuffer, arrBuffer.Length);
\r
280 ms.Write (arrBuffer, 0, read);
\r
283 byte [] msBuffer = ms.GetBuffer ();
284 if (msBuffer.Length == length)
285 _arrRawContent = msBuffer;
287 _arrRawContent = ms.ToArray ();
289 if (userFilter != null) {
290 requestFilter.Set (_arrRawContent, 0, _arrRawContent.Length);
291 int userLength = Convert.ToInt32 (userFilter.Length - userFilter.Position);
292 byte [] filtered = new byte [userLength];
293 userFilter.Read (filtered, 0, userLength);
294 _arrRawContent = filtered;
297 return _arrRawContent;
\r
300 public string [] AcceptTypes {
\r
302 if (null == _arrAcceptTypes && null != _WorkerRequest) {
\r
303 _arrAcceptTypes = HttpHelper.ParseMultiValueHeader(_WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderAccept));
\r
306 return _arrAcceptTypes;
\r
311 public string ApplicationPath {
\r
313 if (null != _WorkerRequest) {
\r
314 return _WorkerRequest.GetAppPath();
\r
321 public HttpBrowserCapabilities Browser {
\r
323 if (_browser == null)
\r
324 _browser = new HttpBrowserCapabilities ();
\r
329 set { _browser = value; }
\r
332 public HttpClientCertificate ClientCertificate {
\r
334 if (null == _ClientCert) {
\r
335 _ClientCert = new HttpClientCertificate(_oContext);
\r
338 return _ClientCert;
\r
342 private string GetValueFromHeader (string header, string attr)
\r
344 int where = header.IndexOf (attr + '=');
\r
348 where += attr.Length + 1;
\r
349 int max = header.Length;
\r
351 return String.Empty;
\r
353 char ending = header [where];
\r
357 int end = header.Substring (where + 1).IndexOf (ending);
\r
359 return (ending == '"') ? null : header.Substring (where);
\r
361 return header.Substring (where, end);
\r
364 public Encoding ContentEncoding
\r
367 if (_oContentEncoding == null) {
\r
368 if (_WorkerRequest != null &&
\r
369 (!_WorkerRequest.HasEntityBody () || ContentType != String.Empty)) {
\r
370 _oContentEncoding = WebEncoding.Encoding;
\r
373 charset = GetValueFromHeader (_sContentType, "charset");
\r
375 _oContentEncoding = Encoding.GetEncoding (charset);
\r
377 _oContentEncoding = WebEncoding.Encoding;
\r
382 return _oContentEncoding;
\r
386 _oContentEncoding = value;
\r
390 public int ContentLength {
\r
392 if (_iContentLength == -1 && null != _WorkerRequest) {
\r
393 string sLength = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);
\r
394 if (sLength != null) {
\r
396 _iContentLength = Int32.Parse(sLength);
\r
403 if (_iContentLength < 0) {
\r
404 _iContentLength = 0;
\r
407 return _iContentLength;
\r
411 public string ContentType {
\r
413 if (null == _sContentType) {
\r
414 if (null != _WorkerRequest) {
\r
415 _sContentType = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentType);
\r
418 if (null == _sContentType) {
\r
419 _sContentType = string.Empty;
\r
423 return _sContentType;
\r
427 static private string GetCookieValue (string str, int length, ref int i)
\r
433 while (k < length && Char.IsWhiteSpace (str [k]))
\r
437 while (k < length && str [k] != ';')
\r
441 return str.Substring (begin, i - begin).Trim ();
\r
444 static private string GetCookieName (string str, int length, ref int i)
\r
450 while (k < length && Char.IsWhiteSpace (str [k]))
\r
454 while (k < length && str [k] != ';' && str [k] != '=')
\r
458 return str.Substring (begin, k - begin).Trim ();
\r
461 private void GetCookies ()
\r
463 string header = _WorkerRequest.GetKnownRequestHeader (HttpWorkerRequest.HeaderCookie);
\r
464 if (header == null || header.Length == 0)
\r
468 * cookie = "Cookie:" cookie-version
\r
469 * 1*((";" | ",") cookie-value)
\r
470 * cookie-value = NAME "=" VALUE [";" path] [";" domain]
\r
471 * cookie-version = "$Version" "=" value
\r
474 * path = "$Path" "=" value
\r
475 * domain = "$Domain" "=" value
\r
477 * MS ignores $Version!
\r
478 * ',' as a separator produces errors.
\r
481 string [] name_values = header.Trim ().Split (';');
\r
482 int length = name_values.Length;
\r
483 HttpCookie cookie = null;
\r
485 for (int i = 0; i < length; i++) {
\r
487 string name_value = name_values [i].Trim ();
\r
488 string name = GetCookieName (name_value, name_value.Length, ref pos);
\r
489 string value = GetCookieValue (name_value, name_value.Length, ref pos);
\r
490 if (cookie != null) {
\r
491 if (name == "$Path") {
\r
492 cookie.Path = value;
\r
494 } else if (name == "$Domain") {
\r
495 cookie.Domain = value;
\r
498 cookies.Add (cookie);
\r
502 cookie = new HttpCookie (name, value);
\r
505 if (cookie != null)
\r
506 cookies.Add (cookie);
\r
509 public HttpCookieCollection Cookies
\r
512 if (cookies == null) {
\r
513 cookies = new HttpCookieCollection (null, false);
\r
514 if (_WorkerRequest != null)
\r
522 public string CurrentExecutionFilePath {
\r
528 public string FilePath {
\r
530 if (null == _sFilePath && null != _WorkerRequest) {
\r
531 _sFilePath = _WorkerRequest.GetFilePath();
\r
533 _sFilePath = UrlUtils.Reduce (_sFilePath);
\r
534 } catch (Exception e) {
\r
535 throw new HttpException (403, "Forbidden");
\r
543 HttpFileCollection files;
\r
544 public HttpFileCollection Files {
\r
549 files = new HttpFileCollection ();
556 void FillPostedFiles ()
558 if (!ContentType.StartsWith ("multipart/form-data")) return;
560 MultipartContentElement [] parts = GetMultipartFormData ();
561 if (parts == null) return;
563 foreach (MultipartContentElement p in parts) {
564 if (!p.IsFile) continue;
565 files.AddFile (p.Name, p.GetFile ());
569 MultipartContentElement [] multipartContent;
570 MultipartContentElement [] GetMultipartFormData ()
572 if (multipartContent != null) return multipartContent;
574 byte [] raw = GetRawContent ();
575 byte [] boundary = Encoding.ASCII.GetBytes (("--" + GetValueFromHeader (ContentType, "boundary")).ToCharArray ());
576 return multipartContent = HttpMultipartContentParser.Parse (raw, boundary, ContentEncoding);
579 public Stream Filter {
581 if (userFilter != null)
584 if (requestFilter == null)
585 requestFilter = new HttpRequestStream ();
587 // This is an empty stream. It will not contain data until GetRawContent
588 return requestFilter;
592 if (requestFilter == null)
593 throw new HttpException ("Invalid request filter.");
600 public NameValueCollection Form {
\r
604 return (NameValueCollection) _oFormData;
\r
608 public NameValueCollection Headers {
\r
610 if (_oHeaders == null) {
\r
611 _oHeaders = new HttpValueCollection();
\r
613 if (null != _WorkerRequest) {
\r
614 string sHeaderValue;
\r
615 string sHeaderName;
\r
618 // Add all know headers
\r
619 for (; iCount != 40; iCount++) {
\r
620 sHeaderValue = _WorkerRequest.GetKnownRequestHeader(iCount);
\r
621 if (null != sHeaderValue && sHeaderValue.Length > 0) {
\r
622 sHeaderName = HttpWorkerRequest.GetKnownRequestHeaderName(iCount);
\r
623 if (null != sHeaderName && sHeaderName.Length > 0) {
\r
624 _oHeaders.Add(sHeaderName, sHeaderValue);
\r
629 // Get all other headers
\r
630 string [][] arrUnknownHeaders = _WorkerRequest.GetUnknownRequestHeaders();
\r
631 if (null != arrUnknownHeaders) {
\r
632 for (iCount = 0; iCount != arrUnknownHeaders.Length; iCount++) {
\r
633 _oHeaders.Add(arrUnknownHeaders[iCount][0], arrUnknownHeaders[iCount][1]);
\r
638 // Make headers read-only
\r
639 _oHeaders.MakeReadOnly();
\r
642 return (NameValueCollection) _oHeaders;
\r
646 public string HttpMethod {
\r
648 if (null == _sHttpMethod) {
\r
649 if (null != _WorkerRequest) {
\r
650 _sHttpMethod = _WorkerRequest.GetHttpVerbName().ToUpper();
\r
653 if (_sHttpMethod == null) {
\r
654 if (RequestType != null)
\r
655 _sHttpMethod = RequestType;
\r
657 _sHttpMethod = "GET";
\r
661 return _sHttpMethod;
\r
665 public Stream InputStream {
\r
667 if (_oInputStream == null) {
\r
668 byte [] arrInputData = GetRawContent ();
\r
670 if (null != arrInputData) {
\r
671 _oInputStream = new HttpRequestStream(arrInputData, 0, arrInputData.Length);
\r
673 _oInputStream = new HttpRequestStream(null, 0, 0);
\r
677 return _oInputStream;
\r
681 public bool IsAuthenticated {
\r
683 if (_oContext != null && _oContext.User != null && _oContext.User.Identity != null) {
\r
684 return _oContext.User.Identity.IsAuthenticated;
\r
691 public bool IsSecureConnection {
\r
693 if (null != _WorkerRequest) {
\r
694 return _WorkerRequest.IsSecure();
\r
701 public string this [string sKey] {
\r
703 string result = QueryString [sKey];
\r
704 if (result != null)
\r
707 result = Form [sKey];
\r
708 if (result != null)
\r
711 HttpCookie cookie = Cookies [sKey];
\r
712 if (cookie != null)
\r
713 return cookie.Value;
\r
715 return ServerVariables [sKey];
\r
719 public NameValueCollection Params {
\r
721 if (_oParams == null) {
\r
722 _oParams = new HttpValueCollection();
\r
724 _oParams.Merge(QueryString);
\r
725 _oParams.Merge(Form);
\r
726 _oParams.Merge(ServerVariables);
\r
727 string [] cookies = Cookies.AllKeys;
\r
728 foreach (string k in cookies)
\r
729 _oParams.Add (k, Cookies [k].ToString ());
\r
730 _oParams.MakeReadOnly();
\r
733 return (NameValueCollection) _oParams;
\r
737 public string Path {
\r
739 if (_sPath == null) {
\r
740 if (null != _WorkerRequest) {
\r
741 _sPath = _WorkerRequest.GetUriPath();
\r
744 if (_sPath == null) {
\r
745 _sPath = string.Empty;
\r
753 public string PathInfo {
\r
755 if (_sPathInfo == null) {
\r
756 if (null != _WorkerRequest) {
\r
757 _sPathInfo = _WorkerRequest.GetPathInfo();
\r
760 if (_sPathInfo == null) {
\r
761 _sPathInfo = string.Empty;
\r
769 public string PhysicalApplicationPath {
\r
771 if (null != _WorkerRequest) {
\r
772 return _WorkerRequest.GetAppPathTranslated();
\r
779 public string PhysicalPath {
\r
781 if (_sPathTranslated == null && _WorkerRequest != null) {
\r
783 _sPathTranslated = _WorkerRequest.GetFilePathTranslated ();
\r
785 string verifyPath = _WorkerRequest.MapPath (FilePath);
\r
786 if (null == _sPathTranslated)
\r
787 _sPathTranslated = verifyPath;
\r
790 return _sPathTranslated;
\r
794 public NameValueCollection QueryString {
\r
796 if (_oQueryString == null) {
\r
797 _oQueryString = new HttpValueCollection(QueryStringRaw, true,
\r
798 WebEncoding.Encoding);
\r
801 return _oQueryString;
\r
805 // Used to parse the querystring
\r
806 internal string QueryStringRaw {
\r
808 if (_sQueryStringRaw == null && null != _WorkerRequest) {
\r
809 byte [] arrQuerystringBytes = _WorkerRequest.GetQueryStringRawBytes();
\r
810 if (null != arrQuerystringBytes && arrQuerystringBytes.Length > 0) {
\r
811 _sQueryStringRaw = ContentEncoding.GetString(arrQuerystringBytes);
\r
813 _sQueryStringRaw = _WorkerRequest.GetQueryString();
\r
817 if (_sQueryStringRaw == null) {
\r
818 _sQueryStringRaw = string.Empty;
\r
821 return _sQueryStringRaw;
\r
825 _sQueryStringRaw = value;
\r
826 _oQueryString = null;
\r
827 _arrRawContent = null;
\r
832 public string RawUrl {
\r
834 if (null == _sRawUrl) {
\r
835 if (null != _WorkerRequest) {
\r
836 _sRawUrl = _WorkerRequest.GetRawUrl();
\r
839 if (QueryStringRaw != null && QueryStringRaw.Length > 0) {
\r
840 _sRawUrl = _sRawUrl + "?" + QueryStringRaw;
\r
849 public string RequestType {
\r
851 if (null == _sRequestType) {
\r
855 return _sRequestType;
\r
859 _sRequestType = value;
\r
864 public NameValueCollection ServerVariables {
\r
866 ParseServerVariables();
\r
868 return (NameValueCollection) _oServerVariables;
\r
872 public int TotalBytes {
\r
874 if (_iTotalBytes == -1) {
\r
875 if (null != InputStream) {
\r
876 _iTotalBytes = (int) InputStream.Length;
\r
882 return _iTotalBytes;
\r
888 if (_oUrl != null || _WorkerRequest == null)
\r
891 string qs = QueryStringRaw;
\r
897 UriBuilder ub = new UriBuilder (_WorkerRequest.GetProtocol (),
\r
898 _WorkerRequest.GetServerName (),
\r
899 _WorkerRequest.GetLocalPort (),
\r
908 public Uri UrlReferrer {
\r
910 if (null == _oUriReferrer && null != _WorkerRequest) {
\r
911 string sReferrer = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderReferer);
\r
912 if (null != sReferrer && sReferrer.Length > 0) {
\r
914 if (sReferrer.IndexOf("://") >= 0) {
\r
915 _oUriReferrer = new Uri(sReferrer);
\r
917 _oUriReferrer = new Uri(this.Url, sReferrer);
\r
920 catch (Exception) {
\r
925 return _oUriReferrer;
\r
929 public string UserAgent {
\r
931 if (_sUserAgent == null && _WorkerRequest != null) {
\r
932 _sUserAgent = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderUserAgent);
\r
935 if (_sUserAgent == null) {
\r
936 _sUserAgent = string.Empty;
\r
939 return _sUserAgent;
\r
943 public string UserHostAddress {
\r
945 if (_sUserHostAddress == null && null != _WorkerRequest) {
\r
946 _sUserHostAddress = _WorkerRequest.GetRemoteAddress();
\r
949 if (_sUserHostAddress == null || _sUserHostAddress.Length == 0) {
\r
950 _sUserHostAddress = "127.0.0.1";
\r
953 return _sUserHostAddress;
\r
957 public string UserHostName {
\r
959 if (_sUserHostName == null && null != _WorkerRequest) {
\r
960 _sUserHostName = _WorkerRequest.GetRemoteName();
\r
963 if (_sUserHostName == null || _sUserHostName.Length == 0) {
\r
964 _sUserHostName = UserHostAddress;
\r
967 return _sUserHostName;
\r
971 public string [] UserLanguages {
\r
973 if (_arrUserLanguages == null && null != _WorkerRequest) {
\r
974 _arrUserLanguages = HttpHelper.ParseMultiValueHeader(_WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderAcceptLanguage));
\r
977 return _arrUserLanguages;
\r
981 internal string RootVirtualDir {
\r
983 if (_sRequestRootVirtualDir == null) {
\r
984 _sRequestRootVirtualDir = FilePath;
\r
985 int pos = _sRequestRootVirtualDir.LastIndexOf ('/');
\r
986 if (pos == -1 || pos == 0)
\r
987 _sRequestRootVirtualDir = "/";
\r
989 _sRequestRootVirtualDir = _sRequestRootVirtualDir.Substring (0, pos);
\r
992 return _sRequestRootVirtualDir;
\r
996 internal string BaseVirtualDir {
\r
998 if (baseVirtualDir == null)
\r
999 baseVirtualDir = UrlUtils.GetDirectory (FilePath);
\r
1001 return baseVirtualDir;
\r
1005 public byte [] BinaryRead(int count) {
\r
1006 int iSize = TotalBytes;
\r
1008 throw new ArgumentException();
\r
1011 byte [] arrData = new byte[iSize];
\r
1013 int iRetSize = InputStream.Read(arrData, 0, iSize);
\r
1014 if (iRetSize != iSize) {
\r
1015 byte [] tmpData = new byte[iRetSize];
\r
1016 if (iRetSize > 0) {
\r
1017 Array.Copy(arrData, 0, tmpData, 0, iRetSize);
\r
1020 arrData = tmpData;
\r
1026 public int [] MapImageCoordinates(string ImageFieldName) {
\r
1027 NameValueCollection oItems;
\r
1029 if (HttpMethod == "GET" || HttpMethod == "HEAD") {
\r
1030 oItems = QueryString;
\r
1031 } else if (HttpMethod == "POST") {
\r
1037 int [] arrRet = null;
\r
1039 string sX = oItems.Get(ImageFieldName + ".x");
\r
1040 string sY = oItems.Get(ImageFieldName + ".y");
\r
1042 if (null != sX && null != sY) {
\r
1043 int [] arrTmp = new Int32[2];
\r
1044 arrRet[0] = Int32.Parse(sX);
\r
1045 arrRet[1] = Int32.Parse(sY);
\r
1050 catch (Exception) {
\r
1056 public string MapPath (string VirtualPath)
\r
1058 return MapPath (VirtualPath, BaseVirtualDir, true);
\r
1061 public string MapPath (string virtualPath, string baseVirtualDir, bool allowCrossAppMapping)
\r
1063 if (_WorkerRequest == null)
\r
1064 throw new HttpException ("No HttpWorkerRequest!!!");
\r
1066 if (virtualPath == null || virtualPath.Length == 0)
\r
1067 virtualPath = ".";
\r
1069 virtualPath = virtualPath.Trim ();
\r
1071 if (virtualPath.IndexOf (':') != -1)
\r
1072 throw new ArgumentException ("Invalid path -> " + virtualPath);
\r
1074 if (System.IO.Path.DirectorySeparatorChar != '/')
\r
1075 virtualPath = virtualPath.Replace (System.IO.Path.DirectorySeparatorChar, '/');
\r
1077 if (UrlUtils.IsRooted (virtualPath)) {
\r
1078 virtualPath = UrlUtils.Reduce (virtualPath);
\r
1080 if (baseVirtualDir == null) {
\r
1081 virtualPath = UrlUtils.Combine (RootVirtualDir, virtualPath);
\r
1083 virtualPath = UrlUtils.Combine (baseVirtualDir, virtualPath);
\r
1087 if (!allowCrossAppMapping) {
\r
1088 if (!virtualPath.ToLower ().StartsWith (RootVirtualDir.ToLower ()))
\r
1089 throw new HttpException ("Mapping across applications not allowed.");
\r
1091 if (RootVirtualDir.Length > 1 && virtualPath.Length > 1 && virtualPath [0] != '/')
\r
1092 throw new HttpException ("Mapping across applications not allowed.");
\r
1095 return _WorkerRequest.MapPath (virtualPath);
\r
1098 public void SaveAs(string filename, bool includeHeaders) {
\r
1100 TextWriter oWriter;
\r
1101 HttpRequestStream oData;
\r
1103 oFile = new FileStream(filename, FileMode.CreateNew);
\r
1104 if (includeHeaders) {
\r
1105 oWriter = new StreamWriter(oFile);
\r
1106 oWriter.Write(HttpMethod + " " + Path);
\r
1108 if (QueryStringRaw != null && QueryStringRaw.Length > 0)
\r
1109 oWriter.Write("?" + QueryStringRaw);
\r
1110 if (_WorkerRequest != null) {
\r
1111 oWriter.Write(" " + _WorkerRequest.GetHttpVersion() + "\r\n");
\r
1112 oWriter.Write(GetAllHeaders(true));
\r
1114 oWriter.Write("\r\n");
\r
1117 oWriter.Write("\r\n");
\r
1121 oData = (HttpRequestStream) InputStream;
\r
1123 if (oData.DataLength > 0) {
\r
1124 oFile.Write(oData.Data, oData.DataOffset, oData.DataLength);
\r
1131 internal void SetFilePath (string filePath)
\r
1133 _sFilePath = filePath;
\r
1136 internal void SetForm (HttpValueCollection form)
\r
1138 _oFormData = form;
\r