2002-11-27 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web / HttpRequest.cs
1 // \r
2 // System.Web.HttpRequest\r
3 //\r
4 // Authors:\r
5 //      Patrik Torstensson (Patrik.Torstensson@labs2.com)\r
6 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)\r
7 // \r
8 // (c) 2001, 2002 Patrick Torstensson\r
9 // (c) 2002 Ximian, Inc. (http://www.ximian.com)\r
10 // \r
11 using System;\r
12 using System.Collections;\r
13 using System.Collections.Specialized;\r
14 using System.IO;\r
15 using System.Text;\r
16 using System.Web.Configuration;\r
17 using System.Web.Util;\r
18 \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
24 \r
25                 private byte [] _arrRawContent;\r
26                 private int     _iContentLength;\r
27 \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 _sPathTranslated;\r
38                 private string _sQueryStringRaw;\r
39                 private string _sRequestType;\r
40                 private string _sRequestRootVirtualDir;\r
41 \r
42                 private Encoding _oContentEncoding;\r
43 \r
44                 private Uri _oUriReferrer;\r
45                 private Uri _oUrl;\r
46 \r
47                 private int     _iTotalBytes;\r
48 \r
49                 private HttpContext     _oContext;\r
50 \r
51                 private HttpWorkerRequest _WorkerRequest;\r
52                 private HttpRequestStream       _oInputStream;\r
53                 private HttpClientCertificate _ClientCert;\r
54 \r
55                 private HttpValueCollection _oServerVariables;\r
56                 private HttpValueCollection _oHeaders;\r
57                 private HttpValueCollection _oQueryString;\r
58                 private HttpValueCollection _oFormData;\r
59                 private HttpValueCollection _oParams;\r
60 \r
61                 private HttpBrowserCapabilities _browser;\r
62 \r
63                 private HttpCookieCollection cookies;\r
64 \r
65                 public HttpRequest(string Filename, string Url, string Querystring) {\r
66                         _iContentLength = -1;\r
67                         _iTotalBytes = -1;\r
68 \r
69                         _WorkerRequest = null;\r
70                         _sPathTranslated = Filename;\r
71                         _sRequestType = "GET";\r
72 \r
73                         _oUrl = new Uri(Url);\r
74                         _sPath = _oUrl.AbsolutePath;\r
75 \r
76                         _sQueryStringRaw = Querystring;\r
77                         _oQueryString = new HttpValueCollection(Querystring, true, WebEncoding.Encoding);\r
78                 }\r
79 \r
80                 internal HttpRequest(HttpWorkerRequest WorkRequest, HttpContext Context) {\r
81                         _WorkerRequest = WorkRequest;\r
82                         _oContext = Context;\r
83 \r
84                         _iContentLength = -1;\r
85                         _iTotalBytes = -1;\r
86                 }\r
87 \r
88                 static private string MakeServerVariableFromHeader(string header) {\r
89                         return "HTTP_" + header.ToUpper().Replace("-", "_");\r
90                 }\r
91 \r
92                 [MonoTODO("Need to support non-raw mode also..")]\r
93                 private string GetAllHeaders(bool Raw) {\r
94                         StringBuilder oData;\r
95 \r
96                         if (null == _WorkerRequest) {\r
97                                 return null;\r
98                         }\r
99 \r
100                         oData = new StringBuilder(512);\r
101 \r
102                         string sHeaderValue;\r
103                         string sHeaderName;\r
104                         int iCount = 0;\r
105 \r
106                         // Add all know headers\r
107                         for (; iCount != 40; iCount++) {\r
108                                 sHeaderValue = _WorkerRequest.GetKnownRequestHeader(iCount);\r
109                                 if (null != sHeaderValue && sHeaderValue.Length > 0) {\r
110                                         sHeaderName = _WorkerRequest.GetKnownRequestHeader(iCount);\r
111                                         if (null != sHeaderName && sHeaderName.Length > 0) {\r
112                                                 oData.Append(sHeaderName);\r
113                                                 oData.Append(": ");\r
114                                                 oData.Append(sHeaderValue);\r
115                                                 oData.Append("\r\n");\r
116                                         }\r
117                                 }\r
118                         }\r
119 \r
120                         // Get all other headers\r
121                         string [][] arrUnknownHeaders = _WorkerRequest.GetUnknownRequestHeaders();\r
122                         if (null != arrUnknownHeaders) {\r
123                                 for (iCount = 0; iCount != arrUnknownHeaders.Length; iCount++) {\r
124                                         oData.Append(arrUnknownHeaders[iCount][0]);\r
125                                         oData.Append(": ");\r
126                                         oData.Append(arrUnknownHeaders[iCount][1]);\r
127                                         oData.Append("\r\n");\r
128                                 }\r
129                         }\r
130 \r
131                         return oData.ToString();\r
132                 }\r
133       \r
134                 [MonoTODO("We need to handly 'dynamic' variables like AUTH_USER, that can be changed during runtime... special collection")]\r
135                 private void ParseServerVariables() {\r
136                         if (null == _WorkerRequest) {\r
137                                 return;\r
138                         }\r
139 \r
140                         if (_oServerVariables == null) {\r
141                                 string sTmp;\r
142 \r
143                                 _oServerVariables = new HttpValueCollection();\r
144                                 \r
145                                 _oServerVariables.Add("ALL_HTTP", GetAllHeaders(false));\r
146                                 _oServerVariables.Add("ALL_RAW", GetAllHeaders(true));\r
147 \r
148                                 _oServerVariables.Add("APPL_MD_PATH", _WorkerRequest.GetServerVariable("APPL_MD_PATH"));\r
149                                 _oServerVariables.Add("AUTH_PASSWORD", _WorkerRequest.GetServerVariable("AUTH_PASSWORD"));\r
150                                 _oServerVariables.Add("CERT_COOKIE", _WorkerRequest.GetServerVariable("CERT_COOKIE"));\r
151                                 _oServerVariables.Add("CERT_FLAGS", _WorkerRequest.GetServerVariable("CERT_FLAGS"));\r
152                                 _oServerVariables.Add("CERT_ISSUER", _WorkerRequest.GetServerVariable("CERT_ISSUER"));\r
153                                 _oServerVariables.Add("CERT_KEYSIZE", _WorkerRequest.GetServerVariable("CERT_KEYSIZE"));\r
154                                 _oServerVariables.Add("CERT_SECRETKEYSIZE", _WorkerRequest.GetServerVariable("CERT_SECRETKEYSIZE"));\r
155                                 _oServerVariables.Add("CERT_SERIALNUMBER", _WorkerRequest.GetServerVariable("CERT_SERIALNUMBER"));\r
156                                 _oServerVariables.Add("CERT_SERVER_ISSUER", _WorkerRequest.GetServerVariable("CERT_SERVER_ISSUER"));\r
157                                 _oServerVariables.Add("CERT_SERVER_SUBJECT", _WorkerRequest.GetServerVariable("CERT_SERVER_SUBJECT"));\r
158                                 _oServerVariables.Add("CERT_SUBJECT", _WorkerRequest.GetServerVariable("CERT_SUBJECT"));\r
159 \r
160                                 _oServerVariables.Add("GATEWAY_INTERFACE", _WorkerRequest.GetServerVariable("GATEWAY_INTERFACE"));\r
161                                 _oServerVariables.Add("HTTPS", _WorkerRequest.GetServerVariable("HTTPS"));\r
162                                 _oServerVariables.Add("HTTPS_KEYSIZE", _WorkerRequest.GetServerVariable("HTTPS_KEYSIZE"));\r
163                                 _oServerVariables.Add("HTTPS_SECRETKEYSIZE", _WorkerRequest.GetServerVariable("HTTPS_SECRETKEYSIZE"));\r
164 \r
165                                 _oServerVariables.Add("CONTENT_TYPE", ContentType);\r
166                                 _oServerVariables.Add("HTTPS_SERVER_ISSUER", _WorkerRequest.GetServerVariable("HTTPS_SERVER_ISSUER"));\r
167                                 _oServerVariables.Add("HTTPS_SERVER_SUBJECT", _WorkerRequest.GetServerVariable("HTTPS_SERVER_SUBJECT"));\r
168                                 _oServerVariables.Add("INSTANCE_ID", _WorkerRequest.GetServerVariable("INSTANCE_ID"));\r
169                                 _oServerVariables.Add("INSTANCE_META_PATH", _WorkerRequest.GetServerVariable("INSTANCE_META_PATH"));\r
170                                 _oServerVariables.Add("LOCAL_ADDR", _WorkerRequest.GetLocalAddress());\r
171                                 _oServerVariables.Add("REMOTE_ADDR", UserHostAddress);\r
172                                 _oServerVariables.Add("REMOTE_HOST", UserHostName);\r
173                                 _oServerVariables.Add("REQUEST_METHOD", HttpMethod);\r
174                                 _oServerVariables.Add("SERVER_NAME", _WorkerRequest.GetServerName());\r
175                                 _oServerVariables.Add("SERVER_PORT", _WorkerRequest.GetLocalPort().ToString());\r
176                                 _oServerVariables.Add("SERVER_PROTOCOL", _WorkerRequest.GetHttpVersion());\r
177                                 _oServerVariables.Add("SERVER_SOFTWARE", _WorkerRequest.GetServerVariable("SERVER_SOFTWARE"));\r
178 \r
179                                 if (_WorkerRequest.IsSecure()) {\r
180                                         _oServerVariables.Add("SERVER_PORT_SECURE", "1");\r
181                                 } else {\r
182                                         _oServerVariables.Add("SERVER_PORT_SECURE", "0");\r
183                                 }\r
184 \r
185                                 sTmp = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);\r
186                                 if (null != sTmp) {\r
187                                         _oServerVariables.Add("CONTENT_LENGTH", sTmp);\r
188                                 }\r
189 \r
190                                 // TODO: Should be dynamic\r
191                                 if (null != _oContext.User && _oContext.User.Identity.IsAuthenticated) {\r
192                                         _oServerVariables.Add("AUTH_TYPE", _oContext.User.Identity.AuthenticationType);\r
193                                         _oServerVariables.Add("AUTH_USER", _oContext.User.Identity.Name);\r
194                                 } else {\r
195                                         _oServerVariables.Add("AUTH_TYPE", "");\r
196                                         _oServerVariables.Add("AUTH_USER", "");\r
197                                 }\r
198 \r
199                                 _oServerVariables.Add("PATH_INFO", PathInfo);\r
200                                 _oServerVariables.Add("PATH_TRANSLATED", PhysicalPath);\r
201                                 _oServerVariables.Add("QUERY_STRING", QueryStringRaw);\r
202                                 _oServerVariables.Add("SCRIPT_NAME", FilePath);\r
203                                 // end dynamic\r
204             \r
205                                 _oServerVariables.MakeReadOnly();\r
206                         }\r
207                 }\r
208 \r
209                 [MonoTODO("Handle multipart/form-data")]\r
210                 private void ParseFormData ()\r
211                 {\r
212                         if (_oFormData != null)\r
213                                 return;\r
214 \r
215                         string contentType = ContentType;\r
216                         if (0 != String.Compare (contentType, "application/x-www-form-urlencoded", true)) {\r
217                                 Console.WriteLine ("Content-Type -> {0} not supported", contentType);\r
218                                 _oFormData = new HttpValueCollection ();\r
219                                 return;\r
220                         }\r
221 \r
222                         byte [] arrData = GetRawContent ();\r
223                         Encoding enc = ContentEncoding;\r
224                         string data = enc.GetString (arrData);\r
225                         _oFormData = new HttpValueCollection (data, true, enc);\r
226                 }\r
227 \r
228                 [MonoTODO("void Dispose")]\r
229                 internal void Dispose() {                       \r
230                 }\r
231 \r
232                 private byte [] GetRawContent ()\r
233                 {\r
234                         if (_arrRawContent != null)\r
235                                 return _arrRawContent;\r
236 \r
237                         if (null == _WorkerRequest) {\r
238                                 if (QueryStringRaw == null)\r
239                                         return null;\r
240                                 char [] q = QueryStringRaw.ToCharArray ();\r
241                                 _arrRawContent = new byte [q.Length];\r
242                                 for (int i = 0; i < q.Length; i++)\r
243                                         _arrRawContent [i] = (byte) q [i];\r
244                                 return _arrRawContent;\r
245                         }\r
246 \r
247                         _arrRawContent = _WorkerRequest.GetPreloadedEntityBody ();\r
248                         if (_arrRawContent == null)\r
249                                 _arrRawContent = new byte [0];\r
250 \r
251                         int length = ContentLength;\r
252                         if (_WorkerRequest.IsEntireEntityBodyIsPreloaded () || length <= _arrRawContent.Length)\r
253                                 return _arrRawContent;\r
254 \r
255                         byte [] arrBuffer = new byte [Math.Min (16384, length)];\r
256                         MemoryStream ms = new MemoryStream (arrBuffer.Length);\r
257                         ms.Write (_arrRawContent, 0, _arrRawContent.Length);\r
258                         int read = 0;\r
259                         for (int loaded = _arrRawContent.Length; loaded < length; loaded += read) {\r
260                                 read = _WorkerRequest.ReadEntityBody (arrBuffer, arrBuffer.Length);\r
261                                 if (read == 0)\r
262                                         break;\r
263 \r
264                                 ms.Write (arrBuffer, 0, read);\r
265                         }\r
266 \r
267                         _arrRawContent = ms.GetBuffer ();\r
268                         return _arrRawContent;\r
269                 }\r
270 \r
271                 public string [] AcceptTypes {\r
272                         get {\r
273                                 if (null == _arrAcceptTypes && null != _WorkerRequest) {\r
274                                         _arrAcceptTypes = HttpHelper.ParseMultiValueHeader(_WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderAccept));\r
275                                 } \r
276 \r
277                                 return _arrAcceptTypes;\r
278                                 \r
279                         }\r
280                 }\r
281 \r
282                 public string ApplicationPath {\r
283                         get {\r
284                                 if (null != _WorkerRequest) {\r
285                                         return _WorkerRequest.GetAppPath();\r
286                                 }\r
287 \r
288                                 return null;\r
289                         }\r
290                 }\r
291 \r
292                 public HttpBrowserCapabilities Browser {\r
293                         get {\r
294                                 if (_browser == null)\r
295                                         _browser = new HttpBrowserCapabilities ();\r
296 \r
297                                 return _browser;\r
298                         }\r
299 \r
300                         set { _browser = value; }\r
301                 }\r
302 \r
303                 public HttpClientCertificate ClientCertificate {\r
304                         get {\r
305                                 if (null == _ClientCert) {\r
306                                         _ClientCert = new HttpClientCertificate(_oContext);\r
307                                 }\r
308 \r
309                                 return _ClientCert;\r
310                         }\r
311                 }\r
312 \r
313                 private string GetValueFromHeader (string header, string attr)\r
314                 {\r
315                         int where = header.IndexOf (attr + '=');\r
316                         if (where == -1)\r
317                                 return null;\r
318 \r
319                         where += attr.Length + 1;\r
320                         int max = header.Length;\r
321                         if (where >= max)\r
322                                 return String.Empty;\r
323 \r
324                         char ending = header [where];\r
325                         if (ending != '"')\r
326                                 ending = ' ';\r
327 \r
328                         int end = header.Substring (where + 1).IndexOf (ending);\r
329                         if (end == -1)\r
330                                 return (ending == '"') ? null : header.Substring (where);\r
331 \r
332                         return header.Substring (where, end);\r
333                 }\r
334                 \r
335                 public Encoding ContentEncoding\r
336                 {\r
337                         get {\r
338                                 if (_oContentEncoding == null) {\r
339                                         if (_WorkerRequest != null && \r
340                                             (!_WorkerRequest.HasEntityBody () || ContentType != String.Empty)) {\r
341                                                 _oContentEncoding = WebEncoding.Encoding;\r
342                                         } else  {\r
343                                                 string charset;\r
344                                                 charset = GetValueFromHeader (_sContentType, "charset");\r
345                                                 try {\r
346                                                         _oContentEncoding = Encoding.GetEncoding (charset);\r
347                                                 } catch {\r
348                                                         _oContentEncoding = WebEncoding.Encoding;\r
349                                                 }\r
350                                         }\r
351                                 }\r
352 \r
353                                 return _oContentEncoding;\r
354                         }\r
355 \r
356                         set {\r
357                                 _oContentEncoding = value;\r
358                         }\r
359                 }\r
360 \r
361                 public int ContentLength {\r
362                         get {\r
363                                 if (_iContentLength == -1 && null != _WorkerRequest) {\r
364                                         string sLength = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength);\r
365                                         if (sLength != null) {\r
366                                                 try {\r
367                                                         _iContentLength = Int32.Parse(sLength);\r
368                                                 }\r
369                                                 catch(Exception) {\r
370                                                 }\r
371                                         } \r
372                                 }\r
373 \r
374                                 if (_iContentLength < 0) {\r
375                                         _iContentLength = 0;\r
376                                 }\r
377 \r
378                                 return _iContentLength;\r
379                         }\r
380                 }\r
381 \r
382                 public string ContentType {\r
383                         get {\r
384                                 if (null == _sContentType) {\r
385                                         if (null != _WorkerRequest) {\r
386                                                 _sContentType = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentType);\r
387                                         }\r
388 \r
389                                         if (null == _sContentType) {\r
390                                                 _sContentType = string.Empty;\r
391                                         }\r
392                                 }\r
393 \r
394                                 return _sContentType;\r
395                         }\r
396                 }\r
397 \r
398                 static private string GetCookieValue (string str, int length, ref int i)\r
399                 {\r
400                         if (i >= length)\r
401                                 return null;\r
402 \r
403                         int k = i;\r
404                         while (k < length && Char.IsWhiteSpace (str [k]))\r
405                                 k++;\r
406 \r
407                         int begin = k;\r
408                         while (k < length && str [k] != ';')\r
409                                 k++;\r
410 \r
411                         i = k;\r
412                         return str.Substring (begin, i - begin).Trim ();\r
413                 }\r
414 \r
415                 static private string GetCookieName (string str, int length, ref int i)\r
416                 {\r
417                         if (i >= length)\r
418                                 return null;\r
419 \r
420                         int k = i;\r
421                         while (k < length && Char.IsWhiteSpace (str [k]))\r
422                                 k++;\r
423 \r
424                         int begin = k;\r
425                         while (k < length && str [k] != ';' &&  str [k] != '=')\r
426                                 k++;\r
427 \r
428                         i = k + 1;\r
429                         return str.Substring (begin, k - begin).Trim ();\r
430                 }\r
431 \r
432                 private void GetCookies ()\r
433                 {\r
434                         string header = _WorkerRequest.GetKnownRequestHeader (HttpWorkerRequest.HeaderCookie);\r
435                         if (header == null || header.Length == 0)\r
436                                 return;\r
437 \r
438                         /* RFC 2109\r
439                          *      cookie          =       "Cookie:" cookie-version\r
440                          *                                 1*((";" | ",") cookie-value)\r
441                          *      cookie-value    =       NAME "=" VALUE [";" path] [";" domain]\r
442                          *      cookie-version  =       "$Version" "=" value\r
443                          *      NAME            =       attr\r
444                          *      VALUE           =       value\r
445                          *      path            =       "$Path" "=" value\r
446                          *      domain          =       "$Domain" "=" value\r
447                          *\r
448                          *      MS ignores $Version! \r
449                          *      ',' as a separator produces errors.\r
450                          */\r
451 \r
452                         cookies = new HttpCookieCollection (_oContext.Response, false);\r
453                         string [] name_values = header.Trim ().Split (';');\r
454                         int length = name_values.Length;\r
455                         HttpCookie cookie = null;\r
456                         int pos;\r
457                         for (int i = 0; i < length; i++) {\r
458                                 pos = 0;\r
459                                 string name_value = name_values [i].Trim ();\r
460                                 string name = GetCookieName (name_value, name_value.Length, ref pos);\r
461                                 string value = GetCookieValue (name_value, name_value.Length, ref pos);\r
462                                 if (cookie != null) {\r
463                                         if (name == "$Path") {\r
464                                                 cookie.Path = value;\r
465                                                 continue;\r
466                                         } else if (name == "$Domain") {\r
467                                                 cookie.Domain = value;\r
468                                                 continue;\r
469                                         } else {\r
470                                                 cookies.Add (cookie);\r
471                                                 cookie = null;\r
472                                         }\r
473                                 }\r
474                                 cookie = new HttpCookie (name, value);\r
475                         }\r
476 \r
477                         if (cookie != null)\r
478                                 cookies.Add (cookie);\r
479                 }\r
480 \r
481                 public HttpCookieCollection Cookies\r
482                 {\r
483                         get {\r
484                                 if (cookies == null) {\r
485                                         cookies = new HttpCookieCollection (null, false);\r
486                                         if (_WorkerRequest != null)\r
487                                                 GetCookies ();\r
488                                 }\r
489 \r
490                                 return cookies;\r
491                         }\r
492                 }\r
493 \r
494                 [MonoTODO()]\r
495                 public string CurrentExecutionFilePath {\r
496                         get {\r
497                                 throw new NotImplementedException();\r
498                         }\r
499                 }\r
500 \r
501                 public string FilePath {\r
502                         get {\r
503                                 if (null == _sFilePath && null != _WorkerRequest) {\r
504                                         _sFilePath = _WorkerRequest.GetFilePath();\r
505                                 }\r
506 \r
507                                 return _sFilePath;\r
508                         }\r
509                 }\r
510 \r
511                 [MonoTODO()]\r
512                 public HttpFileCollection Files {\r
513                         get {\r
514                                 throw new NotImplementedException();\r
515                         }\r
516                 }\r
517 \r
518                 [MonoTODO("Use stream filter in the request stream")]\r
519                 public Stream Filter {\r
520                         get {\r
521                                 throw new NotImplementedException();\r
522                         }\r
523 \r
524                         set {\r
525                                 throw new NotImplementedException();\r
526                         }\r
527                 }\r
528 \r
529 \r
530                 public NameValueCollection Form {\r
531                         get {\r
532                                 ParseFormData();\r
533 \r
534                                 return (NameValueCollection) _oFormData;\r
535                         }\r
536                 }\r
537 \r
538                 public NameValueCollection Headers {\r
539                         get {\r
540                                 if (_oHeaders == null) {\r
541                                         _oHeaders = new HttpValueCollection();\r
542 \r
543                                         if (null != _WorkerRequest) {\r
544                                                 string sHeaderValue;\r
545                                                 string sHeaderName;\r
546                                                 int iCount = 0;\r
547 \r
548                                                 // Add all know headers\r
549                                                 for (; iCount != 40; iCount++) {\r
550                                                         sHeaderValue = _WorkerRequest.GetKnownRequestHeader(iCount);\r
551                                                         if (null != sHeaderValue && sHeaderValue.Length > 0) {\r
552                                                                 sHeaderName = _WorkerRequest.GetKnownRequestHeader(iCount);\r
553                                                                 if (null != sHeaderName && sHeaderName.Length > 0) {\r
554                                                                         _oHeaders.Add(sHeaderName, sHeaderValue);\r
555                                                                 }\r
556                                                         }\r
557                                                 }\r
558 \r
559                                                 // Get all other headers\r
560                                                 string [][] arrUnknownHeaders = _WorkerRequest.GetUnknownRequestHeaders();\r
561                                                 if (null != arrUnknownHeaders) {\r
562                                                         for (iCount = 0; iCount != arrUnknownHeaders.Length; iCount++) {\r
563                                                                 _oHeaders.Add(arrUnknownHeaders[iCount][0], arrUnknownHeaders[iCount][1]);\r
564                                                         }\r
565                                                 }\r
566                                         }\r
567 \r
568                                         // Make headers read-only\r
569                                         _oHeaders.MakeReadOnly();\r
570                                 }\r
571 \r
572                                 return (NameValueCollection) _oHeaders;\r
573                         }\r
574                 }\r
575 \r
576                 public string HttpMethod {\r
577                         get {\r
578                                 if (null == _sHttpMethod) {\r
579                                         if (null != _WorkerRequest) {\r
580                                                 _sHttpMethod = _WorkerRequest.GetHttpVerbName().ToUpper();\r
581                                         }\r
582                \r
583                                         if (_sHttpMethod == null) {\r
584                                                 if (RequestType != null)\r
585                                                         _sHttpMethod = RequestType;\r
586                                                 else\r
587                                                         _sHttpMethod = "GET";\r
588                                         }\r
589                                 }\r
590 \r
591                                 return _sHttpMethod;\r
592                         }\r
593                 }\r
594 \r
595                 public Stream InputStream {\r
596                         get {\r
597                                 if (_oInputStream == null) {\r
598                                         byte [] arrInputData = GetRawContent ();\r
599 \r
600                                         if (null != arrInputData) {\r
601                                                 _oInputStream = new HttpRequestStream(arrInputData, 0, arrInputData.Length);\r
602                                         } else {\r
603                                                 _oInputStream = new HttpRequestStream(null, 0, 0);\r
604                                         }\r
605                                 }\r
606 \r
607                                 return _oInputStream;\r
608                         } \r
609                 }\r
610 \r
611                 public bool IsAuthenticated {\r
612                         get {\r
613                                 if (_oContext != null && _oContext.User != null && _oContext.User.Identity != null) {\r
614                                         return _oContext.User.Identity.IsAuthenticated;\r
615                                 }\r
616 \r
617                                 return false;\r
618                         }\r
619                 }\r
620 \r
621                 public bool IsSecureConnection {\r
622                         get {\r
623                                 if (null != _WorkerRequest) {\r
624                                         return _WorkerRequest.IsSecure();\r
625                                 }\r
626 \r
627                                 return false;\r
628                         }\r
629                 }\r
630 \r
631                 [MonoTODO("Call item in querystring, form, cookie and servervariables")]\r
632                 public string this [string sKey] {\r
633                         get {\r
634                                 throw new NotImplementedException();\r
635                         }\r
636                 }\r
637 \r
638                 [MonoTODO("Add cookie collection to our Params collection via merge")]\r
639                 public NameValueCollection Params {\r
640                         get {\r
641                                 if (_oParams == null) {\r
642                                         _oParams = new HttpValueCollection();\r
643                                         \r
644                                         _oParams.Merge(QueryString);\r
645                                         _oParams.Merge(Form);\r
646                                         _oParams.Merge(ServerVariables);\r
647                                         // TODO: Cookie\r
648 \r
649                                         _oParams.MakeReadOnly();\r
650                                 }\r
651 \r
652                                 return (NameValueCollection) _oParams;\r
653                         }\r
654                 }\r
655                 \r
656                 public string Path {\r
657                         get {\r
658                                 if (_sPath == null) {\r
659                                         if (null != _WorkerRequest) {\r
660                                                 _sPath = _WorkerRequest.GetUriPath();\r
661                                         }\r
662 \r
663                                         if (_sPath == null) {\r
664                                                 _sPath = string.Empty;\r
665                                         }\r
666                                 }\r
667 \r
668                                 return _sPath;\r
669                         }\r
670                 }\r
671                 \r
672                 public string PathInfo {\r
673                         get {\r
674                                 if (_sPathInfo == null) {\r
675                                         if (null != _WorkerRequest) {\r
676                                                 _sPathInfo = _WorkerRequest.GetPathInfo();\r
677                                         }\r
678 \r
679                                         if (_sPathInfo == null) {\r
680                                                 _sPathInfo = string.Empty;\r
681                                         }\r
682                                 }\r
683                                 \r
684                                 return _sPathInfo;\r
685                         }\r
686                 }\r
687 \r
688                 public string PhysicalApplicationPath {\r
689                         get {\r
690                                 if (null != _WorkerRequest) {\r
691                                         return _WorkerRequest.GetAppPathTranslated();\r
692                                 }\r
693 \r
694                                 return null;\r
695                         }\r
696                 }\r
697 \r
698                 public string PhysicalPath {\r
699                         get {\r
700                                 if (null != _WorkerRequest) {\r
701                                         _sPathTranslated = _WorkerRequest.GetFilePathTranslated();\r
702                                         if (null == _sPathTranslated) {\r
703                                                 _sPathTranslated = _WorkerRequest.MapPath(FilePath);\r
704                                         }\r
705                                 }\r
706 \r
707                                 return _sPathTranslated;\r
708                         }\r
709                 }\r
710 \r
711                 public NameValueCollection QueryString {\r
712                         get {\r
713                                 if (_oQueryString == null) {\r
714                                         _oQueryString = new HttpValueCollection(QueryStringRaw, true,\r
715                                                                                 WebEncoding.Encoding);\r
716                                 }\r
717 \r
718                                 return _oQueryString;\r
719                         }\r
720                 }\r
721 \r
722                 // Used to parse the querystring\r
723                 internal string QueryStringRaw {\r
724                         get {\r
725                                 if (_sQueryStringRaw == null && null != _WorkerRequest) {\r
726                                         byte [] arrQuerystringBytes = _WorkerRequest.GetQueryStringRawBytes();\r
727                                         if (null != arrQuerystringBytes && arrQuerystringBytes.Length > 0) {\r
728                                                 _sQueryStringRaw = ContentEncoding.GetString(arrQuerystringBytes);\r
729                                         } else {\r
730                                                 _sQueryStringRaw = _WorkerRequest.GetQueryString();   \r
731                                         }\r
732                                 }\r
733 \r
734                                 if (_sQueryStringRaw == null) {\r
735                                         _sQueryStringRaw = string.Empty;\r
736                                 }\r
737 \r
738                                 return _sQueryStringRaw;\r
739                         }\r
740                 }\r
741 \r
742                 public string RawUrl {\r
743                         get {\r
744                                 if (null == _sRawUrl) {\r
745                                         if (null != _WorkerRequest) {\r
746                                                 _sRawUrl = _WorkerRequest.GetRawUrl();\r
747                                         } else {\r
748                                                 _sRawUrl = Path;\r
749                                                 if (QueryStringRaw != null && QueryStringRaw.Length > 0) {\r
750                                                         _sRawUrl = _sRawUrl + "?" + QueryStringRaw;\r
751                                                 }\r
752                                         }\r
753                                 }\r
754 \r
755                                 return _sRawUrl;\r
756                         }\r
757                 }\r
758 \r
759                 public string RequestType {\r
760                         get {\r
761                                 if (null == _sRequestType) {\r
762                                         return HttpMethod;\r
763                                 }\r
764          \r
765                                 return _sRequestType;\r
766                         }\r
767 \r
768                         set {\r
769                                 _sRequestType = value;\r
770                         }\r
771                 }\r
772                 \r
773       \r
774                 public NameValueCollection ServerVariables {\r
775                         get {\r
776                                 ParseServerVariables();\r
777 \r
778                                 return (NameValueCollection) _oServerVariables;\r
779                         }\r
780                 }      \r
781 \r
782                 public int TotalBytes {\r
783                         get {\r
784                                 if (_iTotalBytes == -1) {\r
785                                         if (null != InputStream) {\r
786                                                 _iTotalBytes = (int) InputStream.Length;\r
787                                         } else {\r
788                                                 _iTotalBytes = 0;\r
789                                         }\r
790                                 }\r
791 \r
792                                 return _iTotalBytes;\r
793                         }\r
794                 }\r
795 \r
796                 public Uri Url {\r
797                         get {\r
798                                 if (null == _oUrl) {\r
799                                         _oUrl = new Uri(RawUrl);\r
800                                 }\r
801 \r
802                                 return _oUrl;\r
803                         }\r
804                 }\r
805 \r
806                 public Uri UrlReferrer {\r
807                         get {\r
808                                 if (null == _oUriReferrer && null != _WorkerRequest) {\r
809                                         string sReferrer = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderReferer);\r
810                                         if (null != sReferrer && sReferrer.Length > 0) {\r
811                                                 try {\r
812                                                         if (sReferrer.IndexOf("://") >= 0) {\r
813                                                                 _oUriReferrer = new Uri(sReferrer);\r
814                                                         } else {\r
815                                                                 _oUriReferrer = new Uri(this.Url, sReferrer);\r
816                                                         }\r
817                                                 }\r
818                                                 catch (Exception) {\r
819                                                 }\r
820                                         }\r
821                                 }\r
822 \r
823                                 return _oUriReferrer;\r
824                         }\r
825                 }\r
826 \r
827                 public string UserAgent {\r
828                         get {\r
829                                 if (_sUserAgent == null && _WorkerRequest != null) {\r
830                                         _sUserAgent = _WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderUserAgent);\r
831                                 }\r
832 \r
833                                 if (_sUserAgent == null) {\r
834                                         _sUserAgent = string.Empty;\r
835                                 }\r
836 \r
837                                 return _sUserAgent;\r
838                         }\r
839                 }\r
840 \r
841                 public string UserHostAddress {\r
842                         get {\r
843                                 if (_sUserHostAddress == null && null != _WorkerRequest) {\r
844                                         _sUserHostAddress = _WorkerRequest.GetRemoteAddress();\r
845                                 }\r
846 \r
847                                 if (_sUserHostAddress == null || _sUserHostAddress.Length == 0) {\r
848                                         _sUserHostAddress = "127.0.0.1";\r
849                                 }\r
850 \r
851                                 return _sUserHostAddress;\r
852                         }\r
853                 }\r
854                 \r
855                 public string UserHostName {\r
856                         get {\r
857                                 if (_sUserHostName == null && null != _WorkerRequest) {\r
858                                         _sUserHostName = _WorkerRequest.GetRemoteName();\r
859                                 }\r
860 \r
861                                 if (_sUserHostName == null || _sUserHostName.Length == 0) {\r
862                                         _sUserHostName = UserHostAddress;\r
863                                 }\r
864 \r
865                                 return _sUserHostName;\r
866                         }\r
867                 }\r
868                 \r
869                 public string [] UserLanguages {\r
870                         get {\r
871                                 if (_arrUserLanguages == null && null != _WorkerRequest) {\r
872                                         _arrUserLanguages = HttpHelper.ParseMultiValueHeader(_WorkerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderAcceptLanguage));\r
873                                 }\r
874 \r
875                                 return _arrUserLanguages;\r
876                         }\r
877                 }\r
878 \r
879                 public byte [] BinaryRead(int count) {\r
880                         int iSize = TotalBytes;\r
881                         if (iSize == 0) {\r
882                                 throw new ArgumentException();\r
883                         }\r
884 \r
885                         byte [] arrData = new byte[iSize];\r
886                         \r
887                         int iRetSize = InputStream.Read(arrData, 0, iSize);\r
888                         if (iRetSize != iSize) {\r
889                                 byte [] tmpData = new byte[iRetSize];\r
890                                 if (iRetSize > 0) {\r
891                                         Array.Copy(arrData, 0, tmpData, 0, iRetSize);\r
892                                 }\r
893 \r
894                                 arrData = tmpData;\r
895                         }\r
896 \r
897                         return arrData;\r
898                 }\r
899 \r
900                 public int [] MapImageCoordinates(string ImageFieldName) {\r
901                         NameValueCollection oItems;\r
902 \r
903                         if (HttpMethod == "GET" || HttpMethod == "HEAD") {\r
904                                 oItems = QueryString;\r
905                         } else if (HttpMethod == "POST") {\r
906                                 oItems = Form;\r
907                         } else {\r
908                                 return null;\r
909                         }\r
910 \r
911                         int [] arrRet = null;\r
912                         try {\r
913                                 string sX = oItems.Get(ImageFieldName + ".x");\r
914                                 string sY = oItems.Get(ImageFieldName + ".y");\r
915 \r
916                                 if (null != sX && null != sY) {\r
917                                         int [] arrTmp = new Int32[2];\r
918                                         arrRet[0] = Int32.Parse(sX);\r
919                                         arrRet[1] = Int32.Parse(sY);\r
920 \r
921                                         arrRet = arrTmp;\r
922                                 }\r
923                         }\r
924                         catch (Exception) {\r
925                         }\r
926 \r
927                         return arrRet;\r
928                 }\r
929 \r
930                 public string MapPath(string VirtualPath)\r
931                 {\r
932                         return MapPath (VirtualPath, _sRequestRootVirtualDir, true);\r
933                 }\r
934 \r
935                 [MonoTODO]\r
936                 public string MapPath(string virtualPath, string baseVirtualDir, bool allowCrossAppMapping)\r
937                 {\r
938                         if (_WorkerRequest == null)\r
939                                 throw new HttpException ("No HttpWorkerRequest!!!");\r
940 \r
941                         if (virtualPath == null || virtualPath.Length == 0)\r
942                                 virtualPath = ".";\r
943 \r
944                         virtualPath = System.IO.Path.Combine (baseVirtualDir, virtualPath);\r
945                         return _WorkerRequest.MapPath (virtualPath);\r
946                 }\r
947 \r
948                 public void SaveAs(string filename, bool includeHeaders) {\r
949                         FileStream oFile;\r
950                         TextWriter oWriter;\r
951                         HttpRequestStream oData;\r
952 \r
953                         oFile = new FileStream(filename, FileMode.CreateNew);\r
954                         if (includeHeaders) {\r
955                                 oWriter = new StreamWriter(oFile);\r
956                                 oWriter.Write(HttpMethod + " " + Path);\r
957 \r
958                                 if (QueryStringRaw != null && QueryStringRaw.Length > 0)\r
959                                         oWriter.Write("?" + QueryStringRaw);\r
960                                 if (_WorkerRequest != null) {\r
961                                         oWriter.Write(" " + _WorkerRequest.GetHttpVersion() + "\r\n");\r
962                                         oWriter.Write(GetAllHeaders(true));\r
963                                 } else {\r
964                                         oWriter.Write("\r\n");\r
965                                 }\r
966 \r
967                                 oWriter.Write("\r\n");\r
968                                 oWriter.Flush();\r
969                         }\r
970 \r
971                         oData = (HttpRequestStream) InputStream;\r
972 \r
973                         if (oData.DataLength > 0) {\r
974                                 oFile.Write(oData.Data, oData.DataOffset, oData.DataLength);\r
975                         }\r
976 \r
977                         oFile.Flush();\r
978                         oFile.Close();\r
979                 }\r
980         }\r
981 }\r