Mercurial > dovecot > core-2.2
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;