From a71b02136a050dd0219eefd1c42012089a3a76d8 Mon Sep 17 00:00:00 2001 From: Gonzalo Paniagua Javier Date: Thu, 26 Sep 2002 01:33:33 +0000 Subject: [PATCH] 2002-09-25 Gonzalo Paniagua Javier * HttpApplication.cs: added some missing methods. * HttpApplicationFactory.cs: get event handlers for the application. * HttpAsyncResult.cs: little fixes. * HttpRequest.cs: make Encoding work even with no worker request. svn path=/trunk/mcs/; revision=7830 --- mcs/class/System.Web/System.Web/ChangeLog | 7 ++ .../System.Web/System.Web/HttpApplication.cs | 13 +++- .../System.Web/HttpApplicationFactory.cs | 74 +++++++++++++++++-- .../System.Web/System.Web/HttpAsyncResult.cs | 8 +- .../System.Web/System.Web/HttpRequest.cs | 21 +++--- 5 files changed, 101 insertions(+), 22 deletions(-) diff --git a/mcs/class/System.Web/System.Web/ChangeLog b/mcs/class/System.Web/System.Web/ChangeLog index acac427eccf..9216c6af3e2 100644 --- a/mcs/class/System.Web/System.Web/ChangeLog +++ b/mcs/class/System.Web/System.Web/ChangeLog @@ -1,3 +1,10 @@ +2002-09-25 Gonzalo Paniagua Javier + + * HttpApplication.cs: added some missing methods. + * HttpApplicationFactory.cs: get event handlers for the application. + * HttpAsyncResult.cs: little fixes. + * HttpRequest.cs: make Encoding work even with no worker request. + 2002-08-26 Gonzalo Paniagua Javier * HttpWorkerRequest.cs: mcs doesn't go crazy. It's just me, that forgot diff --git a/mcs/class/System.Web/System.Web/HttpApplication.cs b/mcs/class/System.Web/System.Web/HttpApplication.cs index 1d09c093886..1171cfa0fd9 100644 --- a/mcs/class/System.Web/System.Web/HttpApplication.cs +++ b/mcs/class/System.Web/System.Web/HttpApplication.cs @@ -46,6 +46,7 @@ namespace System.Web { static object ResolveRequestCacheId = new Object(); static object ReleaseRequestStateId = new Object(); static object PreSendRequestContentId = new Object(); + static object PreSendRequestHeadersId = new Object(); static object PreRequestHandlerExecuteId = new Object(); static object PostRequestHandlerExecuteId = new Object(); static object ErrorId = new Object(); @@ -118,6 +119,16 @@ namespace System.Web { remove { Events.RemoveHandler(UpdateRequestCacheId, value); } } + public event EventHandler PreSendRequestHeaders + { + add { + Events.AddHandler (PreSendRequestHeadersId, value); + } + remove { + Events.RemoveHandler (PreSendRequestHeadersId, value); + } + } + public void AddOnAcquireRequestStateAsync(BeginEventHandler beg, EndEventHandler end) { if (null == _acquireRequestStateAsync) _acquireRequestStateAsync = new AsyncEvents(); @@ -869,7 +880,7 @@ namespace System.Web { } } - public EventHandlerList Events { + protected EventHandlerList Events { get { if (null == _Events) { _Events = new EventHandlerList(); diff --git a/mcs/class/System.Web/System.Web/HttpApplicationFactory.cs b/mcs/class/System.Web/System.Web/HttpApplicationFactory.cs index 5154572cea2..9c3e313c1ae 100644 --- a/mcs/class/System.Web/System.Web/HttpApplicationFactory.cs +++ b/mcs/class/System.Web/System.Web/HttpApplicationFactory.cs @@ -7,6 +7,7 @@ using System; using System.Collections; using System.IO; +using System.Reflection; using System.Web; using System.Web.SessionState; @@ -27,6 +28,8 @@ namespace System.Web { static private int _appMaxFreePublicInstances = 32; private HttpApplicationState _state; + MethodInfo [] appTypeEventHandlers; + static IHttpHandler custApplication; static private HttpApplicationFactory s_Factory = new HttpApplicationFactory(); @@ -49,12 +52,64 @@ namespace System.Web { // Setup filemonitor for all filedepend also. // tmp + _state = new HttpApplicationState (); // FIXME: should get it from compiled app file. _appType = Type.GetType("System.Web.HttpApplication"); } else { - _appType = Type.GetType("System.Web.HttpApplication"); + _appType = typeof (System.Web.HttpApplication); + _state = new HttpApplicationState (); } - // TODO: Use reflection to find the Session/Application/Custom Module events + GetApplicationTypeEvents (); + } + + private bool IsEventHandler (MethodInfo m) + { + //Anything else? + ParameterInfo [] pi = m.GetParameters (); + if (pi.Length != 2) + return false; + + if (pi [0].ParameterType != typeof (object) || + pi [1].ParameterType != typeof (EventArgs)) + return false; + + if (!m.Name.EndsWith ("Application_OnStart") && + !m.Name.EndsWith ("Application_OnEnd") && + !m.Name.EndsWith ("Session_OnStart") && + !m.Name.EndsWith ("Session_OnEnd")) + return false; + + return true; + + } + + private void GetApplicationTypeEvents () + { + ArrayList evtMethods = new ArrayList (); + BindingFlags flags = BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.DeclaredOnly; + + MethodInfo [] methods = _appType.GetMethods (flags); + foreach (MethodInfo m in methods) { + if (IsEventHandler (m)) + evtMethods.Add (m); + } + + Type baseType = _appType.BaseType; + if (baseType != typeof (HttpApplication)) { + flags = BindingFlags.NonPublic | + BindingFlags.Static | + BindingFlags.Instance; + + methods = _appType.GetMethods (flags); + foreach (MethodInfo m in methods) { + if (IsEventHandler (m)) + evtMethods.Add (m); + } + } + + appTypeEventHandlers = (MethodInfo []) evtMethods.ToArray (typeof (MethodInfo)); } [MonoTODO("FireOnAppStart(HttpContext context)")] @@ -108,7 +163,7 @@ namespace System.Web { } } - static public IHttpHandler GetInstance(HttpContext context) { + internal static IHttpHandler GetInstance(HttpContext context) { if (!s_Factory._appInitialized) { lock (s_Factory) { if (!s_Factory._appInitialized) { @@ -121,7 +176,7 @@ namespace System.Web { return s_Factory.GetPublicInstance(context); } - static public void RecycleInstance(HttpApplication app) { + internal static void RecycleInstance(HttpApplication app) { if (!s_Factory._appInitialized) throw new InvalidOperationException("Factory not intialized"); @@ -149,7 +204,7 @@ namespace System.Web { return (IHttpHandler) app; } - public void RecyclePublicInstance(HttpApplication app) { + internal void RecyclePublicInstance(HttpApplication app) { lock (_appFreePublicList) { if (_appFreePublicInstances < _appMaxFreePublicInstances) { _appFreePublicList.Push(app); @@ -174,16 +229,21 @@ namespace System.Web { } } - static public void EndApplication() { + internal static void EndApplication() { s_Factory.Dispose(); } - static public void StartSession(HttpSessionState state, object source, EventArgs args) { + internal static void StartSession(HttpSessionState state, object source, EventArgs args) { s_Factory.FireOnSessionStart(state, source, args); } static void EndSession(HttpSessionState state, object source, EventArgs args) { s_Factory.FireOnSessionEnd(state, source, args); } + + public static void SetCustomApplication (IHttpHandler customApplication) + { + custApplication = customApplication; + } } } diff --git a/mcs/class/System.Web/System.Web/HttpAsyncResult.cs b/mcs/class/System.Web/System.Web/HttpAsyncResult.cs index e5a0b49b4db..87340a616b4 100644 --- a/mcs/class/System.Web/System.Web/HttpAsyncResult.cs +++ b/mcs/class/System.Web/System.Web/HttpAsyncResult.cs @@ -9,7 +9,7 @@ using System.Threading; namespace System.Web { - public class HttpAsyncResult : IAsyncResult + internal class HttpAsyncResult : IAsyncResult { private object _result; private object _asyncState; @@ -19,12 +19,12 @@ namespace System.Web private bool _ready; private bool _readySync; - public HttpAsyncResult(AsyncCallback callback, object state) { + internal HttpAsyncResult(AsyncCallback callback, object state) { _callback = callback; _asyncState = state; } - public void Complete(bool sync, object result, Exception error) { + internal void Complete(bool sync, object result, Exception error) { _ready = true; _readySync = sync; _result = result; @@ -34,7 +34,7 @@ namespace System.Web } } - public Exception Error { + internal Exception Error { get { return null; } diff --git a/mcs/class/System.Web/System.Web/HttpRequest.cs b/mcs/class/System.Web/System.Web/HttpRequest.cs index dfb3fd33e95..41d28af56e2 100644 --- a/mcs/class/System.Web/System.Web/HttpRequest.cs +++ b/mcs/class/System.Web/System.Web/HttpRequest.cs @@ -317,16 +317,17 @@ namespace System.Web { { get { if (_oContentEncoding == null) { - if (!_WorkerRequest.HasEntityBody () || ContentType != String.Empty) - return null; - - string charset = GetValueFromHeader (_sContentType, "charset"); - if (charset == null) - return null; - - try { - _oContentEncoding = Encoding.GetEncoding (charset); - } catch { + if (_WorkerRequest != null && + (!_WorkerRequest.HasEntityBody () || ContentType != String.Empty)) { + _oContentEncoding = Encoding.Default; + } else { + string charset; + charset = GetValueFromHeader (_sContentType, "charset"); + try { + _oContentEncoding = Encoding.GetEncoding (charset); + } catch { + _oContentEncoding = Encoding.Default; + } } } -- 2.25.1