#region Copyright
//+ Nalarium Pro 3.0 - Web Module
//+ Copyright © Jampad Technology, Inc. 2008-2010
#endregion
using System;
using System.Diagnostics;
using System.Reflection;
using System.Text;
using System.Web;
using System.Web.Routing;
using Nalarium.Configuration.AppConfig;
using Nalarium.Web.AccessRule;
using Nalarium.Web.Processing.Configuration;
//+
namespace Nalarium.Web.Processing
{
///
/// Not for programmatic use.
///
public class CoreModule : IHttpModule
{
//- ~Info -//
private static Boolean _profilingEnabled;
private static Boolean _profilingIncludeExclusions;
//internal static Boolean IsMvpAvailable;
//internal static Boolean IsMvcAvailable;
//internal static Type mvcHandlerType;
//+ field
private Boolean _isExclusion;
private DateTime _startDateTime;
//+
//- @Dispose -//
#region IHttpModule Members
public void Dispose()
{
}
//+
//- @Init -//
public void Init(HttpApplication httpApplication)
{
RouteActivator.RunSystemInitProcessors();
//+
_profilingEnabled = ProcessingSection.GetConfigSection().Profiling.Enabled;
_profilingIncludeExclusions = ProcessingSection.GetConfigSection().Profiling.IncludeExclusions;
//+
httpApplication.BeginRequest += OnBeginRequest;
httpApplication.EndRequest += OnEndRequest;
//+
//+
httpApplication.PostAuthorizeRequest += OnPostAuthorizeRequest;
if (HttpRuntime.UsingIntegratedPipeline)
{
httpApplication.PostResolveRequestCache += OnProcessRoute;
httpApplication.PostMapRequestHandler += OnSetHandler;
}
else
{
httpApplication.PostMapRequestHandler += OnProcessRoute;
httpApplication.PostMapRequestHandler += OnSetHandler;
}
httpApplication.PostAcquireRequestState += OnPostAcquireRequestState;
//+
httpApplication.Error += ErrorHandler.OnHandleError;
}
#endregion
//- $BeginRequest -//
private void OnBeginRequest(Object sender, EventArgs ea)
{
//+ exclusion
new ExclusionInitProcessor().Execute();
_isExclusion = FlowControl.IsHalted;
HttpData.SetScopedItem(Info.Scope, "HTTP_X_ORIGINAL_URL", Http.AbsoluteUrl);
//+ profiling
if (_profilingEnabled && (!_isExclusion || (_isExclusion && _profilingIncludeExclusions)))
{
_startDateTime = DateTime.Now;
}
}
//- $EndRequest -//
private void OnEndRequest(Object sender, EventArgs ea)
{
if (_profilingEnabled && (!_isExclusion || (_isExclusion && _profilingIncludeExclusions)))
{
DateTime endDateTime = DateTime.Now;
Double milliSeconds = (endDateTime - _startDateTime).TotalMilliseconds;
var builder = new StringBuilder();
builder.Append(Http.AbsolutePath + ", ");
builder.Append(milliSeconds.ToString() + "ms");
Debug.WriteLine(builder.ToString());
}
}
//- $OnPostAuthorizeRequest -//
private void OnPostAuthorizeRequest(Object sender, EventArgs ea)
{
if (_isExclusion)
{
return;
}
//+
Boolean disableProcessing = false;
ProcessingSection section = ProcessingSection.GetConfigSection();
if (section != null)
{
disableProcessing = section.DisableProcessing;
}
HttpData.SetScopedItem(Info.Scope, Info.DisableProcessing, disableProcessing);
if (disableProcessing == false)
{
var ha = sender as HttpApplication;
RouteActivator.RunContextInitProcessors(ha.Context);
_isExclusion = FlowControl.IsHalted;
if (_isExclusion)
{
return;
}
//+
if (Http.IPAddress.Equals("72.47.154.93"))
{
AccessRuleChecker.SystemCheck(ProcessingSection.GetConfigSection().WebDomain.AccessRuleGroup);
}
}
}
//- $OnProcessRoute -//
private void OnProcessRoute(Object sender, EventArgs ea)
{
if (_isExclusion)
{
return;
}
//+
if (HttpData.GetScopedItem(Info.Scope, Info.DisableProcessing) == false)
{
var ha = sender as HttpApplication;
HttpContext context = ha.Context;
//+
FlowControl.ActiveHandler = RouteActivator.Create(context);
if (HttpRuntime.UsingIntegratedPipeline)
{
ha.Context.RemapHandler(FlowControl.ActiveHandler);
}
else
{
ha.Context.Handler = FlowControl.ActiveHandler;
}
}
//+ first send
if (WebProcessingReportController.Reporter.Initialized)
{
Boolean hasDataToSend = WebProcessingReportController.Reporter.HasDataToSend;
if (hasDataToSend)
{
String name = SystemSection.GetConfigSection().AppInfo.Name;
if (!String.IsNullOrEmpty(name))
{
var map = new Map();
map.Add("App Name", name);
WebProcessingReportController.Reporter.InsertMap(map, 0);
}
WebProcessingReportController.Reporter.Send(true);
WebProcessingReportController.Reporter.ReportCreator.Clear();
}
}
}
//- $OnProcessRoute -//
private void OnSetHandler(Object sender, EventArgs ea)
{
if (_isExclusion)
{
return;
}
//+
if (HttpData.GetScopedItem(Info.Scope, Info.DisableProcessing) == false)
{
var ha = sender as HttpApplication;
HttpContext context = ha.Context;
//+
FlowControl.ActiveHandler = RouteActivator.Create(context);
if (FlowControl.ActiveHandler != null
&& !(FlowControl.ActiveHandler is PassThroughHttpHandler)
&& !(FlowControl.ActiveHandler is DummyHttpHandler))
{
Type type = typeof(UrlRoutingModule);
FieldInfo fi = type.GetField("_requestDataKey", BindingFlags.Static | BindingFlags.NonPublic);
if (fi != null)
{
Object key = fi.GetValue(null);
if (key != null)
{
Object value = Http.Context.Items[key];
Http.Context.Items[key] = null;
}
}
ha.Context.Handler = FlowControl.ActiveHandler;
}
}
//+ first send
if (WebProcessingReportController.Reporter.Initialized)
{
Boolean hasDataToSend = WebProcessingReportController.Reporter.HasDataToSend;
if (hasDataToSend)
{
String name = SystemSection.GetConfigSection().AppInfo.Name;
if (!String.IsNullOrEmpty(name))
{
var map = new Map();
map.Add("App Name", name);
WebProcessingReportController.Reporter.InsertMap(map, 0);
}
WebProcessingReportController.Reporter.Send(true);
WebProcessingReportController.Reporter.ReportCreator.Clear();
}
}
}
//- $OnPostAcquireRequestState -//
private void OnPostAcquireRequestState(Object sender, EventArgs ea)
{
if (_isExclusion)
{
return;
}
//+
if (HttpData.GetScopedItem(Info.Scope, Info.DisableProcessing) == false)
{
if (Http.Session != null)
{
//+ security
new SecurityStateProcessor().Execute();
//+
if (FlowControl.ActiveHandler != null && !(FlowControl.ActiveHandler is PassThroughHttpHandler) && !FlowControl.OverrideProcessingSkipped)
{
ProcessorRunner.RunStateProcessors();
}
}
}
//+ second send
if (WebProcessingReportController.Reporter.Initialized)
{
if (WebProcessingReportController.Reporter.HasDataToSend)
{
var map = new Map();
map.Add("Begin", "Post State Processor Section");
WebProcessingReportController.Reporter.InsertMap(map, 0);
String name = SystemSection.GetConfigSection().AppInfo.Name;
if (!String.IsNullOrEmpty(name))
{
map = new Map();
map.Add("App Name", name);
WebProcessingReportController.Reporter.InsertMap(map, 0);
}
//+
WebProcessingReportController.Reporter.Send(true);
}
}
}
#region Nested type: Info
internal static class Info
{
public const String Scope = "__$Nalarium$Core";
//+
public const String DisableProcessing = "DisableProcessing";
}
#endregion
}
}