|
@@ -3987,14 +3987,27 @@ static void send_websocket_handshake(struct mg_connection *conn) {
|
|
|
}
|
|
|
|
|
|
static void read_websocket(struct mg_connection *conn) {
|
|
|
+ // Pointer to the beginning of the portion of the incoming websocket message
|
|
|
+ // queue. The original websocket upgrade request is never removed,
|
|
|
+ // so the queue begins after it.
|
|
|
unsigned char *buf = (unsigned char *) conn->buf + conn->request_len;
|
|
|
int bits, n, stop = 0;
|
|
|
size_t i, len, mask_len, data_len, header_len, body_len;
|
|
|
+ // data points to the place where the message is stored when passed to the
|
|
|
+ // websocket_data callback. This is either mem on the stack,
|
|
|
+ // or a dynamically allocated buffer if it is too large.
|
|
|
char mem[4 * 1024], mask[4], *data;
|
|
|
|
|
|
assert(conn->content_len == 0);
|
|
|
+
|
|
|
+ // Loop continuously, reading messages from the socket, invoking the callback,
|
|
|
+ // and waiting repeatedly until an error occurs.
|
|
|
while (!stop) {
|
|
|
header_len = 0;
|
|
|
+ // body_len is the length of the entire queue in bytes
|
|
|
+ // len is the length of the current message
|
|
|
+ // data_len is the length of the current message's data payload
|
|
|
+ // header_len is the length of the current message's header
|
|
|
if ((body_len = conn->data_len - conn->request_len) >= 2) {
|
|
|
len = buf[1] & 127;
|
|
|
mask_len = buf[1] & 128 ? 4 : 0;
|