//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Web.WebSockets { using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Net; using System.Net.WebSockets; using System.Security.Principal; using System.Web.Caching; using System.Web.Profile; // Concrete implementation of AspNetWebSocketContext internal sealed class AspNetWebSocketContextImpl : AspNetWebSocketContext { // The HttpContextBase below isn't the entire HttpContext object graph, // but rather a very small subset that contains only properties relevant // to a WebSockets request. This should prevent the Gen 2 heap from being // spammed with data that's irrelevant to a WebSockets request. private readonly HttpContextBase _httpContext; private readonly HttpWorkerRequest _workerRequest; private readonly AspNetWebSocket _webSocket; private CookieCollection _cookieCollection; public AspNetWebSocketContextImpl(HttpContextBase httpContext = null, HttpWorkerRequest workerRequest = null, AspNetWebSocket webSocket = null) { _httpContext = httpContext; _workerRequest = workerRequest; _webSocket = webSocket; } public override string AnonymousID { get { return _httpContext.Request.AnonymousID; } } public override HttpApplicationStateBase Application { get { return _httpContext.Application; } } public override string ApplicationPath { get { return _httpContext.Request.ApplicationPath; } } public override Cache Cache { get { return _httpContext.Cache; } } public override HttpClientCertificate ClientCertificate { get { return _httpContext.Request.ClientCertificate; } } public override CookieCollection CookieCollection { get { if (_cookieCollection == null) { // converts a System.Web.HttpCookieCollection to a System.Net.CookieCollection CookieCollection cc = new CookieCollection(); HttpCookieCollection hcc = Cookies; for (int i = 0; i < hcc.Count; i++) { HttpCookie cookie = hcc.Get(i); cc.Add(new Cookie { Name = cookie.Name, Value = cookie.Value, HttpOnly = cookie.HttpOnly, Path = cookie.Path, Secure = cookie.Secure, Domain = cookie.Domain, Expires = cookie.Expires }); } _cookieCollection = cc; } return _cookieCollection; } } public override HttpCookieCollection Cookies { get { return _httpContext.Request.Cookies; } } public override string FilePath { get { return _httpContext.Request.FilePath; } } public override NameValueCollection Headers { get { return _httpContext.Request.Headers; } } public override bool IsAuthenticated { get { return _httpContext.Request.IsAuthenticated; } } public override bool IsClientConnected { get { return _workerRequest.IsClientConnected(); } } public override bool IsDebuggingEnabled { get { return _httpContext.IsDebuggingEnabled; } } public override bool IsLocal { get { return _httpContext.Request.IsLocal; } } public override bool IsSecureConnection { get { return _httpContext.Request.IsSecureConnection; } } public override IDictionary Items { get { return _httpContext.Items; } } public override WindowsIdentity LogonUserIdentity { get { return _httpContext.Request.LogonUserIdentity; } } public override string Origin { get { return Headers["Origin"]; } } public override string Path { get { return _httpContext.Request.Path; } } public override string PathInfo { get { return _httpContext.Request.PathInfo; } } public override ProfileBase Profile { get { return _httpContext.Profile; } } public override NameValueCollection QueryString { get { return _httpContext.Request.QueryString; } } public override string RawUrl { get { return _httpContext.Request.RawUrl; } } public override Uri RequestUri { get { return _httpContext.Request.Url; } } public override string SecWebSocketKey { get { return Headers["Sec-WebSocket-Key"]; } } public override IEnumerable SecWebSocketProtocols { get { return _httpContext.WebSocketRequestedProtocols; } } public override string SecWebSocketVersion { get { return Headers["Sec-WebSocket-Version"]; } } public override HttpServerUtilityBase Server { get { return _httpContext.Server; } } public override NameValueCollection ServerVariables { get { return _httpContext.Request.ServerVariables; } } public override DateTime Timestamp { get { return _httpContext.Timestamp; } } public override UnvalidatedRequestValuesBase Unvalidated { get { return _httpContext.Request.Unvalidated; } } public override Uri UrlReferrer { get { return _httpContext.Request.UrlReferrer; } } public override IPrincipal User { get { return _httpContext.User; } } public override string UserAgent { get { return _httpContext.Request.UserAgent; } } public override string UserHostAddress { get { return _httpContext.Request.UserHostAddress; } } public override string UserHostName { get { return _httpContext.Request.UserHostName; } } public override string[] UserLanguages { get { return _httpContext.Request.UserLanguages; } } public override WebSocket WebSocket { get { return _webSocket; } } } }