You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@guacamole.apache.org by "AJ Funk (Jira)" <ji...@apache.org> on 2020/04/07 05:55:00 UTC

[jira] [Created] (GUACAMOLE-1015) tunnel and websocket states out of sync

AJ Funk created GUACAMOLE-1015:
----------------------------------

             Summary: tunnel and websocket states out of sync
                 Key: GUACAMOLE-1015
                 URL: https://issues.apache.org/jira/browse/GUACAMOLE-1015
             Project: Guacamole
          Issue Type: Bug
          Components: guacamole-common-js
    Affects Versions: 1.1.0
            Reporter: AJ Funk


When using the WebSocketTunnel, we are constantly seeing the error: "InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state." being thrown.

The identify the issue, we added some extra logging information by overriding the sendMessage method and wrapping it with a try/catch like this:
{code:java}
const websocketTunnel = this.websocket = new Guacamole.WebSocketTunnel(          `wss://${domain}/guacamole/${guacWsPort}`);

const guac = this.rfb = new Guacamole.Client(this.websocket);
// wrap sendMessage with a try/catch for debugging

const originalTunnelSendMessage = websocketTunnel.sendMessage;        this.websocket.sendMessage = (...args) => {
  try {
    originalTunnelSendMessage.apply(this.websocket, args);
  } catch (e) {
    if (window.Sentry) {
      const clientState = guac.getState();
      const tunnelState = websocketTunnel.state;
      const socketState = websocketTunnel.socket.readyState;
      window.Sentry.withScope(scope => {
        scope.setTag("origin", "guac socket");
        scope.setExtra("args", args);
        scope.setExtra("clientState", clientState);
        scope.setExtra("tunnelState", tunnelState);
        scope.setExtra("socketReadyState", socketState);
        window.Sentry.captureException(e);
      });
    }
  }
}
{code}
(we use [https://sentry.io|https://sentry.io/] to capture exceptions)

This provided the following values:
clientState: 2 (STATE_WAITING)
tunnelState: 3 (UNSTABLE)
socketReadyState: 0 (CONNECTING)
We managed to apply a patch to silence this error. On this line [https://guacamole.apache.org/doc/1.1.0/guacamole-common-js/Tunnel.js.html#line379]

we changed
{code:java}
if (!tunnel.isConnected()){code}
to check the socket's state instead of the tunnel's:
{code:java}
if (!socket || socket.readyState !== WebSocket.OPEN ){code}
 

We determined that this error was non-critical since it did not disrupt the client's websocket connection, but it caused a lot of noise with thousands of error events.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)