]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http server: Delay calling the request's destroy callback until handle_request...
authorTimo Sirainen <tss@iki.fi>
Tue, 12 Aug 2014 10:12:01 +0000 (13:12 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 12 Aug 2014 10:12:01 +0000 (13:12 +0300)
This simplifies the code in the handle_request() so it doesn't need to keep
track of whether the response is already submitted or not.

src/lib-http/http-server-connection.c
src/lib-http/http-server-private.h
src/lib-http/http-server-request.c

index 056d21e1731d695f47fc020afb8be881cfa11d2a..9e6d824ef5fc7aa6d2739c5afa63ae95bce3cd78 100644 (file)
@@ -440,18 +440,26 @@ static void http_server_connection_input(struct connection *_conn)
                        conn->stats.request_count++;
 
                        http_server_request_ref(req);
+                       i_assert(!req->delay_destroy);
+                       req->delay_destroy = TRUE;
                        T_BEGIN {
                                cont = http_server_connection_handle_request(conn, req);
                        } T_END;
                        if (!cont) {
                                /* connection closed or request body not read yet.
                                   the request may be destroyed now. */
-                               http_server_request_unref(&req);
+                               if (req->destroy_pending)
+                                       http_server_request_destroy(&req);
+                               else
+                                       http_server_request_unref(&req);
                                return;
                        }
                        if (req->req.connection_close)
                                conn->close_indicated = TRUE;
-                       http_server_request_unref(&req);
+                       if (req->destroy_pending)
+                               http_server_request_destroy(&req);
+                       else
+                               http_server_request_unref(&req);
                
                        /* client indicated it will close after this request; stop trying
                           to read more. */                        
index 99289135ccfc1966fd69c2799a656db162995614..c340fc7fbac3e259f791f6022750f2be9c0458cc 100644 (file)
@@ -82,6 +82,8 @@ struct http_server_request {
 
        unsigned int payload_halted:1;
        unsigned int sent_100_continue:1;
+       unsigned int delay_destroy:1;
+       unsigned int destroy_pending:1;
        unsigned int failed:1;
 };
 
index 1d139aea8c356e37e142104c572a893d0488d8f0..4f5cde4ce7f2cdc887daf77ca815ac075b758581 100644 (file)
@@ -59,7 +59,9 @@ void http_server_request_destroy(struct http_server_request **_req)
 {
        struct http_server_request *req = *_req;
 
-       if (req->destroy_callback != NULL) {
+       if (req->delay_destroy) {
+               req->destroy_pending = TRUE;
+       } else if (req->destroy_callback != NULL) {
                req->destroy_callback(req->destroy_context);
                req->destroy_callback = NULL;
        }