Beispiel #1
0
        void OnBeginRequest(object sender, EventArgs e)
        {
            if (PreProcessRequest())
            {
                CustomProfile profile = HttpContext.Current.Profile.AsCustomProfile();

                long startTick = DateTime.Now.Ticks;
                try
                {
                    //Logger.BeginAccess();

                    profile.Init(HttpContext.Current);

                    string host = HttpContext.Current.Request.Url.Host;
                    if (host.IndexOf(".gammatrix.com") < 0)
                    {
                        SiteManager.SiteAndHost siteAndHost = SiteManager.GetByHostName(host);
                        cmSite site = SiteManager.GetSiteByDistinctName(siteAndHost.Site.DistinctName);

                        /*SiteCDNAccessRule rule = SiteCDNAccessRule.Get(site, false);
                         *
                         *
                         * string ip = HttpContext.Current.Request.GetRealUserAddress();
                         *
                         * if (rule.IPAddresses.Where(f=>f.Value == ip).Count() == 0)
                         * //if (!ip.Equals("119.39.124.139", StringComparison.InvariantCulture) &&
                         * //!ip.Equals("124.233.3.10", StringComparison.InvariantCulture))
                         * {
                         *  GEOLocationCDN.CheckGeoLocation(HttpContext.Current, profile.IpCountryID.ToString());
                         * }*/
                    }

                    MvcHttpHandlerEx hander = new MvcHttpHandlerEx();
                    hander.PublicProcessRequest(HttpContext.Current);
                }
                catch (Exception ex)
                {
                    ExceptionHandler.Process(ex);
                    //Logger.Exception(ex);
                }
                finally
                {
                    Logger.EndAccess((DateTime.Now.Ticks - startTick) / 10000000.000M);
                    HttpContext.Current.Response.End();
                }
            }
        }
Beispiel #2
0
        private string DetectLanguage(SiteManager.SiteAndHost siteAndHost, HttpContext context, out string langCode, out string langCodeFromUrl)
        {
            string url = context.Request.RawUrl;

            if (url.Length > 0 && url[0] == '/')
            {
                string[] parts = url.TrimStart('/').Split(s_Seperator, 2);
                if (parts.Length == 2)
                {
                    bool   matched = false;
                    string code    = parts[0].ToLowerInvariant();
                    switch (code)
                    {
                    case "lt":
                    case "en":
                    case "tr":
                    case "ka":
                    case "nl":
                    case "el":
                    case "es":
                    case "et":
                    case "de":
                    case "pl":
                    case "cs":
                    case "ru":
                    case "fr":
                    case "it":
                    case "fi":
                    case "pt":
                    case "da":
                    case "da-dk":
                    case "sv":
                    case "no":
                    case "hu":
                    case "sq":
                    case "sk":
                    case "ro":
                    case "bg":
                    case "sr":
                    case "he":
                    case "hr":
                    case "lv":
                    case "ko":
                    case "sl":
                    case "pt-br":
                    case "vi":
                    case "ja":
                    case "uk":
                    case "en-au":
                    case "en-za":
                    case "en-gb":
                    case "en-nz":
                    case "en-ca":
                    case "se":
                    case "th":
                    case "af":
                    case "mt":
                    {
                        matched = true;
                        break;
                    }

                    case "zh":
                    case "zh-cn":
                    case "zh-tw":
                    {
                        matched = true;
                        break;
                    }

                    case "ar":
                    {
                        matched = true;
                        break;
                    }

                    default:
                        break;
                    }// switch
                    if (matched)
                    {
                        url             = "/" + parts[1];
                        langCode        = code;
                        langCodeFromUrl = code;
                        HttpContext.Current.RewritePath(url);
                        return(url);
                    }
                }
            }

            langCodeFromUrl = string.Empty;

            {
                if (!string.IsNullOrWhiteSpace(siteAndHost.Host.DefaultCulture))
                {
                    langCode = siteAndHost.Host.DefaultCulture;
                    return(url);
                }
                if (!string.IsNullOrWhiteSpace(context.Request.QueryString["culture"]))
                {
                    var supporttedLanguages = siteAndHost.Site.GetSupporttedLanguages().FirstOrDefault(l =>
                                                                                                       string.Equals(l.LanguageCode, context.Request.QueryString["culture"], StringComparison.CurrentCultureIgnoreCase) ||
                                                                                                       string.Equals(l.LanguageCode.Truncate(2), context.Request.QueryString["culture"].Truncate(2), StringComparison.CurrentCultureIgnoreCase));

                    if (supporttedLanguages != null)
                    {
                        langCode = supporttedLanguages.LanguageCode;
                        return(url);
                    }
                }

                // detect preferred language cookie
                HttpCookie cookie = context.Request.Cookies["CMS_Language"];
                if (cookie != null && !string.IsNullOrWhiteSpace(cookie.Value))
                {
                    langCode = cookie.Value;
                    return(url);
                }

                // detect the language by configured IP country map.
                IPLocation ipLocation = IPLocation.GetByIP(context.Request.GetRealUserAddress());
                if (ipLocation != null)
                {
                    var languages = siteAndHost.Site.LoadCountryLanguages();
                    if (languages.ContainsKey(ipLocation.CountryID))
                    {
                        langCode = languages[ipLocation.CountryID];
                        return(url);
                    }
                }

                // detect the preferred language in web browser setting
                string[] userLanguages = context.Request.UserLanguages;
                if (userLanguages != null)
                {
                    foreach (string preferredLanguage in userLanguages)
                    {
                        string code = preferredLanguage.ToLowerInvariant();
                        switch (code)
                        {
                        // convert the iOS language code
                        case "nb":
                        case "nb-no":
                            code = "no";
                            break;

                        default:
                            break;
                        }
                        var supporttedLanguages = siteAndHost.Site.GetSupporttedLanguages().FirstOrDefault(l =>
                                                                                                           string.Equals(l.LanguageCode, code, StringComparison.CurrentCultureIgnoreCase) ||
                                                                                                           string.Equals(l.LanguageCode, code, StringComparison.CurrentCultureIgnoreCase));

                        if (supporttedLanguages != null)
                        {
                            langCode = supporttedLanguages.LanguageCode;
                            return(url);
                        }
                    }
                }

                // use default language for the site
                langCode = siteAndHost.Site.DefaultCulture;
            }

            langCode = langCode.ToLower(CultureInfo.InvariantCulture);
            return(url);
        }
