Advertisement
Guest User

My.Web.UrlRewriteModule

a guest
Apr 1st, 2014
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.44 KB | None | 0 0
  1. using EPiServer;
  2. using EPiServer.BaseLibrary;
  3. using EPiServer.Core;
  4. using EPiServer.Globalization;
  5. using EPiServer.Web.Routing;
  6. using log4net;
  7. using System;
  8. using System.Globalization;
  9. using System.IO;
  10. using System.Web;
  11. using System.Web.Routing;
  12. using System.Web.UI;
  13.  
  14. namespace My.Web
  15. {
  16.     /// <summary>
  17.     /// Implements UrlSegment-based URL rewriting.
  18.     ///
  19.     /// </summary>
  20.     ///
  21.     /// <remarks>
  22.     /// Refer to "Routing" in the Developer Guide for more information and examples.
  23.     ///
  24.     /// </remarks>
  25.     public class UrlRewriteModule : UrlRewriteModuleBase
  26.     {
  27.         /// <summary>
  28.         /// A logger instance.
  29.         ///
  30.         /// </summary>
  31.         private static ILog _log = LogManager.GetLogger(typeof(UrlRewriteModule));
  32.  
  33.         static UrlRewriteModule()
  34.         {
  35.         }
  36.  
  37.         /// <summary>
  38.         /// Rewrite a URL in a HTTP request from external to internal representation
  39.         ///
  40.         /// </summary>
  41.         /// <param name="url">The URL, possibly rewritten</param>
  42.         /// <remarks>
  43.         /// Rewrites to internal representation, typically EPiServer classic with id= and epslanguage=,
  44.         ///             taking care not to rewrite certain "untouchable" directories. Will also strip id= in all
  45.         ///             other cases to comply with the requirement that site enumeration should not be possible.
  46.         ///
  47.         /// </remarks>
  48.         protected override void HttpUrlRewriteToInternal(UrlBuilder url)
  49.         {
  50.             EPiServer.Web.UrlRewriteEventArgs e = new EPiServer.Web.UrlRewriteEventArgs(url, new EPiServer.Web.UrlRewriteEventArgs.Context(this.UrlInternal, this.UrlExternal));
  51.             this.OnHttpRewritingToInternal(e);
  52.             if (e.Cancel)
  53.             {
  54.                 if (!UrlRewriteModule._log.IsDebugEnabled)
  55.                     return;
  56.                 UrlRewriteModule._log.DebugFormat("Further URL rewriting stopped. Returning URL {0}", (object)e.Url);
  57.             }
  58.             else
  59.             {
  60.                 Global.UrlRewriteProvider.ValidateRewriteToInternal(e, this.UrlExternal.Path);
  61.                 if (e.Cancel)
  62.                 {
  63.                     if (!UrlRewriteModule._log.IsDebugEnabled)
  64.                         return;
  65.                     UrlRewriteModule._log.DebugFormat("Url is not valid for rewrite. Returning URL {0}", (object)e.Url);
  66.                 }
  67.                 else
  68.                 {
  69.                     CultureInfo preferredCulture;
  70.                     object internalObject;
  71.                     if (Global.UrlRewriteProvider.TryConvertToInternal(e.Url, out preferredCulture, out internalObject))
  72.                     {
  73.                         if (internalObject is RedirectPageReference)
  74.                         {
  75.                             if ((string)e.Url == (string)this.UrlExternal)
  76.                             {
  77.                                 HttpContext.Current.Response.End();
  78.                                 return;
  79.                             }
  80.                             else
  81.                             {
  82.                                 HttpContext.Current.Response.Redirect((string)e.Url, true);
  83.                                 return;
  84.                             }
  85.                         }
  86.                         else
  87.                         {
  88.                             if (preferredCulture != null)
  89.                                 ContentLanguage.PreferredCulture = preferredCulture;
  90.                             e.IsModified = true;
  91.                             ContentReference contentReference = internalObject as ContentReference;
  92.                             if (UrlRewriteModule._log.IsDebugEnabled)
  93.                                 UrlRewriteModule._log.DebugFormat("Returning URL {0} as PageReference {0}", (object)e.Url, contentReference == (ContentReference)null ? (object)"(NULL)" : (object)contentReference.ToString());
  94.                         }
  95.                     }
  96.                     else if (UrlRewriteModule._log.IsDebugEnabled)
  97.                         UrlRewriteModule._log.DebugFormat("Returning URL {0}", (object)e.Url.ToString());
  98.                     this.OnHttpRewroteToInternal(e);
  99.                 }
  100.             }
  101.         }
  102.  
  103.         /// <summary>
  104.         /// Rewrite a URL om a HTTP request from internal to external.
  105.         ///
  106.         /// </summary>
  107.         /// <param name="url">The URL.</param><param name="typeOfUrl">The type of rebasing to perform on the url.</param>
  108.         /// <returns>
  109.         /// The rewritten request URL
  110.         /// </returns>
  111.         protected override string HttpUrlRewriteToExternal(string url, UrlBuilder.RebaseKind typeOfUrl)
  112.         {
  113.             EPiServer.Web.UrlRewriteEventArgs e;
  114.             try
  115.             {
  116.                 e = new EPiServer.Web.UrlRewriteEventArgs(new UrlBuilder(url), new EPiServer.Web.UrlRewriteEventArgs.Context(this.UrlInternal, this.UrlExternal));
  117.             }
  118.             catch (UriFormatException ex)
  119.             {
  120.                 UrlRewriteModule._log.Warn((object)string.Format("The URL '{0}' was not handled.", (object)url), (Exception)ex);
  121.                 return url;
  122.             }
  123.             this.OnHttpRewritingToExternal(e);
  124.             if (e.Cancel)
  125.             {
  126.                 if (UrlRewriteModule._log.IsDebugEnabled)
  127.                     UrlRewriteModule._log.DebugFormat("Further URL rewriting stopped. Returning URL {0}", (object)e.Url);
  128.                 return UrlRewriteModule.GetEventReturnUrl(e, url);
  129.             }
  130.             else
  131.             {
  132.                 Global.UrlRewriteProvider.ValidateRewriteToExternal(e, this.UrlInternal.Path);
  133.                 if (e.Cancel)
  134.                 {
  135.                     if (UrlRewriteModule._log.IsDebugEnabled)
  136.                         UrlRewriteModule._log.DebugFormat("Url is not valid for rewrite. Returning URL {0}", (object)e.Url);
  137.                     return UrlRewriteModule.GetEventReturnUrl(e, url);
  138.                 }
  139.                 else
  140.                 {
  141.                     ContentReference contentReference = EPiServer.Web.PermanentLinkUtility.GetContentReference(e.Url);
  142.                     if (Global.UrlRewriteProvider.ConvertToExternal(e.Url, (object)contentReference, HttpContext.Current.Response.ContentEncoding))
  143.                     {
  144.                         e.IsModified = true;
  145.                         if (UrlRewriteModule._log.IsDebugEnabled)
  146.                             UrlRewriteModule._log.DebugFormat("Url was rewritten by the provider to {0}", (object)e.Url);
  147.                         if (!string.IsNullOrEmpty(e.Url.QueryCollection["id"]))
  148.                         {
  149.                             e.Url.QueryCollection.Remove("id");
  150.                             e.IsModified = true;
  151.                         }
  152.                     }
  153.                     EPiServer.Web.UrlRewriteEventArgs rewriteEventArgs = e;
  154.                     int num = rewriteEventArgs.IsModified | e.Url.Rebase(this.UrlInternal, this.UrlExternal, typeOfUrl) ? 1 : 0;
  155.                     rewriteEventArgs.IsModified = num != 0;
  156.                     this.OnHttpRewroteToExternal(e);
  157.                     return UrlRewriteModule.GetEventReturnUrl(e, url);
  158.                 }
  159.             }
  160.         }
  161.  
  162.         /// <summary>
  163.         /// Connect a filter for rewriting of outgoing HTML, and perform other actions before actually sending the HTML
  164.         ///
  165.         /// </summary>
  166.         /// <param name="httpApplication"/>
  167.         public override void HtmlAddRewriteToExternalFilter(HttpApplication httpApplication)
  168.         {
  169.             if (EPiServer.BaseLibrary.Context.Current["EP:validationDone"] != null)
  170.                 return;
  171.             EPiServer.BaseLibrary.Context.Current["EP:validationDone"] = (object)true;
  172.             if (!this.FURLRewriteResponse)
  173.                 return;
  174.             EPiServer.Web.UrlRewriteEventArgs e = new EPiServer.Web.UrlRewriteEventArgs(this.UrlExternal);
  175.             e.Internal = (object)httpApplication;
  176.             this.OnHtmlAddingRewriteToExternalFilter(e);
  177.             if (e.Cancel && !e.ForceRewriteHtml)
  178.                 return;
  179.             this.ValidateRewriteHtmlToExternal(e);
  180.             if (e.Cancel && !e.ForceRewriteHtml)
  181.                 return;
  182.             EPiServer.Web.RewritePipe rewritePipe;
  183.             Stream rewriteFilter = Global.UrlRewriteProvider.GetHtmlRewriter().GetRewriteFilter(this.UrlInternal, this.UrlExternal, httpApplication.Context.Response.ContentEncoding, httpApplication.Context.Response.Filter, out rewritePipe);
  184.             httpApplication.Context.Response.Filter = rewriteFilter;
  185.             this.OnHtmlAddedRewriteToExternalFilter(e);
  186.         }
  187.  
  188.         /// <summary>
  189.         /// Check if we should rewrite outgoing HTML. e.Cancel will be set to true if we should not.
  190.         ///
  191.         /// </summary>
  192.         /// <param name="e">The <see cref="T:EPiServer.Web.UrlRewriteEventArgs"/> instance containing the event data.</param>
  193.         protected virtual void ValidateRewriteHtmlToExternal(EPiServer.Web.UrlRewriteEventArgs e)
  194.         {
  195.             e.Cancel = !string.Equals(HttpContext.Current.Response.ContentType, "text/html", StringComparison.OrdinalIgnoreCase);
  196.             if (e.Cancel)
  197.             {
  198.                 e.Cancel = !EPiServer.Web.UpdatePanelPostBackRewritePipe.IsUpdatePanelPostback;
  199.                 if (e.Cancel)
  200.                     return;
  201.             }
  202.             e.Cancel = HttpContext.Current.Response.StatusCode == 304;
  203.             if (e.Cancel)
  204.                 return;
  205.             Page page = HttpContext.Current.Handler as Page;
  206.             if (page != null)
  207.                 e.Cancel = page.IsCallback;
  208.             if (EPiServer.Web.HttpRequestSupport.IsRequestSystemDirectory && !UrlRewriteModule.RoutedThroughCMSRoute())
  209.                 e.Cancel = true;
  210.             if (HttpContext.Current.Handler != null)
  211.                 return;
  212.             e.Cancel = true;
  213.         }
  214.  
  215.         private static bool RoutedThroughCMSRoute()
  216.         {
  217.             RouteData routeData = RouteTable.Routes.GetRouteData((HttpContextBase)new HttpContextWrapper(HttpContext.Current));
  218.             return routeData != null && !ContentReference.IsNullOrEmpty(routeData.DataTokens[RoutingConstants.NodeKey] as ContentReference);
  219.         }
  220.  
  221.         private static string GetEventReturnUrl(EPiServer.Web.UrlRewriteEventArgs e, string url)
  222.         {
  223.             if (!e.IsModified)
  224.                 return url;
  225.             else
  226.                 return (string)e.Url;
  227.         }
  228.     }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement