diff --git a/mongoose.c b/mongoose.c index 73c081caa9807dcc720aaf13e7bd50893ff64e76..41792be4ad85a6d85e466128d18ec94f5e258597 100644 --- a/mongoose.c +++ b/mongoose.c @@ -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;