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 (7):
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
io: Attempt to send websocket close messages to client
include/io/channel-websock.h | 2 +
io/channel-websock.c | 282
+++++++++++++++++++++++++++----------------
ui/vnc-auth-vencrypt.c | 3 +
ui/vnc-ws.c | 6 +
ui/vnc.c | 4 +
5 files changed, 194 insertions(+), 103 deletions(-)
--
2.14.1