changeset 16730:7b775a06c38f

lib-http: http-client: Fixed pipelining when payload synchronizatio (100-continue) is used. Forgot to lock the connection output, which meant that new requests would enqueued for the connection while waiting for 100 Continue. This would cause an assert failure.
author Stephan Bosch <stephan@rename-it.nl>
date Sun, 15 Sep 2013 03:27:31 +0300
parents ae309d070b44
children abd565369b8f
files src/lib-http/http-client-connection.c src/lib-http/http-client-request.c
diffstat 2 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-http/http-client-connection.c	Sat Sep 14 00:26:58 2013 +0300
+++ b/src/lib-http/http-client-connection.c	Sun Sep 15 03:27:31 2013 +0300
@@ -552,7 +552,7 @@
 			if (conn->payload_continue) {
 				http_client_connection_debug(conn,
 					"Got 100-continue response after timeout");
-				return;
+				continue;
 			}
 			conn->peer->no_payload_sync = FALSE;
 			conn->peer->seen_100_response = TRUE;
@@ -583,11 +583,14 @@
 		http_client_request_unref(&req);
 		
 		conn->close_indicated = response->connection_close;
+		if (req->payload_sync && !conn->payload_continue)
+			conn->output_locked = FALSE;	
 
 		if (!aborted) {
 			if (response->status == 417 && req->payload_sync) {
 				/* drop Expect: continue */
 				req->payload_sync = FALSE;
+				conn->output_locked = FALSE;
 				conn->peer->no_payload_sync = TRUE;
 				http_client_request_retry(req, response->status, response->reason);
 				return;
--- a/src/lib-http/http-client-request.c	Sat Sep 14 00:26:58 2013 +0300
+++ b/src/lib-http/http-client-request.c	Sun Sep 15 03:27:31 2013 +0300
@@ -415,6 +415,7 @@
 				ret = -1;
 		} else {
 			http_client_request_debug(req, "Waiting for 100-continue");
+			conn->output_locked = TRUE;
 		}
 	} else {
 		req->state = HTTP_REQUEST_STATE_WAITING;