[System.Runtime.Serialization] Static writer fix.
[mono.git] / mcs / class / System.Web / System.Web.Routing / UrlRoutingModule.cs
1 //
2 // UrlRoutingModule.cs
3 //
4 // Author:
5 //      Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2008 Novell Inc. http://novell.com
8 //
9
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 using System;
31 using System.Runtime.CompilerServices;
32 using System.Security.Permissions;
33 using System.Threading;
34 using System.Web;
35
36 namespace System.Web.Routing
37 {
38         [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
39         [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
40         [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
41         public class UrlRoutingModule : IHttpModule
42         {
43                 RouteCollection routes;
44                 public RouteCollection RouteCollection {
45                         get {
46                                 if (routes == null)
47                                         routes = RouteTable.Routes;
48                                 return routes;
49                         }
50                         set { routes = value; }
51                 }
52
53                 protected virtual void Dispose ()
54                 {
55                 }
56
57                 void IHttpModule.Dispose ()
58                 {
59                         Dispose ();
60                 }
61
62                 void IHttpModule.Init (HttpApplication application)
63                 {
64                         Init (application);
65                 }
66
67                 protected virtual void Init (HttpApplication application)
68                 {
69                         application.PostMapRequestHandler += PostMapRequestHandler;
70                         application.PostResolveRequestCache += PostResolveRequestCache;
71                 }
72
73                 void PostMapRequestHandler (object o, EventArgs e)
74                 {
75                         var app = (HttpApplication) o;
76                         PostMapRequestHandler (new HttpContextWrapper (app.Context));
77                 }
78
79                 void PostResolveRequestCache (object o, EventArgs e)
80                 {
81                         var app = (HttpApplication) o;
82                         PostResolveRequestCache (new HttpContextWrapper (app.Context));
83                 }
84                 [Obsolete]
85                 public virtual void PostMapRequestHandler (HttpContextBase context)
86                 {
87                 }
88
89                 [MonoTODO]
90                 public virtual void PostResolveRequestCache (HttpContextBase context)
91                 {
92                         if (context == null)
93                                 throw new ArgumentNullException ("context");
94
95                         var rd = RouteCollection.GetRouteData (context);
96                         if (rd == null)
97                                 return; // do nothing
98
99                         if (rd.RouteHandler == null)
100                                 throw new InvalidOperationException ("No  IRouteHandler is assigned to the selected route");
101
102                         if (rd.RouteHandler is StopRoutingHandler)
103                                 return; //stop further processing
104                         
105                         var rc = new RequestContext (context, rd);
106
107                         IHttpHandler http = rd.RouteHandler.GetHttpHandler (rc);
108                         if (http == null)
109                                 throw new InvalidOperationException ("The mapped IRouteHandler did not return an IHttpHandler");
110                         context.Request.RequestContext = rc;
111                         context.RemapHandler (http);
112                 }
113         }
114 }