public async Task Invoke(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                ITextWebSocketSubprotocol subProtocol = NegotiateSubProtocol(context.WebSockets.WebSocketRequestedProtocols);
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(subProtocol?.SubProtocol);

                WebSocketConnection webSocketConnection = new WebSocketConnection(webSocket, subProtocol ?? _options.DefaultSubProtocol);

                _connectionsService.AddConnection(webSocketConnection);

                byte[] webSocketBuffer = new byte[1024 * 4];
                WebSocketReceiveResult webSocketReceiveResult = await webSocket.ReceiveAsync(new ArraySegment <byte>(webSocketBuffer), CancellationToken.None);

                if (webSocketReceiveResult.MessageType != WebSocketMessageType.Close)
                {
                    throw new NotSupportedException("This demo doesn't support receiving data.");
                }
                await webSocket.CloseAsync(webSocketReceiveResult.CloseStatus.Value, webSocketReceiveResult.CloseStatusDescription, CancellationToken.None);

                _connectionsService.RemoveConnection(webSocketConnection.Id);
            }
            else
            {
                context.Response.StatusCode = 400;
            }
        }
        public async Task Invoke(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                if (ValidateOrigin(context))
                {
                    var textSubProtocol = NegotiateSubProtocol(context.WebSockets.WebSocketRequestedProtocols);
                    var webSocketCompressionProvider = _compressionService.NegotiateCompression(context);
                    var webSocket = await context.WebSockets.AcceptWebSocketAsync(textSubProtocol?.SubProtocol);

                    var webSocketConnection = new WebSocketConnection(webSocket, webSocketCompressionProvider, textSubProtocol ?? _options.DefaultSubProtocol, _options.ReceivePayloadBufferSize);

                    webSocketConnection.ReceiveText += async(sender, message) =>
                    {
                        await webSocketConnection.SendAsync(message, CancellationToken.None);
                    };

                    _connectionsService.AddConnection(webSocketConnection);

                    await webSocketConnection.ReceiveMessagesUntilCloseAsync();

                    if (webSocketConnection.CloseStatus.HasValue)
                    {
                        await webSocket.CloseAsync(webSocketConnection.CloseStatus.Value, webSocketConnection.CloseStatusDescription, CancellationToken.None);
                    }

                    _connectionsService.RemoveConnection(webSocketConnection.Id);
                }
                else
                {
                    context.Response.StatusCode = StatusCodes.Status403Forbidden;
                }
            }
            else
            {
                context.Response.StatusCode = StatusCodes.Status400BadRequest;
            }
        }
Esempio n. 3
0
        public async Task Invoke(HttpContext context)
        {
            if (!context.WebSockets.IsWebSocketRequest)
            {
                await _next.Invoke(context); // can we have a request to the same path and not for a WS connection? Consider using the code on the next line

                //context.Response.StatusCode = StatusCodes.Status400BadRequest;
                return;
            }

            var webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);

            var webSocketConnection = new WebSocketConnection(webSocket);

            _connectionsService.AddConnection(webSocketConnection);

            await webSocketConnection.ReceiveMessagesUntilCloseAsync();

            //await Receive(webSocket, /*async*/ (result, serializedMessage) =>
            //{
            //    if (result.MessageType == WebSocketMessageType.Text)
            //    {
            //        //Message message = JsonConvert.DeserializeObject<Message>(serializedMessage, _jsonSerializerSettings);
            //        //await _webSocketHandler.ReceiveAsync(socket, result, message).ConfigureAwait(false);
            //        return;
            //    }
            //});

            if (webSocketConnection.CloseStatus.HasValue)
            {
                // the close handshake shouldn't be completed on prematurely closed connections
                await webSocket.CloseAsync(webSocketConnection.CloseStatus.Value, webSocketConnection.CloseStatusDescription, CancellationToken.None);
            }

            _connectionsService.RemoveConnection(webSocketConnection.Id);
        }
        public async Task Invoke(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                WebSocketConnection webSocketConnection = new WebSocketConnection(webSocket);

                _connectionsService.AddConnection(webSocketConnection);

                await webSocketConnection.WaitUntilCloseAsync();

                if (webSocketConnection.CloseStatus.HasValue)
                {
                    await webSocket.CloseAsync(webSocketConnection.CloseStatus.Value, webSocketConnection.CloseStatusDescription, CancellationToken.None);
                }

                _connectionsService.RemoveConnection(webSocketConnection.Id);
            }
            else
            {
                context.Response.StatusCode = StatusCodes.Status400BadRequest;
            }
        }
        public async Task Invoke(HttpContext context)
        {
            if (ValidateOrigin(context))
            {
                if (context.WebSockets.IsWebSocketRequest)
                {
                    WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                    if (!context.User.Identity.IsAuthenticated)
                    {
                        // Status Code 1008 PolicyViolation
                        await webSocket.CloseOutputAsync(WebSocketCloseStatus.PolicyViolation,
                                                         "Please login first", CancellationToken.None);

                        return;
                    }

                    WebSocketConnection webSocketConnection = new WebSocketConnection(webSocket, _options.ReceivePayloadBufferSize);

                    async void OnWebSocketConnectionOnNewConnection(object sender, EventArgs message)
                    {
                        await Task.Delay(150);

                        try
                        {
                            var welcomeMessage = new ApiNotificationResponseModel <HeartbeatModel>(new HeartbeatModel(null))
                            {
                                Type = ApiNotificationType.Welcome,
                            };
                            await webSocketConnection.SendAsync(JsonSerializer.Serialize(welcomeMessage,
                                                                                         DefaultJsonSerializer.CamelCase), CancellationToken.None);
                        }
                        catch (WebSocketException)
                        {
                            // if the client is closing the socket the wrong way
                        }
                    }

                    webSocketConnection.NewConnection += OnWebSocketConnectionOnNewConnection;

                    _connectionsService.AddConnection(webSocketConnection);

                    await webSocketConnection.ReceiveMessagesUntilCloseAsync();

                    if (webSocketConnection.CloseStatus.HasValue)
                    {
                        await webSocket.CloseOutputAsync(webSocketConnection.CloseStatus.Value,
                                                         webSocketConnection.CloseStatusDescription, CancellationToken.None);
                    }

                    _connectionsService.RemoveConnection(webSocketConnection.Id);
                }
                else
                {
                    context.Response.StatusCode = StatusCodes.Status400BadRequest;
                }
            }
            else
            {
                context.Response.StatusCode = StatusCodes.Status403Forbidden;
            }
        }