private static async Task <HttpListenerWebSocketContext> AcceptWebSocketAsyncCore(HttpListenerContext context, string subProtocol, int receiveBufferSize, TimeSpan keepAliveInterval, ArraySegment <byte> internalBuffer) { HttpListenerWebSocketContext webSocketContext = null; if (Logging.On) { Logging.Enter(Logging.WebSockets, context, "AcceptWebSocketAsync", ""); } try { // get property will create a new response if one doesn't exist. HttpListenerResponse response = context.Response; HttpListenerRequest request = context.Request; ValidateWebSocketHeaders(context); string secWebSocketVersion = request.Headers[HttpKnownHeaderNames.SecWebSocketVersion]; // Optional for non-browser client string origin = request.Headers[HttpKnownHeaderNames.Origin]; List <string> secWebSocketProtocols = new List <string>(); string outgoingSecWebSocketProtocolString; bool shouldSendSecWebSocketProtocolHeader = WebSocketHelpers.ProcessWebSocketProtocolHeader( request.Headers[HttpKnownHeaderNames.SecWebSocketProtocol], subProtocol, out outgoingSecWebSocketProtocolString); if (shouldSendSecWebSocketProtocolHeader) { secWebSocketProtocols.Add(outgoingSecWebSocketProtocolString); response.Headers.Add(HttpKnownHeaderNames.SecWebSocketProtocol, outgoingSecWebSocketProtocolString); } // negotiate the websocket key return value string secWebSocketKey = request.Headers[HttpKnownHeaderNames.SecWebSocketKey]; string secWebSocketAccept = WebSocketHelpers.GetSecWebSocketAcceptString(secWebSocketKey); response.Headers.Add(HttpKnownHeaderNames.Connection, HttpKnownHeaderNames.Upgrade); response.Headers.Add(HttpKnownHeaderNames.Upgrade, WebSocketHelpers.WebSocketUpgradeToken); response.Headers.Add(HttpKnownHeaderNames.SecWebSocketAccept, secWebSocketAccept); response.StatusCode = (int)HttpStatusCode.SwitchingProtocols; // HTTP 101 response.ComputeCoreHeaders(); ulong hresult = SendWebSocketHeaders(response); if (hresult != 0) { throw new WebSocketException((int)hresult, SR.GetString(SR.net_WebSockets_NativeSendResponseHeaders, WebSocketHelpers.MethodNames.AcceptWebSocketAsync, hresult)); } if (Logging.On) { Logging.PrintInfo(Logging.WebSockets, string.Format("{0} = {1}", HttpKnownHeaderNames.Origin, origin)); Logging.PrintInfo(Logging.WebSockets, string.Format("{0} = {1}", HttpKnownHeaderNames.SecWebSocketVersion, secWebSocketVersion)); Logging.PrintInfo(Logging.WebSockets, string.Format("{0} = {1}", HttpKnownHeaderNames.SecWebSocketKey, secWebSocketKey)); Logging.PrintInfo(Logging.WebSockets, string.Format("{0} = {1}", HttpKnownHeaderNames.SecWebSocketAccept, secWebSocketAccept)); Logging.PrintInfo(Logging.WebSockets, string.Format("Request {0} = {1}", HttpKnownHeaderNames.SecWebSocketProtocol, request.Headers[HttpKnownHeaderNames.SecWebSocketProtocol])); Logging.PrintInfo(Logging.WebSockets, string.Format("Response {0} = {1}", HttpKnownHeaderNames.SecWebSocketProtocol, outgoingSecWebSocketProtocolString)); } await response.OutputStream.FlushAsync().SuppressContextFlow(); HttpResponseStream responseStream = response.OutputStream as HttpResponseStream; Contract.Assert(responseStream != null, "'responseStream' MUST be castable to System.Net.HttpResponseStream."); ((HttpResponseStream)response.OutputStream).SwitchToOpaqueMode(); HttpRequestStream requestStream = new HttpRequestStream(context); requestStream.SwitchToOpaqueMode(); WebSocketHttpListenerDuplexStream webSocketStream = new WebSocketHttpListenerDuplexStream(requestStream, responseStream, context); WebSocket webSocket = WebSocket.CreateServerWebSocket(webSocketStream, subProtocol, receiveBufferSize, keepAliveInterval, internalBuffer); webSocketContext = new HttpListenerWebSocketContext( request.Url, request.Headers, request.Cookies, context.User, request.IsAuthenticated, request.IsLocal, request.IsSecureConnection, origin, secWebSocketProtocols.AsReadOnly(), secWebSocketVersion, secWebSocketKey, webSocket); if (Logging.On) { Logging.Associate(Logging.WebSockets, context, webSocketContext); Logging.Associate(Logging.WebSockets, webSocketContext, webSocket); } } catch (Exception ex) { if (Logging.On) { Logging.Exception(Logging.WebSockets, context, "AcceptWebSocketAsync", ex); } throw; } finally { if (Logging.On) { Logging.Exit(Logging.WebSockets, context, "AcceptWebSocketAsync", ""); } } return(webSocketContext); }