File: WebSockets\AspNetWebSocketContextImpl.cs
Project: ndp\fx\src\xsp\system\Web\System.Web.csproj (System.Web)
//------------------------------------------------------------------------------
// <copyright file="AspNetWebSocketContextImpl.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
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<string> 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;
            }
        }
 
    }
}