]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: http-server-connection - Add internal API for halting and resuming connecti...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Sat, 9 Nov 2019 10:02:56 +0000 (11:02 +0100)
committermartti.rannanjarvi <martti.rannanjarvi@open-xchange.com>
Sat, 18 Apr 2020 14:55:11 +0000 (14:55 +0000)
src/lib-http/http-server-connection.c
src/lib-http/http-server-private.h
src/lib-http/http-server-request.c
src/lib-http/http-server-response.c

index c594ed0d498f56902fb876e0c0c0df7ed63f8e90..8b90be988510b4984a1bf586012fe648d52ef29e 100644 (file)
@@ -314,7 +314,7 @@ http_server_connection_handle_request(struct http_server_connection *conn,
                /* Send 100 Continue when appropriate */
                if (req->req.expect_100_continue && !req->payload_halted &&
                    req->response == NULL) {
-                       http_server_connection_trigger_responses(conn);
+                       http_server_connection_output_trigger(conn);
                }
 
                /* Delegate payload handling to request handler */
@@ -988,12 +988,32 @@ int http_server_connection_output(struct http_server_connection *conn)
        return 1;
 }
 
-void http_server_connection_trigger_responses(
-       struct http_server_connection *conn)
+void http_server_connection_output_trigger(struct http_server_connection *conn)
 {
+       if (conn->conn.output == NULL)
+               return;
        o_stream_set_flush_pending(conn->conn.output, TRUE);
 }
 
+void http_server_connection_output_halt(struct http_server_connection *conn)
+{
+       conn->output_halted = TRUE;
+
+       if (conn->conn.output == NULL)
+               return;
+
+       o_stream_unset_flush_callback(conn->conn.output);
+}
+
+void http_server_connection_output_resume(struct http_server_connection *conn)
+{
+       if (conn->output_halted) {
+               conn->output_halted = FALSE;
+               o_stream_set_flush_callback(conn->conn.output,
+                                           http_server_connection_output, conn);
+       }
+}
+
 bool http_server_connection_pending_payload(
        struct http_server_connection *conn)
 {
index 82fad790224af9d3475bd1c38b68cc8b1e72b61d..c2dde79fa1333f8ab337f76c662e67bcba13f086 100644 (file)
@@ -156,6 +156,7 @@ struct http_server_connection {
        bool close_indicated:1;
        bool input_broken:1;
        bool output_locked:1;
+       bool output_halted:1;
        bool in_req_callback:1;  /* performing request callback (busy) */
 };
 
@@ -279,8 +280,10 @@ bool http_server_connection_shut_down(struct http_server_connection *conn);
 void http_server_connection_handle_output_error(
        struct http_server_connection *conn);
 
-void http_server_connection_trigger_responses(
-       struct http_server_connection *conn);
+void http_server_connection_output_trigger(struct http_server_connection *conn);
+void http_server_connection_output_halt(struct http_server_connection *conn);
+void http_server_connection_output_resume(struct http_server_connection *conn);
+
 int http_server_connection_flush(struct http_server_connection *conn);
 int http_server_connection_output(struct http_server_connection *conn);
 
index c5c31300b77bdc2a8a39bb053f212017a1132404..5688f7888689f0c402994e9dd9ee007ed481d19c 100644 (file)
@@ -257,7 +257,7 @@ void http_server_request_continue_payload(struct http_server_request *req)
        i_assert(req->state <= HTTP_SERVER_REQUEST_STATE_QUEUED);
        req->payload_halted = FALSE;
        if (req->req.expect_100_continue && !req->sent_100_continue)
-               http_server_connection_trigger_responses(req->conn);
+               http_server_connection_output_trigger(req->conn);
 }
 
 static void
@@ -325,7 +325,7 @@ void http_server_request_ready_to_respond(struct http_server_request *req)
        e_debug(req->event, "Ready to respond");
 
        req->state = HTTP_SERVER_REQUEST_STATE_READY_TO_RESPOND;
-       http_server_connection_trigger_responses(req->conn);
+       http_server_connection_output_trigger(req->conn);
 }
 
 void http_server_request_submit_response(struct http_server_request *req)
@@ -354,7 +354,7 @@ void http_server_request_submit_response(struct http_server_request *req)
                http_server_request_ready_to_respond(req);
                break;
        case HTTP_SERVER_REQUEST_STATE_READY_TO_RESPOND:
-               http_server_connection_trigger_responses(req->conn);
+               http_server_connection_output_trigger(req->conn);
                break;
        case HTTP_SERVER_REQUEST_STATE_ABORTED:
                break;
@@ -408,7 +408,7 @@ void http_server_request_finished(struct http_server_request *req)
                return;
        }
 
-       http_server_connection_trigger_responses(conn);
+       http_server_connection_output_trigger(conn);
 }
 
 static struct http_server_response *
@@ -593,7 +593,7 @@ http_server_istream_read(struct istream_private *stream)
 
                if (blocking && req->req.expect_100_continue &&
                    !req->sent_100_continue)
-                       http_server_connection_trigger_responses(conn);
+                       http_server_connection_output_trigger(conn);
 
                hsristream->read_status = 0;
                io = io_add_istream(&stream->istream,
index 242c534f80007d55487827fa0441e132f18925e7..e10594dad69e8d287e663557dea468f00c948f1f 100644 (file)
@@ -392,7 +392,7 @@ http_server_response_output_payload(struct http_server_response **_resp,
                        if (req->state < HTTP_SERVER_REQUEST_STATE_PAYLOAD_OUT) {
                                e_debug(resp->event,
                                        "Preparing to send blocking payload");
-                               http_server_connection_trigger_responses(conn);
+                               http_server_connection_output_trigger(conn);
                        } else if (resp->payload_output != NULL) {
                                e_debug(resp->event,
                                        "Sending blocking payload");