|
@@ -2609,6 +2609,36 @@ FormGet(struct mg_connection *conn, void *cbdata)
|
|
|
|
|
|
|
|
|
static int
|
|
|
+FormError(struct mg_connection *conn, void *cbdata)
|
|
|
+{
|
|
|
+ const struct mg_request_info *req_info = mg_get_request_info(conn);
|
|
|
+ int ret;
|
|
|
+ struct mg_form_data_handler fdh = {NULL, NULL, NULL, NULL};
|
|
|
+
|
|
|
+ (void)cbdata;
|
|
|
+
|
|
|
+ ck_assert(req_info != NULL);
|
|
|
+
|
|
|
+ mg_printf(conn, "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\n");
|
|
|
+ fdh.user_data = (void *)&g_field_found_return;
|
|
|
+
|
|
|
+ /* Call the form handler */
|
|
|
+ g_field_step = 0;
|
|
|
+ g_field_found_return = MG_FORM_FIELD_STORAGE_GET;
|
|
|
+ ret = mg_handle_form_request(conn, &fdh);
|
|
|
+ g_field_found_return = -888;
|
|
|
+ ck_assert_int_eq(ret, -1);
|
|
|
+ ck_assert_int_eq(g_field_step, 0);
|
|
|
+ mg_printf(conn, "%i\r\n", ret);
|
|
|
+ g_field_step = 1000;
|
|
|
+
|
|
|
+ mark_point();
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int
|
|
|
FormStore(struct mg_connection *conn,
|
|
|
void *cbdata,
|
|
|
int ret_expected,
|
|
@@ -2727,6 +2757,7 @@ START_TEST(test_handle_form)
|
|
|
ck_assert_str_eq(opt, "8884");
|
|
|
|
|
|
mg_set_request_handler(ctx, "/handle_form", FormGet, NULL);
|
|
|
+ mg_set_request_handler(ctx, "/handle_form_error", FormError, NULL);
|
|
|
mg_set_request_handler(ctx, "/handle_form_store", FormStore1, NULL);
|
|
|
mg_set_request_handler(ctx, "/handle_form_store2", FormStore2, NULL);
|
|
|
|
|
@@ -2797,6 +2828,23 @@ START_TEST(test_handle_form)
|
|
|
ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
mg_close_connection(client_conn);
|
|
|
|
|
|
+ /*
|
|
|
+ * https://datatracker.ietf.org/doc/html/rfc2046#section-5.1
|
|
|
+ *
|
|
|
+ * multipart-body := [preamble CRLF]
|
|
|
+ * dash-boundary transport-padding CRLF
|
|
|
+ * body-part *encapsulation
|
|
|
+ * close-delimiter transport-padding
|
|
|
+ * [CRLF epilogue]
|
|
|
+ *
|
|
|
+ * preamble := discard-text
|
|
|
+ * epilogue := discard-text
|
|
|
+ *
|
|
|
+ * discard-text := *(*text CRLF) *text
|
|
|
+ *
|
|
|
+ * text := <any CHAR, including bare CR & bare LF, but NOT including CRLF>
|
|
|
+ */
|
|
|
+
|
|
|
/* Handle form: "POST multipart/form-data" */
|
|
|
multipart_body =
|
|
|
"--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
@@ -2924,6 +2972,7 @@ START_TEST(test_handle_form)
|
|
|
|
|
|
|
|
|
/* Handle form: "POST multipart/form-data" with chunked transfer encoding */
|
|
|
+ /* use the most universal possible (no edge cases) body*/
|
|
|
client_conn =
|
|
|
mg_download("localhost",
|
|
|
8884,
|
|
@@ -3016,6 +3065,787 @@ START_TEST(test_handle_form)
|
|
|
ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
mg_close_connection(client_conn);
|
|
|
|
|
|
+ /* Handle form: "POST multipart/form-data" without trailing CRLF*/
|
|
|
+ multipart_body =
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"textin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "text\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"passwordin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"radio1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=radio2\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"check1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"numberin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1.1.2016\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"colorin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "#80ff00\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"rangein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "3\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"monthin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"weekin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"timein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimen\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimelocalin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"emailin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"searchin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"telin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"urlin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"filein\"; filename=\"\"\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=filesin; filename=\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"selectin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "opt1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"message\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "Text area default text.\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388--";
|
|
|
+ body_len = strlen(multipart_body);
|
|
|
+ ck_assert_uint_eq(body_len, 2366); /* not required */
|
|
|
+
|
|
|
+ client_conn =
|
|
|
+ mg_download("localhost",
|
|
|
+ 8884,
|
|
|
+ 0,
|
|
|
+ ebuf,
|
|
|
+ sizeof(ebuf),
|
|
|
+ "POST /handle_form HTTP/1.1\r\n"
|
|
|
+ "Host: localhost:8884\r\n"
|
|
|
+ "Connection: close\r\n"
|
|
|
+ "Content-Type: multipart/form-data; "
|
|
|
+ "boundary=multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Length: %u\r\n"
|
|
|
+ "\r\n%s",
|
|
|
+ (unsigned int)body_len,
|
|
|
+ multipart_body);
|
|
|
+
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ for (sleep_cnt = 0; sleep_cnt < 30; sleep_cnt++) {
|
|
|
+ test_sleep(1);
|
|
|
+ if (g_field_step == 1000) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client_ri = mg_get_response_info(client_conn);
|
|
|
+
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+ ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ /* Handle form: "POST multipart/form-data" with epilogue*/
|
|
|
+ multipart_body =
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"textin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "text\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"passwordin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"radio1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=radio2\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"check1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"numberin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1.1.2016\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"colorin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "#80ff00\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"rangein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "3\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"monthin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"weekin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"timein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimen\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimelocalin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"emailin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"searchin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"telin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"urlin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"filein\"; filename=\"\"\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=filesin; filename=\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"selectin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "opt1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"message\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "Text area default text.\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388--\r\n"
|
|
|
+ "epilogue\r\n"
|
|
|
+ "epilogue\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1234567890-=!@£$%^&*()_+[]{};'\\:\"|,./<>?`~§\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "epilogue\r\n";
|
|
|
+ body_len = strlen(multipart_body);
|
|
|
+ ck_assert_uint_eq(body_len, 2453); /* not required */
|
|
|
+
|
|
|
+ client_conn =
|
|
|
+ mg_download("localhost",
|
|
|
+ 8884,
|
|
|
+ 0,
|
|
|
+ ebuf,
|
|
|
+ sizeof(ebuf),
|
|
|
+ "POST /handle_form HTTP/1.1\r\n"
|
|
|
+ "Host: localhost:8884\r\n"
|
|
|
+ "Connection: close\r\n"
|
|
|
+ "Content-Type: multipart/form-data; "
|
|
|
+ "boundary=multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Length: %u\r\n"
|
|
|
+ "\r\n%s",
|
|
|
+ (unsigned int)body_len,
|
|
|
+ multipart_body);
|
|
|
+
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ for (sleep_cnt = 0; sleep_cnt < 30; sleep_cnt++) {
|
|
|
+ test_sleep(1);
|
|
|
+ if (g_field_step == 1000) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client_ri = mg_get_response_info(client_conn);
|
|
|
+
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+ ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ /* Handle form: "POST multipart/form-data" with preamble*/
|
|
|
+ /*
|
|
|
+ * https://datatracker.ietf.org/doc/html/rfc2046#section-5.1
|
|
|
+ *
|
|
|
+ * multipart-body := [preamble CRLF]
|
|
|
+ * dash-boundary transport-padding CRLF
|
|
|
+ * body-part *encapsulation
|
|
|
+ * close-delimiter transport-padding
|
|
|
+ * [CRLF epilogue]
|
|
|
+ *
|
|
|
+ * preamble := discard-text
|
|
|
+ *
|
|
|
+ * discard-text := *(*text CRLF) *text
|
|
|
+ *
|
|
|
+ * text := <any CHAR, including bare CR & bare LF, but NOT including CRLF>
|
|
|
+ */
|
|
|
+ multipart_body =
|
|
|
+ "\r\n"
|
|
|
+ "\r\npreamble"
|
|
|
+ "\r\npreamble"
|
|
|
+ "\r\npreamble"
|
|
|
+ "\r\n"
|
|
|
+ "\r\npreamble"
|
|
|
+ "\r\n"
|
|
|
+ "1234567890-=!@£$%^&*()_+[]{};'\\:\"|,./<>?`~§\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n\t\t\t \t\t\t"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"textin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "text\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"passwordin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"radio1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=radio2\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"check1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"numberin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1.1.2016\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"colorin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "#80ff00\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"rangein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "3\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"monthin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"weekin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"timein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimen\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimelocalin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"emailin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"searchin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"telin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"urlin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"filein\"; filename=\"\"\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=filesin; filename=\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"selectin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "opt1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"message\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "Text area default text.\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388--\r\n";
|
|
|
+ body_len = strlen(multipart_body);
|
|
|
+ ck_assert_uint_eq(body_len, 2478); /* not required */
|
|
|
+
|
|
|
+ client_conn =
|
|
|
+ mg_download("localhost",
|
|
|
+ 8884,
|
|
|
+ 0,
|
|
|
+ ebuf,
|
|
|
+ sizeof(ebuf),
|
|
|
+ "POST /handle_form HTTP/1.1\r\n"
|
|
|
+ "Host: localhost:8884\r\n"
|
|
|
+ "Connection: close\r\n"
|
|
|
+ "Content-Type: multipart/form-data; "
|
|
|
+ "boundary=multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Length: %u\r\n"
|
|
|
+ "\r\n%s",
|
|
|
+ (unsigned int)body_len,
|
|
|
+ multipart_body);
|
|
|
+
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ for (sleep_cnt = 0; sleep_cnt < 30; sleep_cnt++) {
|
|
|
+ test_sleep(1);
|
|
|
+ if (g_field_step == 1000) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client_ri = mg_get_response_info(client_conn);
|
|
|
+
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+ ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ /* Handle form: "POST multipart/form-data" with transport padding*/
|
|
|
+ multipart_body =
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388 \r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"textin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "text\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\t\t\t\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"passwordin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"radio1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=radio2\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"check1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"numberin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1.1.2016\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"colorin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "#80ff00\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"rangein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "3\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"monthin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"weekin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"timein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimen\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimelocalin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"emailin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"searchin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"telin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"urlin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"filein\"; filename=\"\"\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=filesin; filename=\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"selectin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "opt1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"message\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "Text area default text.\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388--\r\n";
|
|
|
+ body_len = strlen(multipart_body);
|
|
|
+ ck_assert_uint_eq(body_len, 2382); /* not required */
|
|
|
+
|
|
|
+ client_conn =
|
|
|
+ mg_download("localhost",
|
|
|
+ 8884,
|
|
|
+ 0,
|
|
|
+ ebuf,
|
|
|
+ sizeof(ebuf),
|
|
|
+ "POST /handle_form HTTP/1.1\r\n"
|
|
|
+ "Host: localhost:8884\r\n"
|
|
|
+ "Connection: close\r\n"
|
|
|
+ "Content-Type: multipart/form-data; "
|
|
|
+ "boundary=multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Length: %u\r\n"
|
|
|
+ "\r\n%s",
|
|
|
+ (unsigned int)body_len,
|
|
|
+ multipart_body);
|
|
|
+
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ for (sleep_cnt = 0; sleep_cnt < 30; sleep_cnt++) {
|
|
|
+ test_sleep(1);
|
|
|
+ if (g_field_step == 1000) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client_ri = mg_get_response_info(client_conn);
|
|
|
+
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+ ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ /* Handle form: "POST multipart/form-data" with custom name fields in the
|
|
|
+ * Content-Disposition */
|
|
|
+ multipart_body =
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; "
|
|
|
+ "custom1name=\"1\"; "
|
|
|
+ "custom2name=\"2\"; "
|
|
|
+ "custom3name=\"3\"; "
|
|
|
+ "custom4name=\"4\"; "
|
|
|
+ "name=\"textin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "text\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\t\t\t\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"passwordin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"radio1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=radio2\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"check1\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "val1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"numberin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "1.1.2016\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"colorin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "#80ff00\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"rangein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "3\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"monthin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"weekin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"timein\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimen\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"datetimelocalin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"emailin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"searchin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"telin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"urlin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"filein\"; filename=\"\"\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=filesin; filename=\r\n"
|
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"selectin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "opt1\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Disposition: form-data; name=\"message\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "Text area default text.\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388--\r\n";
|
|
|
+ body_len = strlen(multipart_body);
|
|
|
+ ck_assert_uint_eq(body_len, 2439); /* not required */
|
|
|
+
|
|
|
+ client_conn =
|
|
|
+ mg_download("localhost",
|
|
|
+ 8884,
|
|
|
+ 0,
|
|
|
+ ebuf,
|
|
|
+ sizeof(ebuf),
|
|
|
+ "POST /handle_form HTTP/1.1\r\n"
|
|
|
+ "Host: localhost:8884\r\n"
|
|
|
+ "Connection: close\r\n"
|
|
|
+ "Content-Type: multipart/form-data; "
|
|
|
+ "boundary=multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Length: %u\r\n"
|
|
|
+ "\r\n%s",
|
|
|
+ (unsigned int)body_len,
|
|
|
+ multipart_body);
|
|
|
+
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ for (sleep_cnt = 0; sleep_cnt < 30; sleep_cnt++) {
|
|
|
+ test_sleep(1);
|
|
|
+ if (g_field_step == 1000) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client_ri = mg_get_response_info(client_conn);
|
|
|
+
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+ ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ /* Handle form error cases */
|
|
|
+ /* Handle form: "POST multipart/form-data" empty body */
|
|
|
+ multipart_body = "";
|
|
|
+ body_len = strlen(multipart_body);
|
|
|
+ ck_assert_uint_eq(body_len, 0); /* not required */
|
|
|
+
|
|
|
+ client_conn =
|
|
|
+ mg_download("localhost",
|
|
|
+ 8884,
|
|
|
+ 0,
|
|
|
+ ebuf,
|
|
|
+ sizeof(ebuf),
|
|
|
+ "POST /handle_form_error HTTP/1.1\r\n"
|
|
|
+ "Host: localhost:8884\r\n"
|
|
|
+ "Connection: close\r\n"
|
|
|
+ "Content-Type: multipart/form-data; "
|
|
|
+ "boundary=multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Length: %u\r\n"
|
|
|
+ "\r\n%s",
|
|
|
+ (unsigned int)body_len,
|
|
|
+ multipart_body);
|
|
|
+
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ for (sleep_cnt = 0; sleep_cnt < 30; sleep_cnt++) {
|
|
|
+ test_sleep(1);
|
|
|
+ if (g_field_step == 1000) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client_ri = mg_get_response_info(client_conn);
|
|
|
+
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+ ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
+
|
|
|
+ /* Handle form: "POST multipart/form-data" very long preamble */
|
|
|
+ multipart_body =
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "preamblepreamblepreamblepreamblepreamble\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388\r\n";
|
|
|
+ "Content-Disposition: form-data; name=\"passwordin\"\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "\r\n"
|
|
|
+ "--multipart-form-data-boundary--see-RFC-2388--\r\n";
|
|
|
+
|
|
|
+ body_len = strlen(multipart_body);
|
|
|
+ ck_assert_uint_eq(body_len, 1768); /* not required */
|
|
|
+
|
|
|
+ client_conn =
|
|
|
+ mg_download("localhost",
|
|
|
+ 8884,
|
|
|
+ 0,
|
|
|
+ ebuf,
|
|
|
+ sizeof(ebuf),
|
|
|
+ "POST /handle_form_error HTTP/1.1\r\n"
|
|
|
+ "Host: localhost:8884\r\n"
|
|
|
+ "Connection: close\r\n"
|
|
|
+ "Content-Type: multipart/form-data; "
|
|
|
+ "boundary=multipart-form-data-boundary--see-RFC-2388\r\n"
|
|
|
+ "Content-Length: %u\r\n"
|
|
|
+ "\r\n%s",
|
|
|
+ (unsigned int)body_len,
|
|
|
+ multipart_body);
|
|
|
+
|
|
|
+ ck_assert(client_conn != NULL);
|
|
|
+ for (sleep_cnt = 0; sleep_cnt < 30; sleep_cnt++) {
|
|
|
+ test_sleep(1);
|
|
|
+ if (g_field_step == 1000) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client_ri = mg_get_response_info(client_conn);
|
|
|
+
|
|
|
+ ck_assert(client_ri != NULL);
|
|
|
+ ck_assert_int_eq(client_ri->status_code, 200);
|
|
|
+ mg_close_connection(client_conn);
|
|
|
|
|
|
/* Now test form_store */
|
|
|
|