2003-01-10 Gonzalo Paniagua Javier <gonzalo@ximian.com>
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Fri, 10 Jan 2003 07:57:39 +0000 (07:57 -0000)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Fri, 10 Jan 2003 07:57:39 +0000 (07:57 -0000)
* HttpApplication.cs: keep _lasterror if no context. Attach
application events *after* modules initialization (if not, User is not
set when the user handler is called).

* HttpApplicationFactory.cs: made all methods related to
AttachEvents static. I will fix OnStart/OnEnd for application and
session later.

* HttpRequest.cs: don't initialize cookies twice.

svn path=/trunk/mcs/; revision=10326

mcs/class/System.Web/System.Web/ChangeLog
mcs/class/System.Web/System.Web/HttpApplication.cs
mcs/class/System.Web/System.Web/HttpApplicationFactory.cs
mcs/class/System.Web/System.Web/HttpRequest.cs

index 28a1955b9d8f9d4c26376e32a12df3568e0f738d..b0921719f507d90456ab9958899d205033010842 100644 (file)
@@ -1,3 +1,15 @@
+2003-01-10  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * HttpApplication.cs: keep _lasterror if no context. Attach
+       application events *after* modules initialization (if not, User is not
+       set when the user handler is called).
+       
+       * HttpApplicationFactory.cs: made all methods related to
+       AttachEvents static. I will fix OnStart/OnEnd for application and
+       session later.
+       
+       * HttpRequest.cs: don't initialize cookies twice.
+
 2003-01-10  Gonzalo Paniagua Javier <gonzalo@ximian.com>
 
        * HttpResponse.cs:
