// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { private static IList EmptyList = new List(); private IFeatureCollection _features; private FeatureReference _request = FeatureReference.Default; private FeatureReference _webSockets = FeatureReference.Default; public DefaultWebSocketManager(IFeatureCollection features) { _features = features; } private IHttpRequestFeature HttpRequestFeature { get { return _request.Fetch(_features); } } private IHttpWebSocketFeature WebSocketFeature { get { return _webSockets.Fetch(_features); } } public override bool IsWebSocketRequest { get { return WebSocketFeature != null && WebSocketFeature.IsWebSocketRequest; } } public override IList WebSocketRequestedProtocols { get { return ParsingHelpers.GetHeaderUnmodified(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols) ?? EmptyList; } } public override Task AcceptWebSocketAsync(string subProtocol) { if (WebSocketFeature == null) { throw new NotSupportedException("WebSockets are not supported"); } return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol }); } } }