|  | @@ -2922,6 +2922,575 @@ START_TEST(test_handle_form)
 | 
											
												
													
														|  |  	ck_assert_int_eq(client_ri->status_code, 200);
 |  |  	ck_assert_int_eq(client_ri->status_code, 200);
 | 
											
												
													
														|  |  	mg_close_connection(client_conn);
 |  |  	mg_close_connection(client_conn);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +	/* Handle form: "POST multipart/form-data" without trailing CRLF*/
 | 
											
												
													
														|  | 
 |  | +	/*
 | 
											
												
													
														|  | 
 |  | +	 * 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]
 | 
											
												
													
														|  | 
 |  | +	 */
 | 
											
												
													
														|  | 
 |  | +	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*/
 | 
											
												
													
														|  | 
 |  | +	/*
 | 
											
												
													
														|  | 
 |  | +	 * 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]
 | 
											
												
													
														|  | 
 |  | +	 *
 | 
											
												
													
														|  | 
 |  | +	 * epilogue := discard-text
 | 
											
												
													
														|  | 
 |  | +	 *
 | 
											
												
													
														|  | 
 |  | +	 * discard-text := *(*text CRLF) *text
 | 
											
												
													
														|  | 
 |  | +	 *
 | 
											
												
													
														|  | 
 |  | +	 * text := <any CHAR, including bare CR & bare LF, but NOT including 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--\r\n"
 | 
											
												
													
														|  | 
 |  | +		"epilogue\r\n"
 | 
											
												
													
														|  | 
 |  | +		"epilogue\r\n"
 | 
											
												
													
														|  | 
 |  | +		"\r\n"
 | 
											
												
													
														|  | 
 |  | +		"epilogue\r\n"
 | 
											
												
													
														|  | 
 |  | +		"\r\n"
 | 
											
												
													
														|  | 
 |  | +		"\r\n"
 | 
											
												
													
														|  | 
 |  | +		"\r\n"
 | 
											
												
													
														|  | 
 |  | +		"epilogue\r\n";
 | 
											
												
													
														|  | 
 |  | +	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 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"
 | 
											
												
													
														|  | 
 |  | +	    "\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, 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 transport padding*/
 | 
											
												
													
														|  | 
 |  | +	/*
 | 
											
												
													
														|  | 
 |  | +	 * 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]
 | 
											
												
													
														|  | 
 |  | +	 *
 | 
											
												
													
														|  | 
 |  | +	 * transport-padding := *LWSP-char
 | 
											
												
													
														|  | 
 |  | +	 *
 | 
											
												
													
														|  | 
 |  | +	 * LWSP-char := SPACE / HTAB
 | 
											
												
													
														|  | 
 |  | +	 */
 | 
											
												
													
														|  | 
 |  | +	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, 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 chunked transfer encoding */
 |  |  	/* Handle form: "POST multipart/form-data" with chunked transfer encoding */
 | 
											
												
													
														|  |  	client_conn =
 |  |  	client_conn =
 |