Test WS frames that are larger than 64k

This commit is contained in:
cpq committed 2022-08-13 11:16:13 +01:00
1 parent ef6fbad0cb
commit 6615a821f1
6 files changed
+301 -263

No files matched your search

+15 -12
View File
@@ -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;
}
+2 -1
View File
@@ -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 *);