]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: http-server-response - Fix management of connection idle timeout.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Sun, 17 Nov 2019 23:34:50 +0000 (00:34 +0100)
committermartti.rannanjarvi <martti.rannanjarvi@open-xchange.com>
Sat, 18 Apr 2020 14:55:11 +0000 (14:55 +0000)
src/lib-http/http-server-response.c

index 76c5387b44e685520c158e6a402680e9a07c0029..c0d23d251453ab8a30cb0ae1ee092cb8c737ee8d 100644 (file)
@@ -269,6 +269,8 @@ http_server_response_flush_payload(struct http_server_response *resp)
            (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;
        }
 
@@ -308,6 +310,11 @@ int http_server_response_finish_payload_out(struct http_server_response *resp)
                                            conn);
        }
 
+       if (conn->request_queue_head == NULL ||
+           (conn->request_queue_head->state !=
+            HTTP_SERVER_REQUEST_STATE_PROCESSING))
+               http_server_connection_start_idle_timeout(conn);
+
        http_server_request_finished(resp->request);
        http_server_connection_unref(&conn);
        return 1;
@@ -570,14 +577,16 @@ int http_server_response_send_more(struct http_server_response *resp)
                }
                break;
        case OSTREAM_SEND_ISTREAM_RESULT_WAIT_INPUT:
-               /* Input is blocking */
+               /* Input is blocking (server needs to act; disable timeout) */
                conn->output_locked = TRUE;
+               http_server_connection_stop_idle_timeout(conn);
                conn->io_resp_payload = io_add_istream(resp->payload_input,
                        http_server_response_payload_input, resp);
                break;
        case OSTREAM_SEND_ISTREAM_RESULT_WAIT_OUTPUT:
-               /* Output is blocking */
+               /* Output is blocking (client needs to act; enable timeout) */
                conn->output_locked = TRUE;
+               http_server_connection_start_idle_timeout(conn);
                o_stream_set_flush_pending(output, TRUE);
                //e_debug(resp->event, "Partially sent payload");
                break;