// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. namespace System.Web.WebPages { /// /// The default BrowserOverrideStore. Gets overridden user agent for a request from a cookie. /// Creates a cookie to set the overridden user agent. /// public class CookieBrowserOverrideStore : BrowserOverrideStore { internal static readonly string BrowserOverrideCookieName = ".ASPXBrowserOverride"; private readonly int _daysToExpire; /// /// Creates the BrowserOverrideStore setting any browser override cookie to expire in 7 days. /// public CookieBrowserOverrideStore() : this(daysToExpire: 7) { } /// /// Constructor to control the expiration of the browser override cookie. /// public CookieBrowserOverrideStore(int daysToExpire) { _daysToExpire = daysToExpire; } /// /// Looks for a user agent by searching for the browser override cookie. If no cookie is found /// returns null. /// public override string GetOverriddenUserAgent(HttpContextBase httpContext) { // Check the response to see if the cookie has been set somewhere in the current request. HttpCookieCollection responseCookies = httpContext.Response.Cookies; // NOTE: Only look for the key (via AllKeys) so a new cookie is not automatically created. string[] cookieNames = responseCookies.AllKeys; // NOTE: use a simple for loop since it performs an order of magnitude faster than .Contains() // and this is a hot path that gets executed for every request. for (int i = 0; i < cookieNames.Length; i++) { // HttpCookieCollection uses OrdinalIgnoreCase comparison for its keys if (String.Equals(cookieNames[i], BrowserOverrideCookieName, StringComparison.OrdinalIgnoreCase)) { HttpCookie currentOverriddenBrowserCookie = responseCookies[BrowserOverrideCookieName]; if (currentOverriddenBrowserCookie.Value != null) { return currentOverriddenBrowserCookie.Value; } else { // The cookie has no value. It was cleared on the current request so return null. return null; } } } // If there was no cookie found in the response check the request. var requestOverrideCookie = httpContext.Request.Cookies[BrowserOverrideCookieName]; if (requestOverrideCookie != null) { return requestOverrideCookie.Value; } return null; } /// /// Adds a browser override cookie with the set user agent to the response of the current request. /// If the user agent is null the browser override cookie is set to expire, otherwise its expiration is set /// to daysToExpire, specified when CookieBasedOverrideStore is created. /// public override void SetOverriddenUserAgent(HttpContextBase httpContext, string userAgent) { HttpCookie browserOverrideCookie = new HttpCookie(BrowserOverrideCookieName, HttpUtility.UrlEncode(userAgent)); if (userAgent == null) { browserOverrideCookie.Expires = DateTime.Now.AddDays(-1); } else { // Only set expiration if the cookie should live longer than the current session if (_daysToExpire > 0) { browserOverrideCookie.Expires = DateTime.Now.AddDays(_daysToExpire); } } httpContext.Response.Cookies.Remove(BrowserOverrideCookieName); httpContext.Response.Cookies.Add(browserOverrideCookie); } } }