From: Timo Sirainen Date: Tue, 10 Jan 2023 22:44:40 +0000 (+0200) Subject: lib-http: server - Don't disconnect client before payload is fully sent X-Git-Tag: 2.4.0~3194 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de39f0939015e18d4444395b0997b65ece4bfd4e;p=thirdparty%2Fdovecot%2Fcore.git lib-http: server - Don't disconnect client before payload is fully sent --- diff --git a/src/lib-http/http-server-response.c b/src/lib-http/http-server-response.c index 37ad8abd77..46b337d42b 100644 --- a/src/lib-http/http-server-response.c +++ b/src/lib-http/http-server-response.c @@ -320,16 +320,16 @@ http_server_response_flush_payload(struct http_server_response *resp) struct http_server_connection *conn = req->conn; int ret; - if (resp->payload_output != conn->conn.output && - (ret = o_stream_finish(resp->payload_output)) <= 0) { - if (ret < 0) - http_server_connection_handle_output_error(conn); - else - http_server_connection_start_idle_timeout(conn); - return ret; - } + if (resp->payload_output == conn->conn.output) + ret = o_stream_flush(resp->payload_output); + else + ret = o_stream_finish(resp->payload_output); - return 1; + if (ret < 0) + http_server_connection_handle_output_error(conn); + else if (ret == 0) + http_server_connection_start_idle_timeout(conn); + return ret; } void http_server_response_request_finished(struct http_server_response *resp) @@ -360,6 +360,7 @@ int http_server_response_finish_payload_out(struct http_server_response *resp) if (ret == 0) { e_debug(resp->event, "Not quite finished sending payload"); + conn->output_locked = TRUE; return 0; } o_stream_unref(&resp->payload_output);