index 3e0178f3e451e92d78566b2441d953a5d49e7892..044e1d1c7ac3d393931e05efd2684a6d71633a10 100644 (file)
@@ -602,8 +602,10 @@ namespace System.Web
                                        _app.OnStateExecuteEnter ();
                                        try {
                                                do {
-                                                       if (null != lasterror)
+                                                       if (null != lasterror) {
                                                                _app.HandleError (lasterror);
+                                                               lasterror = null;
+                                                       }
 
                                                        // Check if request flow is to be stopped
                                                        if (_app._CompleteRequest)
@@ -811,6 +813,8 @@ namespace System.Web
                        } else {
                                if (null != _lastError)
                                        fire = false;
+
+                               _lastError = obj;
                        }
 
                        if (!fire)
@@ -839,6 +843,7 @@ namespace System.Web
 
                        // Initialize all IHttpModule(s)
                        InitModules ();
+                       HttpApplicationFactory.AttachEvents (this);
 
                        // Initialize custom application
                        _InPreRequestResponseMode = true;
index dc9baddc366c61c2003ad6f77ab0ccd875605a97..c290aae578935581573e927fc40d982e240018d4 100644 (file)
@@ -32,7 +32,6 @@ namespace System.Web {
                static private int      _appMaxFreePublicInstances = 32;\r
 \r
                private HttpApplicationState _state;\r
-               Hashtable appTypeEventHandlers;\r
                static Hashtable appEventNames;\r
 \r
                static IHttpHandler custApplication;\r
@@ -42,8 +41,6 @@ namespace System.Web {
                static HttpApplicationFactory ()\r
                {\r
                        appEventNames = new Hashtable ();\r
-                       appEventNames.Add ("Application_Start", null);\r
-                       appEventNames.Add ("Application_End", null);\r
                        appEventNames.Add ("Application_BeginRequest", null);\r
                        appEventNames.Add ("Application_AuthenticateRequest", null);\r
                        appEventNames.Add ("Application_AuthorizeRequest", null);\r
@@ -58,8 +55,6 @@ namespace System.Web {
                        appEventNames.Add ("Application_PreSendRequestContent", null);\r
                        appEventNames.Add ("Application_Disposed", null);\r
                        appEventNames.Add ("Application_Error", null);\r
-                       appEventNames.Add ("Session_Start", null);\r
-                       appEventNames.Add ("Session_End", null);\r
                }\r
                \r
                public HttpApplicationFactory() {\r
@@ -85,11 +80,9 @@ namespace System.Web {
                                _appType = typeof (System.Web.HttpApplication);\r
                                _state = new HttpApplicationState ();\r
                        }\r
-\r
-                       GetApplicationTypeEvents ();\r
                }\r
 \r
-               private bool IsEventHandler (MethodInfo m)\r
+               static bool IsEventHandler (MethodInfo m)\r
                {\r
                        if (m.ReturnType != typeof (void))\r
                                return false;\r
@@ -105,7 +98,7 @@ namespace System.Web {
                        return appEventNames.ContainsKey (m.Name);\r
                }\r
 \r
-               void AddEvent (MethodInfo method)\r
+               static void AddEvent (MethodInfo method, Hashtable appTypeEventHandlers)\r
                {\r
                        string name = method.Name;\r
                        ArrayList list;\r
@@ -117,9 +110,10 @@ namespace System.Web {
                        list.Add (method);\r
                }\r
                \r
-               private void GetApplicationTypeEvents ()\r
+               static Hashtable GetApplicationTypeEvents (HttpApplication app)\r
                {\r
-                       appTypeEventHandlers = new Hashtable ();\r
+                       Type appType = app.GetType ();\r
+                       Hashtable appTypeEventHandlers = new Hashtable ();\r
                        ArrayList evtMethods = new ArrayList ();\r
                        BindingFlags flags = BindingFlags.Public    |\r
                                             BindingFlags.NonPublic | \r
@@ -127,54 +121,56 @@ namespace System.Web {
                                             BindingFlags.Instance |\r
                                             BindingFlags.Static;\r
 \r
-                       MethodInfo [] methods = _appType.GetMethods (flags);\r
+                       MethodInfo [] methods = appType.GetMethods (flags);\r
                        foreach (MethodInfo m in methods) {\r
                                if (IsEventHandler (m))\r
-                                       AddEvent (m);\r
+                                       AddEvent (m, appTypeEventHandlers);\r
                        }\r
 \r
-                       Type baseType = _appType.BaseType;\r
+                       Type baseType = appType.BaseType;\r
                        if (baseType == typeof (HttpApplication))\r
-                               return;\r
+                               return appTypeEventHandlers;\r
 \r
                        flags = BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;\r
 \r
-                       methods = _appType.GetMethods (flags);\r
+                       methods = appType.GetMethods (flags);\r
                        foreach (MethodInfo m in methods) {\r
                                if (IsEventHandler (m))\r
-                                       AddEvent (m);\r
+                                       AddEvent (m, appTypeEventHandlers);\r
                        }\r
+\r
+                       return appTypeEventHandlers;\r
                }\r
 \r
                void FireEvents (string method_name, object state_context, object [] args)\r
                {\r
-                       //TODO: anything to do with the context or state?\r
-                       ArrayList methods = appTypeEventHandlers [method_name] as ArrayList;\r
+                       /*\r
                        if (methods == null || methods.Count == 0)\r
                                return;\r
 \r
                        foreach (MethodInfo method in methods)\r
                                method.Invoke (this, args);\r
+                       */\r
                }\r
                \r
                void FireOnAppStart (HttpContext context)\r
                {\r
-                       FireEvents ("Application_Start", context, new object [] {this, EventArgs.Empty});\r
+                       FireEvents ("Application_OnStart", context, new object [] {this, EventArgs.Empty});\r
                }\r
 \r
                void FireOnAppEnd ()\r
                {\r
-                       FireEvents ("Application_End", null, new object [] {this, EventArgs.Empty});\r
+                       FireEvents ("Application_OnEnd", null, new object [] {this, EventArgs.Empty});\r
                }\r
 \r
                void FireOnSessionStart (HttpSessionState state, object source, EventArgs args)\r
                {\r
-                       FireEvents ("Session_Start", state, new object [] {source, args});\r
+                       FireEvents ("Session_OnStart", state, new object [] {source, args});\r
                }\r
                \r
                void FireOnSessionEnd (HttpSessionState state, object source, EventArgs args)\r
                {\r
-                       FireEvents ("Session_End", state, new object [] {source, args});\r
+                       FireEvents ("Session_OnEnd", state, new object [] {source, args});\r
                }\r
        \r
                private void InitializeFactory(HttpContext context) {\r
@@ -234,18 +230,20 @@ namespace System.Web {
                        s_Factory.RecyclePublicInstance(app);\r
                }\r
 \r
-               void AttachEvents (HttpApplication app)\r
+               internal static void AttachEvents (HttpApplication app)\r
                {\r
+                       Type appType = app.GetType ();\r
+                       Hashtable appTypeEventHandlers = GetApplicationTypeEvents (app);\r
                        foreach (string key in appTypeEventHandlers.Keys) {\r
-                               if (key == "Application_Start" || key == "Application_End" ||\r
-                                   key == "Sesssion_Start"    || key == "Session_End")\r
+                               if (key == "Application_OnStart" || key == "Application_OnEnd" ||\r
+                                   key == "Session_OnStart"     || key == "Session_OnEnd")\r
                                    continue;\r
 \r
                                int pos = key.IndexOf ('_');\r
                                if (pos == -1 || key.Length <= pos + 1)\r
                                        continue;\r
 \r
-                               EventInfo evt = _appType.GetEvent (key.Substring (pos + 1));\r
+                               EventInfo evt = appType.GetEvent (key.Substring (pos + 1));\r
                                if (evt == null)\r
                                        continue;\r
                        \r
@@ -272,7 +270,6 @@ namespace System.Web {
                                // Create non-public object\r
                                app = (HttpApplication) HttpRuntime.CreateInternalObject(_appType);\r
 \r
-                               AttachEvents (app);\r
                                app.Startup(context, HttpApplicationFactory.ApplicationState);\r
                        }\r
 \r
index 32f8edeccf382ec59d6733c84fa57858c675eea3..90f40023e776546aed766a31f2f08598921284c6 100644 (file)
@@ -450,7 +450,6 @@ namespace System.Web {
                         *      ',' as a separator produces errors.\r
                         */\r
 \r
-                       cookies = new HttpCookieCollection (_oContext.Response, false);\r
                        string [] name_values = header.Trim ().Split (';');\r
                        int length = name_values.Length;\r
                        HttpCookie cookie = null;\r