2 // System.Web.HttpRequest.cs
6 // Miguel de Icaza (miguel@novell.com)
7 // Gonzalo Paniagua Javier (gonzalo@novell.com)
11 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using System.Web.Util;
36 using System.Collections.Specialized;
37 using System.Security.Permissions;
39 namespace System.Web {
42 // Methods exposed through HttpContext.Server property
45 // CAS - no InheritanceDemand here as the class is sealed
46 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
47 public sealed class HttpServerUtility {
50 internal HttpServerUtility (HttpContext context)
52 this.context = context;
55 public void ClearError ()
57 context.ClearError ();
60 [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
61 public object CreateObject (string progID)
63 throw new HttpException (500, "COM is not supported");
66 [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
67 public object CreateObject (Type type)
69 throw new HttpException (500, "COM is not supported");
72 [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
73 public object CreateObjectFromClsid (string clsid)
75 throw new HttpException (500, "COM is not supported");
78 public void Execute (string path)
80 Execute (path, null, true);
83 public void Execute (string path, TextWriter writer)
85 Execute (path, writer, true);
93 void Execute (string path, TextWriter writer, bool preserveQuery)
96 throw new ArgumentNullException ("path");
98 if (path.IndexOf (':') != -1)
99 throw new ArgumentException ("Invalid path.");
101 HttpRequest request = context.Request;
102 string oldQuery = request.QueryStringRaw;
103 int qmark = path.IndexOf ('?');
105 request.QueryStringRaw = path.Substring (qmark + 1);
106 path = path.Substring (0, qmark);
107 } else if (!preserveQuery) {
108 request.QueryStringRaw = "";
111 HttpResponse response = context.Response;
112 WebROCollection oldForm = null;
113 if (!preserveQuery) {
114 oldForm = request.Form as WebROCollection;
115 request.SetForm (new WebROCollection ());
118 TextWriter output = writer;
120 output = response.Output;
122 string oldFilePath = request.FilePath;
123 request.SetCurrentExePath (UrlUtils.Combine (request.BaseVirtualDir, path));
124 IHttpHandler handler = context.ApplicationInstance.GetHandler (context);
125 TextWriter previous = null;
127 previous = response.SetTextWriter (output);
128 if (!(handler is IHttpAsyncHandler)) {
129 handler.ProcessRequest (context);
131 IHttpAsyncHandler asyncHandler = (IHttpAsyncHandler) handler;
132 IAsyncResult ar = asyncHandler.BeginProcessRequest (context, null, null);
133 ar.AsyncWaitHandle.WaitOne ();
134 asyncHandler.EndProcessRequest (ar);
137 request.SetCurrentExePath (oldFilePath);
138 if (oldQuery != null && oldQuery != "" && oldQuery != request.QueryStringRaw) {
139 oldQuery = oldQuery.Substring (1); // Ignore initial '?'
140 request.QueryStringRaw = oldQuery; // which is added here.
142 response.SetTextWriter (previous);
144 request.SetForm (oldForm);
148 public Exception GetLastError ()
151 return HttpContext.Current.Error;
152 return context.Error;
155 public string HtmlDecode (string s)
157 return HttpUtility.HtmlDecode (s);
160 public void HtmlDecode (string s, TextWriter output)
162 HttpUtility.HtmlDecode (s, output);
165 public string HtmlEncode (string s)
167 return HttpUtility.HtmlEncode (s);
170 public void HtmlEncode (string s, TextWriter output)
172 HttpUtility.HtmlEncode (s, output);
175 public string MapPath (string path)
177 return context.Request.MapPath (path);
180 public void Transfer (string path)
182 // If it's a page and a postback, don't pass form data
184 bool preserveForm = true;
185 if (context.Handler is Page) {
186 Page page = (Page) context.Handler;
187 preserveForm = !page.IsPostBack;
190 Transfer (path, preserveForm);
193 public void Transfer (string path, bool preserveForm)
195 Execute (path, null, preserveForm);
196 context.Response.End ();
199 [MonoTODO ("Not implemented")]
200 public void Transfer (IHttpHandler handler, bool preserveForm)
202 throw new NotImplementedException ();
205 public string UrlDecode (string s)
207 return HttpUtility.UrlDecode (s);
210 public void UrlDecode (string s, TextWriter output)
213 output.Write (HttpUtility.UrlDecode (s));
216 public string UrlEncode (string s)
218 return HttpUtility.UrlEncode (s);
221 public void UrlEncode (string s, TextWriter output)
224 output.Write (HttpUtility.UrlEncode (s));
227 public string UrlPathEncode (string s)
232 int idx = s.IndexOf ("?");
235 s2 = s.Substring (0, idx-1);
236 s2 = HttpUtility.UrlEncode (s2) + s.Substring (idx);
238 s2 = HttpUtility.UrlEncode (s);
244 public string MachineName {
245 [AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium)]
246 // Medium doesn't look heavy enough to replace this... reported as
247 [SecurityPermission (SecurityAction.Assert, UnmanagedCode = true)]
248 [EnvironmentPermission (SecurityAction.Assert, Read = "COMPUTERNAME")]
249 get { return Environment.MachineName; }
252 public int ScriptTimeout {
253 get { return (int) context.ConfigTimeout.TotalSeconds; }
254 [AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium)]
255 set { context.ConfigTimeout = new TimeSpan (0, 0, value); }