Advertisement
Guest User

My.Web.UrlRewriteModuleBase

a guest
Apr 1st, 2014
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 17.30 KB | None | 0 0
  1. using EPiServer;
  2. using EPiServer.Core;
  3. using EPiServer.Editor;
  4. using EPiServer.Web.Routing;
  5. using log4net;
  6. using System;
  7. using System.Threading;
  8. using System.Web;
  9. using System.Reflection;
  10.  
  11. namespace My.Web
  12. {
  13.     /// <summary>
  14.     /// Responsible for raising appropriate events for mapping between internal and external formats of the
  15.     ///             request URLs.
  16.     ///
  17.     /// </summary>
  18.     ///
  19.     /// <remarks>
  20.     /// Will parse outgoing HTML, and incoming and outgoing special urls and parameter strings, raising the
  21.     ///             appropriate events implemented by the implementation derived classes. It is this
  22.     ///             modules responsibility to identify all necessary urls for rewriting in one or the other direction. The
  23.     ///             descendant class must provide the actual rewriting functionality.
  24.     ///
  25.     /// </remarks>
  26.     ///
  27.     [Obsolete("This is a temporary solution so IIS 8.5 would work as well")]
  28.     public abstract class UrlRewriteModuleBase : EPiServer.Web.UrlRewriteModuleBase
  29.     {
  30.         /// <summary>
  31.         /// A logger instance.
  32.         ///
  33.         /// </summary>
  34.         private static ILog _log = LogManager.GetLogger(typeof(UrlRewriteModuleBase));
  35.  
  36.         /// <summary>
  37.         /// Gets or sets a value indicating whether the response to the current request should
  38.         ///             be processed for rewriting of internal links to friendly urls.
  39.         ///
  40.         /// </summary>
  41.         ///
  42.         /// <value>
  43.         /// <c>true</c> if the response will be processed by UrlRewriteProvider.
  44.         ///
  45.         /// </value>
  46.         public override bool FURLRewriteResponse
  47.         {
  48.             get
  49.             {
  50.                 return UrlRewriteModuleBase.GetRequestContext().FURLRewriteResponse;
  51.             }
  52.             set
  53.             {
  54.                 UrlRewriteModuleBase.GetRequestContext().FURLRewriteResponse = value;
  55.             }
  56.         }
  57.  
  58.         /// <summary>
  59.         /// Gets or sets the internal URL.
  60.         ///
  61.         /// </summary>
  62.         ///
  63.         /// <value>
  64.         /// The internal URL
  65.         /// </value>
  66.         ///
  67.         /// <remarks>
  68.         /// Used together with UrlExternal to provide the necessary context for rewriting relative
  69.         ///             URL's and to make them relative after rewriting, if required.
  70.         ///
  71.         /// </remarks>
  72.         public new UrlBuilder UrlInternal
  73.         {
  74.             get
  75.             {
  76.                 return UrlRewriteModuleBase.GetRequestContext().UrlInternal;
  77.             }
  78.         }
  79.  
  80.         /// <summary>
  81.         /// Gets or sets the external URL.
  82.         ///
  83.         /// </summary>
  84.         ///
  85.         /// <value>
  86.         /// The external URL
  87.         /// </value>
  88.         ///
  89.         /// <remarks>
  90.         /// Used together with UrlInternal to provide the necessary context for rewriting relative
  91.         ///             URL's and to make them relative after rewriting, if required.
  92.         ///
  93.         /// </remarks>
  94.         public new UrlBuilder UrlExternal
  95.         {
  96.             get
  97.             {
  98.                 return UrlRewriteModuleBase.GetRequestContext().UrlExternal;
  99.             }
  100.         }
  101.  
  102.         /// <summary>
  103.         /// Initialize events. Use this handler to subscribe to the relevant events. Raised once
  104.         ///             per instance of the HttpModule.
  105.         ///
  106.         /// </summary>
  107.         public new static event EventHandler<EPiServer.Web.UrlRewriteEventArgs> HttpRewriteInit;
  108.  
  109.         /// <summary>
  110.         /// Raised before rewriting the request URL from external to internal
  111.         ///
  112.         /// </summary>
  113.         ///
  114.         /// <remarks>
  115.         /// Extra validation can be performed here, as well as pre-steps in the rewriting
  116.         ///             process. Set e.Cancel to true to stop rewriting from ocurring.
  117.         ///
  118.         /// </remarks>
  119.         public new event EventHandler<EPiServer.Web.UrlRewriteEventArgs> HttpRewritingToInternal;
  120.  
  121.         /// <summary>
  122.         /// Raised after rewriting the request URL from external to internal
  123.         ///
  124.         /// </summary>
  125.         public new event EventHandler<EPiServer.Web.UrlRewriteEventArgs> HttpRewroteToInternal;
  126.  
  127.         /// <summary>
  128.         /// Raised before rewriting the request URL from internal to external
  129.         ///
  130.         /// </summary>
  131.         ///
  132.         /// <remarks>
  133.         /// Extra validation can be performed here, as well as pre-steps in the rewriting
  134.         ///             process. Set e.Cancel to true to stop rewriting from ocurring.
  135.         ///
  136.         /// </remarks>
  137.         public new event EventHandler<EPiServer.Web.UrlRewriteEventArgs> HttpRewritingToExternal;
  138.  
  139.         /// <summary>
  140.         /// Raised after rewriting the request URL from internal to external
  141.         ///
  142.         /// </summary>
  143.         public new event EventHandler<EPiServer.Web.UrlRewriteEventArgs> HttpRewroteToExternal;
  144.  
  145.         /// <summary>
  146.         /// Raised before adding the the HTML rewrite-filter.
  147.         ///
  148.         /// </summary>
  149.         ///
  150.         /// <remarks>
  151.         /// Extra validation can be performed here. Set e.Cancel to true to stop rewriting from ocurring.
  152.         ///
  153.         /// </remarks>
  154.         public new event EventHandler<EPiServer.Web.UrlRewriteEventArgs> HtmlAddingRewriteToExternalFilter;
  155.  
  156.         /// <summary>
  157.         /// Raised after the HTML rewriting filter has been added.
  158.         ///
  159.         /// </summary>
  160.         public new event EventHandler<EPiServer.Web.UrlRewriteEventArgs> HtmlAddedRewriteToExternalFilter;
  161.  
  162.         static UrlRewriteModuleBase()
  163.         {
  164.         }
  165.  
  166.         /// <summary>
  167.         /// Raises the <see cref="E:EPiServer.Web.UrlRewriteModuleBase.HttpRewriteInit"/> event.
  168.         ///
  169.         /// </summary>
  170.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  171.         protected override void OnHttpRewriteInit(EPiServer.Web.UrlRewriteEventArgs e)
  172.         {
  173.             EventHandler<EPiServer.Web.UrlRewriteEventArgs> eventHandler = UrlRewriteModuleBase.HttpRewriteInit;
  174.             if (eventHandler == null)
  175.                 return;
  176.             eventHandler((object)this, e);
  177.         }
  178.  
  179.         /// <summary>
  180.         /// Raises the <see cref="E:EPiServer.Web.UrlRewriteModuleBase.HttpRewritingToInternal"/> event.
  181.         ///
  182.         /// </summary>
  183.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  184.         protected override void OnHttpRewritingToInternal(EPiServer.Web.UrlRewriteEventArgs e)
  185.         {
  186.             EventHandler<EPiServer.Web.UrlRewriteEventArgs> eventHandler = this.HttpRewritingToInternal;
  187.             if (eventHandler == null)
  188.                 return;
  189.             eventHandler((object)this, e);
  190.         }
  191.  
  192.         /// <summary>
  193.         /// Raises the <see cref="E:EPiServer.Web.UrlRewriteModuleBase.HttpRewroteToInternal"/> event.
  194.         ///
  195.         /// </summary>
  196.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  197.         protected override void OnHttpRewroteToInternal(EPiServer.Web.UrlRewriteEventArgs e)
  198.         {
  199.             EventHandler<EPiServer.Web.UrlRewriteEventArgs> eventHandler = this.HttpRewroteToInternal;
  200.             if (eventHandler == null)
  201.                 return;
  202.             eventHandler((object)this, e);
  203.         }
  204.  
  205.         /// <summary>
  206.         /// Raises the <see cref="E:EPiServer.Web.UrlRewriteModuleBase.HttpRewritingToExternal"/> event.
  207.         ///
  208.         /// </summary>
  209.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  210.         protected override void OnHttpRewritingToExternal(EPiServer.Web.UrlRewriteEventArgs e)
  211.         {
  212.             EventHandler<EPiServer.Web.UrlRewriteEventArgs> eventHandler = this.HttpRewritingToExternal;
  213.             if (eventHandler == null)
  214.                 return;
  215.             eventHandler((object)this, e);
  216.         }
  217.  
  218.         /// <summary>
  219.         /// Raises the <see cref="E:EPiServer.Web.UrlRewriteModuleBase.HttpRewroteToExternal"/> event.
  220.         ///
  221.         /// </summary>
  222.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  223.         protected override void OnHttpRewroteToExternal(EPiServer.Web.UrlRewriteEventArgs e)
  224.         {
  225.             EventHandler<EPiServer.Web.UrlRewriteEventArgs> eventHandler = this.HttpRewroteToExternal;
  226.             if (eventHandler == null)
  227.                 return;
  228.             eventHandler((object)this, e);
  229.         }
  230.  
  231.         /// <summary>
  232.         /// Raises the <see cref="E:EPiServer.Web.UrlRewriteModuleBase.HtmlAddingRewriteToExternalFilter"/> event.
  233.         ///
  234.         /// </summary>
  235.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  236.         protected override void OnHtmlAddingRewriteToExternalFilter(EPiServer.Web.UrlRewriteEventArgs e)
  237.         {
  238.             EventHandler<EPiServer.Web.UrlRewriteEventArgs> eventHandler = this.HtmlAddingRewriteToExternalFilter;
  239.             if (eventHandler == null)
  240.                 return;
  241.             eventHandler((object)this, e);
  242.         }
  243.  
  244.         /// <summary>
  245.         /// Raises the <see cref="E:EPiServer.Web.UrlRewriteModuleBase.HtmlAddedRewriteToExternalFilter"/> event.
  246.         ///
  247.         /// </summary>
  248.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  249.         protected override void OnHtmlAddedRewriteToExternalFilter(EPiServer.Web.UrlRewriteEventArgs e)
  250.         {
  251.             EventHandler<EPiServer.Web.UrlRewriteEventArgs> eventHandler = this.HtmlAddedRewriteToExternalFilter;
  252.             if (eventHandler == null)
  253.                 return;
  254.             eventHandler((object)this, e);
  255.         }
  256.  
  257.         private static UrlRewriteModuleBase.RequestContext GetRequestContext()
  258.         {
  259.             HttpContext current = HttpContext.Current;
  260.             UrlRewriteModuleBase.RequestContext requestContext = current.Items[(object)"EP:urlRewriteContext"] as UrlRewriteModuleBase.RequestContext;
  261.             if (requestContext == null)
  262.             {
  263.                 requestContext = new UrlRewriteModuleBase.RequestContext();
  264.                 Uri url = current.Request.Url;
  265.                 requestContext.UrlInternal = new UrlBuilder(url);
  266.                 requestContext.UrlExternal = new UrlBuilder(new Uri(url, current.Request.RawUrl));
  267.                 current.Items[(object)"EP:urlRewriteContext"] = (object)requestContext;
  268.             }
  269.             return requestContext;
  270.         }
  271.  
  272.         /// <summary>
  273.         /// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.
  274.         ///
  275.         /// </summary>
  276.         public override void Dispose()
  277.         {
  278.         }
  279.  
  280.         public static void SetPrivateVariable(System.Type t, string varName, object varValue, object objInstance)
  281.         {
  282.             BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
  283.             PropertyInfo pi;
  284.  
  285.             pi = t.GetProperty(varName, eFlags);
  286.             if (pi != null)
  287.                 pi.SetValue(objInstance, varValue, null);
  288.         }
  289.  
  290.         /// <summary>
  291.         /// Called by the ASP.NET framework to initialize module
  292.         ///
  293.         /// </summary>
  294.         /// <param name="application"/>
  295.         public override void Init(HttpApplication application)
  296.         {
  297.             application.BeginRequest += new EventHandler(this.BeginRequestEventHandler);
  298.             application.EndRequest += new EventHandler(this.EndRequestEventHandler);
  299.             application.PostRequestHandlerExecute += new EventHandler(this.PostRequestHandlerExecuteEventHandler);
  300.             SetPrivateVariable(typeof(EPiServer.Web.UrlRewriteProvider), "IsFurlEnabled", true, null);
  301.             SetPrivateVariable(typeof(EPiServer.Web.UrlRewriteProvider), "Module", this, null);
  302.             //EPiServer.Web.UrlRewriteProvider.IsFurlEnabled = true;
  303.             //EPiServer.Web.UrlRewriteProvider.Module = this;
  304.             this.OnHttpRewriteInit(new EPiServer.Web.UrlRewriteEventArgs());
  305.         }
  306.  
  307.         /// <summary>
  308.         /// The BeginRequest event handler.
  309.         ///             We should only handle Friendly URL rewrites here, and it depends on the authentication mechanism
  310.         ///             where we actually do it. This is a TODO...
  311.         ///
  312.         /// </summary>
  313.         /// <param name="sender"/><param name="e"/>
  314.         private void BeginRequestEventHandler(object sender, EventArgs e)
  315.         {
  316.             HttpApplication httpApplication = (HttpApplication)sender;
  317.             if (UrlRewriteModuleBase._log.IsDebugEnabled)
  318.                 UrlRewriteModuleBase._log.DebugFormat("Starting request with Url {0}", (object)httpApplication.Request.Url);
  319.             UrlRewriteModuleBase.RequestContext requestContext = UrlRewriteModuleBase.GetRequestContext();
  320.             this.HttpUrlRewriteToInternal(requestContext.UrlInternal);
  321.             if (string.Equals(HttpUtility.UrlDecode((string)requestContext.UrlInternal), HttpUtility.UrlDecode((string)requestContext.UrlExternal), StringComparison.OrdinalIgnoreCase))
  322.             {
  323.                 if (!UrlRewriteModuleBase._log.IsDebugEnabled)
  324.                     return;
  325.                 UrlRewriteModuleBase._log.DebugFormat("Exiting with no rewrite, Url is {0}", (object)requestContext.UrlInternal);
  326.             }
  327.             else
  328.             {
  329.                 if (string.IsNullOrEmpty(requestContext.UrlInternal.Path))
  330.                 {
  331.                     ExceptionManager.RenderHttpRuntimeError((Exception)new HttpException(404, "Not Found"));
  332.                     httpApplication.Context.Response.End();
  333.                 }
  334.                 RequestContextExtension.SetContentLink(httpApplication.Context.Request.RequestContext, EPiServer.Web.PermanentLinkUtility.GetContentReference(requestContext.UrlInternal));
  335.                 RequestContextExtension.SetLanguage(httpApplication.Context.Request.RequestContext, requestContext.UrlInternal.QueryLanguage);
  336.                 httpApplication.Context.RewritePath(requestContext.UrlInternal.Path, string.Empty, UriSupport.RemoveQueryStringDelimeter(requestContext.UrlInternal.Query), true);
  337.                 if (!UrlRewriteModuleBase._log.IsDebugEnabled)
  338.                     return;
  339.                 UrlRewriteModuleBase._log.Debug((object)string.Format("17.1.3 UrlRewriteModule rewrites from '{0}' to '{1}'", (object)requestContext.UrlExternal, (object)requestContext.UrlInternal));
  340.             }
  341.         }
  342.  
  343.         /// <summary>
  344.         /// The EndRequest event handler
  345.         ///
  346.         /// </summary>
  347.         /// <param name="sender"/><param name="e"/>
  348.         protected new void EndRequestEventHandler(object sender, EventArgs e)
  349.         {
  350.             HttpResponse response = ((HttpApplication)sender).Response;
  351.             if (response.StatusCode != 301 && response.StatusCode != 302 && (response.StatusCode != 303 && response.StatusCode != 307))
  352.                 return;
  353.             int num = PageEditing.PageIsInEditMode ? 1 : 0;
  354.             response.RedirectLocation = this.HttpUrlRewriteToExternal(response.RedirectLocation, UrlBuilder.RebaseKind.ToRootRelative);
  355.         }
  356.  
  357.         /// <summary>
  358.         /// Handles the PostRequestHandlerExecute event of the application. This is where we decide whether to
  359.         ///             hookup the rewrite filter for the output stream, based on MIME-type.
  360.         ///
  361.         /// </summary>
  362.         /// <param name="sender">The source of the event.</param><param name="e">The <see cref="T:System.EventArgs"/> instance containing the event data.</param>
  363.         protected new void PostRequestHandlerExecuteEventHandler(object sender, EventArgs e)
  364.         {
  365.             this.HtmlAddRewriteToExternalFilter((HttpApplication)sender);
  366.         }
  367.  
  368.         /// <summary>
  369.         /// Rewrite a request URL to external.
  370.         ///
  371.         /// </summary>
  372.         /// <param name="url">The URL.</param><param name="typeOfUrl">The type of rebasing to perform on the url.</param>
  373.         /// <returns>
  374.         /// The rewritten request URL
  375.         /// </returns>
  376.         protected override abstract string HttpUrlRewriteToExternal(string url, UrlBuilder.RebaseKind typeOfUrl);
  377.  
  378.         /// <summary>
  379.         /// Rewrite the URL to internal.
  380.         ///
  381.         /// </summary>
  382.         /// <param name="url">The URL, possibly rewritten</param>
  383.         protected override abstract void HttpUrlRewriteToInternal(UrlBuilder url);
  384.  
  385.         /// <summary>
  386.         /// Connect a filter for rewriting of outgoing HTML, and perform other actions before actually sending the HTML
  387.         ///
  388.         /// </summary>
  389.         /// <param name="httpApplication">The HttpApplication instance</param>
  390.         //public abstract void HtmlAddRewriteToExternalFilter(HttpApplication httpApplication);
  391.  
  392.         private class RequestContext
  393.         {
  394.             public UrlBuilder UrlInternal;
  395.             public UrlBuilder UrlExternal;
  396.             public bool FURLRewriteResponse;
  397.         }
  398.     }
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement