protected void HandleBuzzer(WebSocketRequestMessageJson msg)
        {
            var res = new WebSocketResponseMessageJson(WebSocketMessageKind.BuzzerResponse);

            res.Ref = msg.ID;
            try
            {
                res.Data = _dispatcher.Dispatch(_context, msg.Service, msg.Method, msg.Data);
            } catch (Exception ex)
            {
                res.Kind = WebSocketMessageKind.BuzzerFailure;
                res.Data = ex.Message;
            }

            _ws.Send(_marshaller.Marshal(res));
        }
        protected void HandleRPCSuccess(WebSocketResponseMessageJson msg)
        {
            if (!_requests.ContainsKey(msg.Ref))
            {
                if (msg.Ref == _headersUpdateID)
                {
                    if (msg.Kind == WebSocketMessageKind.RpcFailure)
                    {
                        _logger.Logf(LogLevel.Error, "Headers update failed {0}", msg.Data);
                    }
                    else
                    {
                        _logger.Logf(LogLevel.Debug, "Headers updated succesfully.");
                    }
                    _headersUpdated = true;
                    return;
                }

                _logger.Logf(LogLevel.Warning, "Can't handle RPC response, request with ID {0} was not found in the list of requests.", msg.Ref);
                return;
            }

            var req = _requests[msg.Ref];

            _requests.Remove(msg.Ref);
            if (req.Timer != null)
            {
                req.Timer.Stop();
                req.Timer = null;
            }

            if (msg.Kind == WebSocketMessageKind.RpcFailure)
            {
                req.Failure.Invoke(new Exception(msg.Data));
                return;
            }

            req.Success.Invoke(msg);
        }
Example #3
0
            protected override void OnMessage(MessageEventArgs e)
            {
                if (e.IsPing)
                {
                    _logger.Logf(LogLevel.Trace, "WebSocketServer: Ping received.");
                    return;
                }

                if (e.IsBinary)
                {
                    _logger.Logf(LogLevel.Error, "WebSocketServer: Binary format messages are not supported.");
                    return;
                }

                _logger.Logf(LogLevel.Trace, "WebSocketServer: Incoming message: {0}", e.Data);

                WebSocketMessageBase messageBase;

                try {
                    messageBase = _marshaller.Unmarshal <WebSocketMessageBase>(e.Data);
                } catch (Exception ex)
                {
                    _logger.Logf(LogLevel.Error, "Failure during processing of base message. {0}", ex.Message);
                    sendFailure(ex.Message, e.Data);
                    return;
                }

                switch (messageBase.Kind)
                {
                case WebSocketMessageKind.RpcRequest:
                {
                    var res = new WebSocketResponseMessageJson(WebSocketMessageKind.RpcResponse);
                    WebSocketRequestMessageJson req;
                    try {
                        req = _marshaller.Unmarshal <WebSocketRequestMessageJson>(e.Data);
                    } catch (Exception ex)
                    {
                        _logger.Logf(LogLevel.Error, "Failure during processing of RPC request message. {0}", ex.Message);
                        sendFailure(ex.Message, e.Data);
                        return;
                    }

                    res.Ref = req.ID;

                    if (req.Headers != null && req.Headers.ContainsKey("Authorization"))
                    {
                        _context.System.UpdateAuth(req.Headers["Authorization"]);
                        if (_handlers != null)
                        {
                            if (!_handlers.OnAuthorize(_context))
                            {
                                Context.WebSocket.Close();
                                return;
                            }
                        }
                        if (string.IsNullOrEmpty(req.Service))
                        {
                            Send(_marshaller.Marshal(res));
                            return;
                        }
                    }

                    try {
                        var data = _dispatcher.Dispatch(_context, req.Service, req.Method, req.Data);
                        res.Data = data;
                    }
                    catch (Exception ex)
                    {
                        res.Kind = WebSocketMessageKind.RpcFailure;
                        res.Data = ex.Message;
                    }

                    Send(_marshaller.Marshal(res));
                } break;

                default: {
                    sendFailure("Unsupported request.", e.Data);
                } break;
                }
            }