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); }
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; } }