mirror of
https://github.com/cesanta/mongoose.git
synced 2026-11-11 16:40:17 +00:00
Add failing test for HTTP chunk
This test would have caught #1340: handling chunks longer than 15 chars
This commit is contained in:
1 parent
32406b678b
commit
f6f0e49de4
1 file changed
+8
-4
+8
-4
@@ -1207,12 +1207,14 @@ static void test_crc32(void) {
|
|||||||
ASSERT(mg_crc32(mg_crc32(0, "ab", 2), "c", 1) == 891568578);
|
ASSERT(mg_crc32(mg_crc32(0, "ab", 2), "c", 1) == 891568578);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LONG_CHUNK "chunk with length taking up more than two hex digits"
|
||||||
|
|
||||||
// Streaming server event handler.
|
// Streaming server event handler.
|
||||||
// Send one chunk immediately, then drain, then send two chunks in one go
|
// Send one chunk immediately, then drain, then send two chunks in one go
|
||||||
static void eh2(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
static void eh2(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
||||||
if (ev == MG_EV_HTTP_MSG) {
|
if (ev == MG_EV_HTTP_MSG) {
|
||||||
mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n");
|
mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n");
|
||||||
mg_http_printf_chunk(c, "chunk 0");
|
mg_http_printf_chunk(c, LONG_CHUNK);
|
||||||
c->label[0] = 1;
|
c->label[0] = 1;
|
||||||
} else if (ev == MG_EV_POLL) {
|
} else if (ev == MG_EV_POLL) {
|
||||||
if (c->label[0] > 0 && c->send.len == 0) c->label[0]++;
|
if (c->label[0] > 0 && c->send.len == 0) c->label[0]++;
|
||||||
@@ -1287,25 +1289,27 @@ static void test_http_chunked(void) {
|
|||||||
mg_http_connect(&mgr, url, eh3, &done);
|
mg_http_connect(&mgr, url, eh3, &done);
|
||||||
for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
||||||
ASSERT(i < 50);
|
ASSERT(i < 50);
|
||||||
data = "chunk 0chunk 1chunk 2";
|
data = LONG_CHUNK "chunk 1chunk 2";
|
||||||
ASSERT(done == mg_crc32(0, data, strlen(data)));
|
ASSERT(done == mg_crc32(0, data, strlen(data)));
|
||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
mg_http_connect(&mgr, url, eh4, &done);
|
mg_http_connect(&mgr, url, eh4, &done);
|
||||||
for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
||||||
data = "chunk 0chunk 0chunk 1chunk 2chunk 0chunk 1chunk 2";
|
data = LONG_CHUNK LONG_CHUNK "chunk 1chunk 2" LONG_CHUNK "chunk 1chunk 2";
|
||||||
ASSERT(done == mg_crc32(0, data, strlen(data)));
|
ASSERT(done == mg_crc32(0, data, strlen(data)));
|
||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
mg_http_connect(&mgr, url, eh5, &done);
|
mg_http_connect(&mgr, url, eh5, &done);
|
||||||
for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
||||||
data = "chunk 0chunk 1chunk 2";
|
data = LONG_CHUNK "chunk 1chunk 2";
|
||||||
ASSERT(done == mg_crc32(0, data, strlen(data)));
|
ASSERT(done == mg_crc32(0, data, strlen(data)));
|
||||||
|
|
||||||
mg_mgr_free(&mgr);
|
mg_mgr_free(&mgr);
|
||||||
ASSERT(mgr.conns == NULL);
|
ASSERT(mgr.conns == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef LONG_CHUNK
|
||||||
|
|
||||||
static void test_multipart(void) {
|
static void test_multipart(void) {
|
||||||
struct mg_http_part part;
|
struct mg_http_part part;
|
||||||
size_t ofs;
|
size_t ofs;
|
||||||
|
|||||||
Reference in new issue
Block a user