Beispiel #3
0
        /// <summary>
        /// When the request begin, this method is called
        /// </summary>
        bool PreProcessRequest()
        {
            if (HttpContext.Current.Request.Url.Host.IsValidIpAddress())
            {
                if (HttpContext.Current.Request.RawUrl.Equals("/node", StringComparison.InvariantCultureIgnoreCase))
                {
                    string physicalPath = HostingEnvironment.MapPath(HttpContext.Current.Request.RawUrl);
                    if (File.Exists(physicalPath))
                    {
                        HttpContext.Current.Response.ClearHeaders();
                        HttpContext.Current.Response.Clear();
                        HttpContext.Current.Response.WriteFile(physicalPath);
                        HttpContext.Current.Response.End();
                    }
                }
            }

            string host = HttpContext.Current.Request.Url.Host;

            SiteManager.SiteAndHost siteAndHost = SiteManager.GetByHostName(host);

            if (siteAndHost != null)
            {
                SiteManager.Current = siteAndHost.Site;

                if (DDOSRedirector.Handle(SiteManager.Current.DomainID))
                {
                    return(false);
                }

                if (IsIpAddressBlocked(SiteManager.Current))
                {
                    return(false);
                }

                string langCode;
                string langCodeFromUrl;
                string url = DetectLanguage(siteAndHost, HttpContext.Current, out langCode, out langCodeFromUrl);

                HttpContext.Current.Items["GM_Language"] = langCode;

                // set the thread culture
                try
                {
                    CultureInfo culture = new CultureInfo(langCode);
                    HttpContext.Current.Items["IsRightToLeft"] = culture.TextInfo.IsRightToLeft;
                    Thread.CurrentThread.CurrentCulture        = culture;
                    Thread.CurrentThread.CurrentUICulture      = culture;
                }
                catch
                {
                }

                int    index          = url.LastIndexOf('?');
                string urlQueryString = null;
                if (index > 0)
                {
                    urlQueryString = url.Substring(index);
                    url            = url.Substring(0, index);
                }

                // backward compatibility for .c extension name
                if (url.EndsWith(".c", StringComparison.InvariantCultureIgnoreCase))
                {
                    url  = Regex.Replace(url, @"(\.c)$", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
                    url += urlQueryString;
                    HttpContext.Current.Response.AddHeader("Location", url);
                    HttpContext.Current.Response.StatusCode = 301;
                    HttpContext.Current.Response.End();
                    return(false);
                }

                index = url.LastIndexOf('.');
                if (index < 0)
                {
                    string urlToRewrite = null;
                    if (url == "/")
                    {
                        urlToRewrite = siteAndHost.Site.DefaultUrl;
                    }
                    else
                    {
                        Dictionary <string, string> rules = siteAndHost.Site.GetUrlRewriteRules();
                        rules.TryGetValue(url.ToLowerInvariant(), out urlToRewrite);

                        rules = siteAndHost.Site.GetHttpRedirectionRules();
                        string urlToRedirect;
                        if (rules.TryGetValue(url.ToLowerInvariant(), out urlToRedirect))
                        {
                            if (urlToRedirect.StartsWith("/", StringComparison.InvariantCultureIgnoreCase))
                            {
                                if (!string.IsNullOrEmpty(langCodeFromUrl))
                                {
                                    urlToRedirect = string.Format(CultureInfo.InvariantCulture, "/{0}{1}{2}", langCode, urlToRedirect, urlQueryString);
                                }
                                else
                                {
                                    urlToRedirect = string.Format(CultureInfo.InvariantCulture, "{0}{1}", urlToRedirect, urlQueryString);
                                }
                            }
                            HttpContext.Current.Response.ClearHeaders();
                            HttpContext.Current.Response.Clear();
                            HttpContext.Current.Response.AddHeader("Location", urlToRedirect);
                            HttpContext.Current.Response.StatusCode = 301;
                            HttpContext.Current.Response.End();
                            return(false);
                        }
                    }

                    if (urlToRewrite != null)
                    {
                        HttpContext.Current.RewritePath(urlToRewrite);
                    }

                    typeof(HttpContext).InvokeMember("_ProfileDelayLoad"
                                                     , BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField
                                                     , null
                                                     , HttpContext.Current
                                                     , new object[] { true }
                                                     );

                    return(true);
                }
                else // if this is a request with extension filename
                {
                    if (!url.StartsWith("/Views/", StringComparison.InvariantCultureIgnoreCase) &&
                        !url.StartsWith("/App_Themes/", StringComparison.InvariantCultureIgnoreCase) &&
                        !url.StartsWith("/images/", StringComparison.InvariantCultureIgnoreCase) &&
                        !url.StartsWith("/js/", StringComparison.InvariantCultureIgnoreCase) &&
                        !url.StartsWith("/temp/", StringComparison.InvariantCultureIgnoreCase) &&
                        !url.StartsWith("/revisions/", StringComparison.InvariantCultureIgnoreCase) &&
                        !url.StartsWith("/logs/", StringComparison.InvariantCultureIgnoreCase))
                    {
                        string extName     = url.Substring(index);
                        string contentType = "text/html";
                        string physicalPath;
                        switch (extName.ToLower(CultureInfo.InvariantCulture))
                        {
                        case ".ico":
                            contentType = "image/x-icon";
                            break;

                        case ".xml":
                            contentType = "text/xml";
                            break;

                        case ".txt":
                            contentType = "text/plain";
                            break;

                        case ".png":
                            contentType = "image/png";
                            break;

                        case ".htm":
                        case ".html":
                            contentType = "text/html";
                            break;

                        case ".ashx":
                        {
                            contentType = null;
                        }
                        break;

                        case ".webapp":
                            contentType = null;
                            break;

                        case ".js":
                            contentType = "text/javascript";
                            break;

                        case ".json":
                            contentType = "application/json";
                            break;

                        default:
                            return(false);
                        }// switch

                        // check the file in /Views/{distinctname}/ and rewrite
                        HttpResponse response = HttpContext.Current.Response;
                        physicalPath = HostingEnvironment.MapPath(url);
                        if (!File.Exists(physicalPath))
                        {
                            string newUrl = string.Format("/Views/{0}{1}", siteAndHost.Site.DistinctName, url);
                            physicalPath = HostingEnvironment.MapPath(newUrl);
                            if (File.Exists(physicalPath))
                            {
                                if (contentType != null)
                                {
                                    response.ClearHeaders();
                                    response.Clear();
                                    response.ContentType = contentType;
                                    response.TransmitFile(physicalPath);
                                    response.End();
                                }
                                else
                                {
                                    HttpContext.Current.RewritePath(newUrl);
                                }
                            }
                            else if (!string.IsNullOrEmpty(siteAndHost.Site.TemplateDomainDistinctName))
                            {
                                newUrl       = string.Format("/Views/{0}{1}", siteAndHost.Site.TemplateDomainDistinctName, url);
                                physicalPath = HostingEnvironment.MapPath(newUrl);
                                if (File.Exists(physicalPath))
                                {
                                    if (contentType != null)
                                    {
                                        response.ClearHeaders();
                                        response.Clear();
                                        response.ContentType = contentType;
                                        response.TransmitFile(physicalPath);
                                        response.End();
                                    }
                                    else
                                    {
                                        HttpContext.Current.RewritePath(newUrl);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                if (!HttpContext.Current.Request.Url.Host.IsValidIpAddress())
                {
                    SiteManager.ReloadSiteHostCache();
                }

                Logger.RestartException("Restart", string.Format("Current Url: {0}", HttpContext.Current.Request.Url.ToString()));
                HttpContext.Current.Response.Write(".");
                HttpContext.Current.Response.End();
            }

            return(false);
        }