static void on_socket_close (WebSocketConnection *socket, gpointer user_data) { CockpitChannelSocket *self = COCKPIT_CHANNEL_SOCKET (user_data); CockpitChannel *channel = COCKPIT_CHANNEL (user_data); const gchar *problem = NULL; gushort code; if (self->closed) return; code = web_socket_connection_get_close_code (socket); if (code == WEB_SOCKET_CLOSE_NORMAL) { cockpit_channel_control (channel, "done", NULL); } else { problem = web_socket_connection_get_close_data (socket); if (problem == NULL) problem = "disconnected"; } cockpit_channel_close (channel, problem); }
static void on_socket_close (WebSocketConnection *connection, CockpitChannelSocket *chock) { const gchar *problem = NULL; GBytes *payload; gushort code; code = web_socket_connection_get_close_code (chock->socket); if (code == WEB_SOCKET_CLOSE_NORMAL) { payload = cockpit_transport_build_control ("command", "done", "channel", chock->channel, NULL); cockpit_transport_send (chock->transport, NULL, payload); g_bytes_unref (payload); } else { problem = web_socket_connection_get_close_data (chock->socket); if (problem == NULL) problem = "disconnected"; } payload = cockpit_transport_build_control ("command", "close", "channel", chock->channel, "problem", problem, NULL); cockpit_transport_send (chock->transport, NULL, payload); g_bytes_unref (payload); cockpit_channel_socket_close (chock, problem); }
static void on_web_socket_close (WebSocketConnection *connection, gpointer user_data) { CockpitWebSocketStream *self = COCKPIT_WEB_SOCKET_STREAM (user_data); CockpitChannel *channel = COCKPIT_CHANNEL (user_data); const gchar *problem; gushort code; code = web_socket_connection_get_close_code (connection); problem = web_socket_connection_get_close_data (connection); if (code == WEB_SOCKET_CLOSE_NORMAL || code == WEB_SOCKET_CLOSE_GOING_AWAY) { problem = NULL; } else if (problem == NULL || !problem[0]) { /* If we don't have a code but have a last error * use it's code */ if (code == 0) code = self->last_error_code; switch (code) { case WEB_SOCKET_CLOSE_NO_STATUS: case WEB_SOCKET_CLOSE_ABNORMAL: problem = "disconnected"; break; case WEB_SOCKET_CLOSE_PROTOCOL: case WEB_SOCKET_CLOSE_UNSUPPORTED_DATA: case WEB_SOCKET_CLOSE_BAD_DATA: case WEB_SOCKET_CLOSE_POLICY_VIOLATION: case WEB_SOCKET_CLOSE_TOO_BIG: case WEB_SOCKET_CLOSE_TLS_HANDSHAKE: problem = "protocol-error"; break; case WEB_SOCKET_CLOSE_NO_EXTENSION: problem = "unsupported"; break; default: problem = "internal-error"; break; } } cockpit_channel_close (channel, problem); }