From 1418d1e9018fc34287722467c6ee506f3e378e1a Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 12 Jan 2023 12:23:31 +0200 Subject: [PATCH] lib-http: server - Don't disconnect client before response is fully sent This could happen at least when the payload is empty and the final LF was buffered. --- src/lib-http/http-server-response.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lib-http/http-server-response.c b/src/lib-http/http-server-response.c index 46b337d42b..9df7af858b 100644 --- a/src/lib-http/http-server-response.c +++ b/src/lib-http/http-server-response.c @@ -366,6 +366,12 @@ int http_server_response_finish_payload_out(struct http_server_response *resp) o_stream_unref(&resp->payload_output); resp->payload_output = NULL; } + if (o_stream_get_buffer_used_size(conn->conn.output) > 0) { + e_debug(resp->event, + "Not quite finished sending response"); + conn->output_locked = TRUE; + return 0; + } e_debug(resp->event, "Finished sending payload"); @@ -513,13 +519,13 @@ int http_server_response_send_more(struct http_server_response *resp) struct ostream *output = resp->payload_output; enum ostream_send_istream_result res; - i_assert(resp->payload_output != NULL); - if (resp->payload_finished) { e_debug(resp->event, "Finish sending payload (more)"); return http_server_response_finish_payload_out(resp); } + i_assert(resp->payload_output != NULL); + if (resp->payload_stream != NULL) { conn->output_locked = TRUE; return http_server_ostream_continue(resp->payload_stream); -- 2.47.3