From 363b23d6e337817aaf75e8b3cd884f9383467d94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Sun, 21 Dec 2014 15:47:24 +0100 Subject: [PATCH] Better handling of errors while sending to (disconnected) clients on the websocket --- CHANGELOG.md | 2 ++ docs/events/index.rst | 4 ++++ src/octoprint/server/util/sockjs.py | 17 +++++++++++------ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06d6b1d1..ef1fb97f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,8 @@ it has been changed during runtime by external editing, hence no config settings added manually while the server was running should be overwritten anymore. * Automatically hard-reload the UI if upon reconnecting to the server a new version is detected. +* Better handling of errors on the websocket - no more logging of the full stack trace to the log, only a warning + message for now. ### Bug Fixes diff --git a/docs/events/index.rst b/docs/events/index.rst index a86f83a5..55200cab 100644 --- a/docs/events/index.rst +++ b/docs/events/index.rst @@ -96,6 +96,10 @@ ClientOpened ClientClosed A client has disconnected from the webserver + Payload: + + * ``remoteAddress``: the remote address (IP) of the client that disconnected + Printer communication --------------------- diff --git a/src/octoprint/server/util/sockjs.py b/src/octoprint/server/util/sockjs.py index bf9ee3cb..3d321b39 100644 --- a/src/octoprint/server/util/sockjs.py +++ b/src/octoprint/server/util/sockjs.py @@ -34,6 +34,8 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection): self._eventManager = eventManager self._pluginManager = pluginManager + self._remoteAddress = None + def _getRemoteAddress(self, info): forwardedFor = info.headers.get("X-Forwarded-For") if forwardedFor is not None: @@ -41,8 +43,8 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection): return info.ip def on_open(self, info): - remoteAddress = self._getRemoteAddress(info) - self._logger.info("New connection from client: %s" % remoteAddress) + self._remoteAddress = self._getRemoteAddress(info) + self._logger.info("New connection from client: %s" % self._remoteAddress) # connected => update the API key, might be necessary if the client was left open while the server restarted self._emit("connected", {"apikey": octoprint.server.UI_API_KEY, "version": octoprint.server.VERSION, "display_version": octoprint.server.DISPLAY_VERSION}) @@ -52,20 +54,20 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection): octoprint.timelapse.registerCallback(self) self._pluginManager.register_client(self) - self._eventManager.fire(Events.CLIENT_OPENED, {"remoteAddress": remoteAddress}) + self._eventManager.fire(Events.CLIENT_OPENED, {"remoteAddress": self._remoteAddress}) for event in octoprint.events.all_events(): self._eventManager.subscribe(event, self._onEvent) octoprint.timelapse.notifyCallbacks(octoprint.timelapse.current) def on_close(self): - self._logger.info("Client connection closed") + self._logger.info("Client connection closed: %s" % self._remoteAddress) self._printer.unregisterCallback(self) self._fileManager.unregister_slicingprogress_callback(self) octoprint.timelapse.unregisterCallback(self) self._pluginManager.unregister_client(self) - self._eventManager.fire(Events.CLIENT_CLOSED) + self._eventManager.fire(Events.CLIENT_CLOSED, {"remoteAddress": self._remoteAddress}) for event in octoprint.events.all_events(): self._eventManager.unsubscribe(event, self._onEvent) @@ -137,4 +139,7 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection): self.sendEvent(event, payload) def _emit(self, type, payload): - self.send({type: payload}) + try: + self.send({type: payload}) + except Exception as e: + self._logger.warn("Could not send message to client %s: %s" % (self._remoteAddress, e.message))