We've been experiencing issues where the qemu websocket server closes connections from noVNC clients for no apparent reason. Debugging shows that certain web browsers are injecting ping and pong frames when the connection becomes idle. Some browsers send those frames without a payload, which also is causing closure. This patch series addresses these issues by making the websocket server more conformant to RFC 6455 - The WebSocket Protocol.
Remembering the opcode is sufficient for handling fragmented frames from the client, which may be introduced by an intermediary server/proxy. Respond to pings and ignore pongs rather than close the connection as many browsers use ping/pong to test an idle connection. Close connections according to the RFC, including providing a reason code and message to aid debugging of unexpected disconnects. Empty payloads should not cause a disconnect. While updating the websocket code, several other bugs were discovered for which patches are also included early in the set. Brandon Carpenter (6): io: Always remove an old channel watch before adding a new one io: Small updates in preparation for websocket changes io: Add support for fragmented websocket binary frames io: Allow empty websocket payload io: Ignore websocket PING and PONG frames io: Reply to ping frames include/io/channel-websock.h | 1 + io/channel-websock.c | 207 ++++++++++++++++++++++--------------------- ui/vnc-auth-vencrypt.c | 3 + ui/vnc-ws.c | 6 ++ ui/vnc.c | 4 + 5 files changed, 122 insertions(+), 99 deletions(-) -- 2.14.1 -- CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is for the sole use of the intended recipient(s) and may contain proprietary, confidential or privileged information or otherwise be protected by law. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please notify the sender and destroy all copies and the original message.