wsockd: write short frames and long frames using their preferred wire formats

This commit is contained in:
William Pitcock 2016-04-02 20:32:10 -05:00
parent e2a8228f85
commit 7428c4e07e

View file

@ -360,20 +360,42 @@ conn_mod_write(conn_t * conn, void *data, size_t len)
} }
static void static void
conn_mod_write_frame(conn_t * conn, void *data, size_t len) conn_mod_write_short_frame(conn_t * conn, void *data, int len)
{ {
ws_frame_ext_t hdr; ws_frame_hdr_t hdr;
if(IsDead(conn)) /* no point in queueing to a dead man */ ws_frame_set_opcode(&hdr, WEBSOCKET_OPCODE_BINARY_FRAME);
return; hdr.payload_length_mask = (len + 2) & 0x7f;
ws_frame_set_opcode(&hdr.header, WEBSOCKET_OPCODE_BINARY_FRAME);
hdr.header.payload_length_mask = 127;
hdr.payload_length_extended = htons(len + 7);
conn_mod_write(conn, &hdr, sizeof(hdr)); conn_mod_write(conn, &hdr, sizeof(hdr));
conn_mod_write(conn, data, len); conn_mod_write(conn, data, len);
conn_mod_write(conn, "\r\n\0", 3); conn_mod_write(conn, "\r\n", 2);
}
static void
conn_mod_write_long_frame(conn_t * conn, void *data, int len)
{
ws_frame_ext_t hdr;
ws_frame_set_opcode(&hdr.header, WEBSOCKET_OPCODE_BINARY_FRAME);
hdr.header.payload_length_mask = 126;
hdr.payload_length_extended = htons(len + 2);
conn_mod_write(conn, &hdr, sizeof(hdr));
conn_mod_write(conn, data, len);
conn_mod_write(conn, "\r\n", 2);
}
static void
conn_mod_write_frame(conn_t *conn, void *data, int len)
{
if(IsDead(conn)) /* no point in queueing to a dead man */
return;
if (len < 123)
return conn_mod_write_short_frame(conn, data, len);
return conn_mod_write_long_frame(conn, data, len);
} }
static void static void
@ -686,7 +708,7 @@ conn_plain_read_cb(rb_fde_t *fd, void *data)
} }
conn->plain_in += length; conn->plain_in += length;
(void) rb_linebuf_parse(&conn->plainbuf_in, inbuf, sizeof(inbuf), 0); (void) rb_linebuf_parse(&conn->plainbuf_in, inbuf, length, 0);
if(IsDead(conn)) if(IsDead(conn))
return; return;