mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-28 12:30:58 +00:00
Test WS frames that are larger than 64k
This commit is contained in:
1 parent
ef6fbad0cb
commit
6615a821f1
6 files changed
+301
-263
No files matched your search
@@ -15,19 +15,18 @@ struct ws_msg {
|
||||
};
|
||||
|
||||
size_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,
|
||||
va_list ap) {
|
||||
char mem[256], *buf = mem;
|
||||
size_t len = mg_vasprintf(&buf, sizeof(mem), fmt, ap);
|
||||
len = mg_ws_send(c, buf, len, op);
|
||||
if (buf != mem) free(buf);
|
||||
return len;
|
||||
va_list *ap) {
|
||||
size_t len = c->send.len;
|
||||
size_t n = mg_vrprintf(mg_pfn_iobuf, &c->send, fmt, ap);
|
||||
mg_ws_wrap(c, c->send.len - len, op);
|
||||
return n;
|
||||
}
|
||||
|
||||
size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...) {
|
||||
size_t len = 0;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
len = mg_ws_vprintf(c, op, fmt, ap);
|
||||
len = mg_ws_vprintf(c, op, fmt, &ap);
|
||||
va_end(ap);
|
||||
return len;
|
||||
}
|
||||
@@ -62,6 +61,11 @@ static void ws_handshake(struct mg_connection *c, const struct mg_str *wskey,
|
||||
mg_send(c, "\r\n", 2);
|
||||
}
|
||||
|
||||
static uint32_t be32(const uint8_t *p) {
|
||||
return (((uint32_t) p[3]) << 0) | (((uint32_t) p[2]) << 8) |
|
||||
(((uint32_t) p[1]) << 16) | (((uint32_t) p[0]) << 24);
|
||||
}
|
||||
|
||||
static size_t ws_process(uint8_t *buf, size_t len, struct ws_msg *msg) {
|
||||
size_t i, n = 0, mask_len = 0;
|
||||
memset(msg, 0, sizeof(*msg));
|
||||
@@ -74,12 +78,11 @@ static size_t ws_process(uint8_t *buf, size_t len, struct ws_msg *msg) {
|
||||
msg->header_len = 2 + mask_len;
|
||||
} else if (n == 126 && len >= 4 + mask_len) {
|
||||
msg->header_len = 4 + mask_len;
|
||||
msg->data_len = mg_ntohs(*(uint16_t *) &buf[2]);
|
||||
msg->data_len = (((size_t) buf[2]) << 8) | buf[3];
|
||||
} else if (len >= 10 + mask_len) {
|
||||
msg->header_len = 10 + mask_len;
|
||||
msg->data_len =
|
||||
(size_t) (((uint64_t) mg_ntohl(*(uint32_t *) &buf[2])) << 32) +
|
||||
mg_ntohl(*(uint32_t *) &buf[6]);
|
||||
(size_t) (((uint64_t) be32(buf + 2) << 32) + be32(buf + 6));
|
||||
}
|
||||
}
|
||||
// Sanity check, and integer overflow protection for the boundary check below
|
||||
@@ -107,9 +110,9 @@ static size_t mkhdr(size_t len, int op, bool is_client, uint8_t *buf) {
|
||||
} else {
|
||||
uint32_t tmp;
|
||||
buf[1] = 127;
|
||||
tmp = mg_htonl((uint32_t) ((uint64_t) len >> 32));
|
||||
tmp = mg_htonl((uint32_t) (len >> 32));
|
||||
memcpy(&buf[2], &tmp, sizeof(tmp));
|
||||
tmp = mg_htonl((uint32_t) (len & 0xffffffff));
|
||||
tmp = mg_htonl((uint32_t) (len & 0xffffffffU));
|
||||
memcpy(&buf[6], &tmp, sizeof(tmp));
|
||||
n = 10;
|
||||
}
|
||||
|
||||
@@ -22,4 +22,5 @@ void mg_ws_upgrade(struct mg_connection *, struct mg_http_message *,
|
||||
size_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op);
|
||||
size_t mg_ws_wrap(struct mg_connection *, size_t len, int op);
|
||||
size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...);
|
||||
size_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt, va_list);
|
||||
size_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,
|
||||
va_list *);
|
||||
Reference in new issue
Block a user