diff --git a/mongoose.c b/mongoose.c index a5ad3e7ff48e86bf70e5a169d1d35e168d5fa225..9cb7816c6cb4cd6657f22dcaac738f157764ef1c 100644 --- a/mongoose.c +++ b/mongoose.c @@ -6725,7 +6725,6 @@ static void mg_http_multipart_continue(struct mg_connection *c) { break; } case MPS_FINISHED: { - mbuf_remove(&c->recv_mbuf, c->recv_mbuf.len); return; } } diff --git a/src/mg_http.c b/src/mg_http.c index 8c9fd5f17a1369ccae35ecbca714fcae3bb0affc..9f4568564865ab79149d2139f65196867a925523 100644 --- a/src/mg_http.c +++ b/src/mg_http.c @@ -1159,7 +1159,6 @@ static void mg_http_multipart_continue(struct mg_connection *c) { break; } case MPS_FINISHED: { - mbuf_remove(&c->recv_mbuf, c->recv_mbuf.len); return; } } diff --git a/test/unit_test.c b/test/unit_test.c index 763b683bde3831f1a2a2464d571d6db0ee5d53cf..2cf5aa1ea79b2deca77c313a333bc11436a0ac46 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -4321,6 +4321,95 @@ static const char *test_http_multipart2(void) { return NULL; } +static const char *test_http_multipart_pipeline(void) { + struct mg_mgr mgr; + struct mg_connection *nc_listen; + + const char multi_part_req_fmt[] = + "%s" + "Content-Disposition: form-data; name=\"a\"; filename=\"foo\"\r\n" + "\r\n" + "%s" + "\r\n--Asrf456BGe4h\r\n" + "Content-Disposition: form-data; name=\"b\"\r\n" + "\r\n" + "%s" + "\r\n--Asrf456BGe4h\r\n" + "Content-Disposition: form-data; name=\"c\"; filename=\"bar\"\r\n" + "\r\n" + "%s" + "\r\n--Asrf456BGe4h--\r\n" + "\r\n"; + + char multi_part_req[1024 * 5]; + struct mg_connection *c; + const char *ptr; + int i; + + struct cb_mp_srv_data mpd; + memset(&mpd, 0, sizeof(mpd)); + mbuf_init(&mpd.res, 0); + + mg_mgr_init(&mgr, NULL); + nc_listen = mg_bind(&mgr, "8765", cb_mp_srv); + nc_listen->user_data = &mpd; + + mg_set_protocol_http_websocket(nc_listen); + + snprintf(multi_part_req, sizeof(multi_part_req), multi_part_req_fmt, + "\r\n--Asrf456BGe4h\r\n", b1, b2, b4); + + ASSERT((c = mg_connect_http(&mgr, cb_mp_empty, "http://127.0.0.1:8765/test", + "Content-Type: " + "multipart/form-data;boundary=Asrf456BGe4h\r\n" + "Connection: keep-alive", + multi_part_req)) != NULL); + + c->user_data = multi_part_req; + + mg_printf(c, + "POST /test HTTP/1.1\r\n" + "Connection: keep-alive\r\n" + "Content-Type: multipart/form-data;boundary=Asrf456BGe4h\r\n" + "Content-Length: %d\r\n%s", + (int) strlen(multi_part_req), multi_part_req); + + poll_until(&mgr, 10, c_int_eq, &mpd.request_end, (void *) 1); + + ptr = mpd.res.buf; + for (i = 0; i < 2; i++) { + ASSERT_STREQ_NZ(ptr, "<MPRQ/test"); + ptr += 10; + ASSERT_STREQ_NZ(ptr, "afoo"); + ptr += 4; + ASSERT_STREQ_NZ(ptr, b1); + ptr += sizeof(b1) - 1; + ASSERT_STREQ_NZ(ptr, "afooFIN"); + ptr += 7; + /* No file_name for second part */ + ASSERT_STREQ_NZ(ptr, "b"); + ptr++; + ASSERT_STREQ_NZ(ptr, b2); + ptr += sizeof(b2) - 1; + ASSERT_STREQ_NZ(ptr, "bFIN"); + ptr += 4; + ASSERT_STREQ_NZ(ptr, "cbar"); + ptr += 4; + ASSERT_STREQ_NZ(ptr, b4); + ptr += sizeof(b4) - 1; + ASSERT_STREQ_NZ(ptr, "cbarFIN"); + ptr += 7; + ASSERT_STREQ_NZ(ptr, "+11MPRQ>"); + ptr += 8; + } + ASSERT_EQ((size_t)(ptr - mpd.res.buf), mpd.res.len); + + mbuf_free(&mpd.res); + mg_mgr_free(&mgr); + + return NULL; +} + static struct mg_str upload_lfn_same(struct mg_connection *nc, struct mg_str fn) { if (fn.len == 0) { @@ -5632,6 +5721,7 @@ const char *tests_run(const char *filter) { RUN_TEST(test_http_multipart); #if MG_ENABLE_HTTP_STREAMING_MULTIPART RUN_TEST(test_http_multipart2); + RUN_TEST(test_http_multipart_pipeline); RUN_TEST(test_http_multipart_upload); #endif RUN_TEST(test_parse_date_string);