Browse Source

Add test for chunked encoding

bel 9 years ago
parent
commit
e684111162
2 changed files with 62 additions and 16 deletions
  1. 1 1
      src/civetweb.c
  2. 61 15
      test/public_server.c

+ 1 - 1
src/civetweb.c

@@ -11878,7 +11878,7 @@ getreq(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int *err)
 			conn->request_info.content_length = conn->content_len;
 		} else if ((cl = get_header(&conn->request_info, "Transfer-Encoding"))
 		               != NULL
-		           && strcmp(cl, "chunked") == 0) {
+		           && !mg_strcasecmp(cl, "chunked")) {
 			conn->is_chunked = 1;
 		} else if (!mg_strcasecmp(conn->request_info.request_method, "POST")
 		           || !mg_strcasecmp(conn->request_info.request_method,

+ 61 - 15
test/public_server.c

@@ -1720,6 +1720,8 @@ START_TEST(test_handle_form)
 	const char *opt;
 	int opt_idx = 0;
 	char ebuf[100];
+	const char *multipart_body;
+	size_t body_len, chunk_len;
 
 	memset((void *)OPTIONS, 0, sizeof(OPTIONS));
 	OPTIONS[opt_idx++] = "listening_ports";
@@ -1796,20 +1798,7 @@ START_TEST(test_handle_form)
 	mg_close_connection(client_conn);
 
 	/* Handle form: "POST multipart/form-data" */
-	client_conn = mg_download(
-	    "localhost",
-	    8884,
-	    0,
-	    ebuf,
-	    sizeof(ebuf),
-	    "%s",
-	    "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: 2374\r\n"
-	    "\r\n"
+	multipart_body =
 	    "--multipart-form-data-boundary--see-RFC-2388\r\n"
 	    "Content-Disposition: form-data; name=\"textin\"\r\n"
 	    "\r\n"
@@ -1900,7 +1889,26 @@ START_TEST(test_handle_form)
 	    "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");
+	    "--multipart-form-data-boundary--see-RFC-2388--\r\n";
+	body_len = strlen(multipart_body);
+	ck_assert_uint_eq(body_len, 2374); /* 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",
+	                body_len,
+	                multipart_body);
+
 	ck_assert(client_conn != NULL);
 	test_sleep(1);
 	ri = mg_get_request_info(client_conn);
@@ -1909,6 +1917,44 @@ START_TEST(test_handle_form)
 	ck_assert_str_eq(ri->uri, "200");
 	mg_close_connection(client_conn);
 
+	/* Handle form: "POST multipart/form-data" with chunked transfer encoding */
+	client_conn =
+	    mg_download("localhost",
+	                8884,
+	                0,
+	                ebuf,
+	                sizeof(ebuf),
+	                "%s",
+	                "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"
+	                "Transfer-Encoding: chunked\r\n"
+	                "\r\n");
+
+	ck_assert(client_conn != NULL);
+
+	body_len = strlen(multipart_body);
+	chunk_len = 1;
+	while (body_len > 0) {
+		if (chunk_len > body_len) {
+			chunk_len = body_len;
+		}
+		mg_printf(client_conn, "%x\r\n", chunk_len);
+		mg_write(client_conn, multipart_body + i, chunk_len);
+		mg_printf(client_conn, "\r\n");
+		body_len -= chunk_len;
+		chunk_len = (chunk_len % 40) + 1;
+	}
+
+	test_sleep(1);
+	ri = mg_get_request_info(client_conn);
+
+	ck_assert(ri != NULL);
+	ck_assert_str_eq(ri->uri, "200");
+	mg_close_connection(client_conn);
+
 	/* Close the server */
 	g_ctx = NULL;
 	mg_stop(ctx);