Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mcs / class / System.Web / System.Web / DefaultHttpHandler.cs
1 //
2 // System.Web.DefaultHttpHandler
3 //
4 // Author:
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 //
8 // Copyright (C) 2006-2009 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 using System.Collections.Specialized;
31 using System.Threading;
32
33 namespace System.Web
34 {
35         public class DefaultHttpHandler : IHttpAsyncHandler
36         {
37                 sealed class DefaultHandlerAsyncResult : IAsyncResult
38                 {
39                         public object AsyncState {
40                                 get;
41                                 private set;
42                         }
43
44                         public WaitHandle AsyncWaitHandle {
45                                 get { return null; }
46                         }
47                         
48                         public bool CompletedSynchronously {
49                                 get { return true; }
50                         }
51
52                         public bool IsCompleted {
53                                 get { return true; }
54                         }
55                         
56                         public DefaultHandlerAsyncResult (AsyncCallback callback, object state)
57                         {
58                                 this.AsyncState = state;
59
60                                 if (callback != null)
61                                         callback (this);
62                         }
63                 }
64
65                 NameValueCollection executeUrlHeaders;
66                 
67                 protected HttpContext Context {
68                         get;
69                         private set;
70                 }
71
72                 public virtual bool IsReusable {
73                         get { return false; }
74                 }
75                 
76                 protected NameValueCollection ExecuteUrlHeaders {
77                         get {
78                                 HttpContext context = Context;
79                                 HttpRequest req = context != null ? context.Request : null;
80                                 if (req != null && executeUrlHeaders != null)   
81                                         executeUrlHeaders = new NameValueCollection (req.Headers);
82                                 
83                                 return executeUrlHeaders;
84                         }
85                 }
86
87                 public virtual IAsyncResult BeginProcessRequest (HttpContext context, AsyncCallback callback, object state)
88                 {
89                         this.Context = context;
90
91                         HttpRequest req = context != null ? context.Request : null;
92                         string filePath = req != null ? req.FilePath : null;
93
94                         if (!String.IsNullOrEmpty (filePath) && String.Compare (".asp", VirtualPathUtility.GetExtension (filePath), StringComparison.OrdinalIgnoreCase) == 0)
95                                 throw new HttpException (String.Format ("Access to file '{0}' is forbidden.", filePath));
96
97                         if (req != null && String.Compare ("POST", req.HttpMethod, StringComparison.OrdinalIgnoreCase) == 0)
98                                 throw new HttpException (String.Format ("Method '{0}' is not allowed when accessing file '{1}'", req.HttpMethod, filePath));
99
100                         var sfh = new StaticFileHandler ();
101                         sfh.ProcessRequest (context);
102                         
103                         return new DefaultHandlerAsyncResult (callback, state);
104                 }
105
106                 public virtual void EndProcessRequest (IAsyncResult result)
107                 {
108                         // nothing to do
109                 }
110                 
111                 public virtual void ProcessRequest (HttpContext context)
112                 {
113                         throw new InvalidOperationException ("The ProcessRequest cannot be called synchronously.");
114                 }
115
116                 public virtual void OnExecuteUrlPreconditionFailure ()
117                 {
118                         // nothing to do
119                 }
120
121                 public virtual string OverrideExecuteUrlPath ()
122                 {
123                         return null;
124                 }
125         }
126 }
127