changeset 19937:b032dac216fe

lib-http: client: Improved test-http-payload to test partial reading of response payload.
author Stephan Bosch <stephan@rename-it.nl>
date Sat, 12 Mar 2016 01:56:55 +0100
parents 640849f3e2da
children 6d82e2d02ef9
files src/lib-http/http-client-connection.c src/lib-http/test-http-payload.c
diffstat 2 files changed, 58 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-http/http-client-connection.c	Thu Mar 03 22:29:44 2016 +0100
+++ b/src/lib-http/http-client-connection.c	Sat Mar 12 01:56:55 2016 +0100
@@ -540,7 +540,7 @@
 http_client_connection_return_response(struct http_client_request *req,
 	struct http_response *response)
 {
-	struct http_client_connection *conn = req->conn;
+	struct http_client_connection *conn = req->conn, *tmp_conn;
 	struct istream *payload;
 	bool retrying, ret;
 
@@ -571,7 +571,8 @@
 	conn->in_req_callback = TRUE;
 	http_client_connection_ref(conn);
 	retrying = !http_client_request_callback(req, response);
-	if (!http_client_connection_unref(&conn)) {
+	tmp_conn = conn;
+	if (!http_client_connection_unref(&tmp_conn)) {
 		/* the callback managed to get this connection destroyed */
 		req->conn = NULL;
 		if (!retrying)
@@ -579,7 +580,6 @@
 		http_client_request_unref(&req);
 		return FALSE;
 	}
-	conn = req->conn;
 	conn->in_req_callback = FALSE;
 
 	if (retrying) {
--- a/src/lib-http/test-http-payload.c	Thu Mar 03 22:29:44 2016 +0100
+++ b/src/lib-http/test-http-payload.c	Sat Mar 12 01:56:55 2016 +0100
@@ -28,7 +28,8 @@
 
 static bool blocking = FALSE;
 static bool request_100_continue = FALSE;
-static size_t read_partial = 1024;
+static size_t read_server_partial = 0;
+static size_t read_client_partial = 0;
 static unsigned int test_max_pending = 200;
 
 static struct ip_addr bind_ip;
@@ -345,9 +346,9 @@
 		payload_input =
 			http_server_request_get_payload_input(req, TRUE);
 
-		if (read_partial > 0) {
+		if (read_server_partial > 0) {
 			struct istream *partial =
-				i_stream_create_limit(payload_input, read_partial);
+				i_stream_create_limit(payload_input, read_server_partial);
 			i_stream_unref(&payload_input);
 			payload_input = partial;
 		}
@@ -392,9 +393,9 @@
 		creq->payload_input =
 			http_server_request_get_payload_input(req, FALSE);
 
-		if (read_partial > 0) {
+		if (read_server_partial > 0) {
 			struct istream *partial =
-				i_stream_create_limit(creq->payload_input, read_partial);
+				i_stream_create_limit(creq->payload_input, read_server_partial);
 			i_stream_unref(&creq->payload_input);
 			creq->payload_input = partial;
 		}
@@ -755,11 +756,20 @@
 	}
 
 	i_assert(fstream != NULL);
-	tcreq->file = fstream;
+	if (read_client_partial == 0) {
+		i_stream_ref(resp->payload);
+		tcreq->payload = resp->payload;
+		tcreq->file = fstream;
+	} else {
+		struct istream *payload = resp->payload;
+		tcreq->payload = i_stream_create_limit
+			(payload, read_client_partial);
+		tcreq->file = i_stream_create_limit
+			(fstream, read_client_partial);
+		i_stream_unref(&fstream);
+	}
 
-	i_stream_ref(resp->payload);
-	tcreq->payload = resp->payload;
-	tcreq->io = io_add_istream(resp->payload,
+	tcreq->io = io_add_istream(tcreq->payload,
 		test_client_download_payload_input, tcreq);
 	test_client_download_payload_input(tcreq);
 }
@@ -956,9 +966,9 @@
 			"failed to open %s", path);
 	}
 
-	if (read_partial > 0) {
-		struct istream *partial =
-			i_stream_create_limit(fstream, read_partial);
+	if (read_server_partial > 0) {
+		struct istream *partial = i_stream_create_limit
+			(fstream, read_server_partial);
 		i_stream_unref(&fstream);
 		fstream = partial;
 	}
@@ -1229,7 +1239,7 @@
 	test_begin("http payload download (server non-blocking)");
 	blocking = FALSE;
 	request_100_continue = FALSE;
-	read_partial = 0;
+	read_server_partial = 0;
 	test_run_sequential(test_client_download);
 	test_run_pipeline(test_client_download);
 	test_run_parallel(test_client_download);
@@ -1241,7 +1251,7 @@
 	test_begin("http payload download (server blocking)");
 	blocking = TRUE;
 	request_100_continue = FALSE;
-	read_partial = 0;
+	read_server_partial = 0;
 	test_run_sequential(test_client_download);
 	test_run_pipeline(test_client_download);
 	test_run_parallel(test_client_download);
@@ -1253,7 +1263,7 @@
 	test_begin("http payload echo (server non-blocking)");
 	blocking = FALSE;
 	request_100_continue = FALSE;
-	read_partial = 0;
+	read_server_partial = 0;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1265,7 +1275,7 @@
 	test_begin("http payload echo (server blocking)");
 	blocking = TRUE;
 	request_100_continue = FALSE;
-	read_partial = 0;
+	read_server_partial = 0;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1277,7 +1287,7 @@
 	test_begin("http payload echo (server non-blocking; 100-continue)");
 	blocking = FALSE;
 	request_100_continue = TRUE;
-	read_partial = 0;
+	read_server_partial = 0;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1289,7 +1299,7 @@
 	test_begin("http payload echo (server blocking; 100-continue)");
 	blocking = TRUE;
 	request_100_continue = TRUE;
-	read_partial = 0;
+	read_server_partial = 0;
   test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1301,13 +1311,13 @@
 	test_begin("http payload echo (server non-blocking; partial short)");
 	blocking = FALSE;
 	request_100_continue = FALSE;
-	read_partial = 1024;
+	read_server_partial = 1024;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
 	test_end();
 	test_begin("http payload echo (server non-blocking; partial long)");
-	read_partial = IO_BLOCK_SIZE + 1024;
+	read_server_partial = IO_BLOCK_SIZE + 1024;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1319,19 +1329,41 @@
 	test_begin("http payload echo (server blocking; partial short)");
 	blocking = TRUE;
 	request_100_continue = FALSE;
-	read_partial = 1024;
+	read_server_partial = 1024;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
 	test_end();
 	test_begin("http payload echo (server blocking; partial long)");
-	read_partial = IO_BLOCK_SIZE + 1024;
+	read_server_partial = IO_BLOCK_SIZE + 1024;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
 	test_end();
 }
 
+static void test_download_client_partial(void)
+{
+	test_begin("http payload download (client partial)");
+	blocking = FALSE;
+	request_100_continue = FALSE;
+	read_server_partial = 0;
+	read_client_partial = 1024;
+	test_run_sequential(test_client_download);
+	test_run_pipeline(test_client_download);
+	test_run_parallel(test_client_download);
+	test_end();
+	test_begin("http payload download (client partial long)");
+	blocking = FALSE;
+	request_100_continue = FALSE;
+	read_server_partial = 0;
+	read_client_partial = IO_BLOCK_SIZE + 1024;
+	test_run_sequential(test_client_download);
+	test_run_pipeline(test_client_download);
+	test_run_parallel(test_client_download);
+	test_end();
+}
+
 static void (*test_functions[])(void) = {
 	test_download_server_nonblocking,
 	test_download_server_blocking,
@@ -1341,6 +1373,7 @@
 	test_echo_server_blocking_sync,
 	test_echo_server_nonblocking_partial,
 	test_echo_server_blocking_partial,
+	test_download_client_partial,
 	NULL
 };