]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: server - Don't disconnect client before payload is fully sent
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 10 Jan 2023 22:44:40 +0000 (00:44 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Fri, 13 Jan 2023 12:16:26 +0000 (12:16 +0000)
src/lib-http/http-server-response.c

index 37ad8abd77fba70a933cb5c5bc85d24d389f598e..46b337d42bfb9ad41c180591fadf5979089de188 100644 (file)
@@ -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);