]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http server: Call request destroy callback immediately after response is finished...
authorTimo Sirainen <tss@iki.fi>
Mon, 11 Aug 2014 11:18:53 +0000 (14:18 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 11 Aug 2014 11:18:53 +0000 (14:18 +0300)
Regardless of any other references to the request.

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

index f31f3b5abd41c3ba316cb482d9e34efabce10fe2..99289135ccfc1966fd69c2799a656db162995614 100644 (file)
@@ -157,6 +157,7 @@ int http_server_response_send_more(struct http_server_response *resp,
 
 struct http_server_request *
 http_server_request_new(struct http_server_connection *conn);
+void http_server_request_destroy(struct http_server_request **_req);
 void http_server_request_abort(struct http_server_request **_req);
 
 void http_server_request_halt_payload(struct http_server_request *req);
index d4b5df18744a84da1d277a7b6007071ad8cb6050..45cb1eb1fa165fef64d918781100054c87be9d8b 100644 (file)
@@ -55,6 +55,17 @@ bool http_server_request_unref(struct http_server_request **_req)
        return FALSE;
 }
 
+void http_server_request_destroy(struct http_server_request **_req)
+{
+       struct http_server_request *req = *_req;
+
+       if (req->destroy_callback != NULL) {
+               req->destroy_callback(req->destroy_context);
+               req->destroy_callback = NULL;
+       }
+       http_server_request_unref(_req);
+}
+
 void http_server_request_set_destroy_callback(struct http_server_request *req,
                                              void (*callback)(void *),
                                              void *context)
@@ -168,11 +179,11 @@ void http_server_request_finished(struct http_server_request *req)
                        http_server_connection_close(&conn,
                                "Client requested connection close");
                }
-               http_server_request_unref(&req);
+               http_server_request_destroy(&req);
                return;
        }
 
-       http_server_request_unref(&req);
+       http_server_request_destroy(&req);
        if (tunnel_callback != NULL) {
                http_server_connection_tunnel(&conn, tunnel_callback, tunnel_context);
                return;
index 961d9259aef53abd335b3902fd974b3c328399f2..dc2d6387cad5c452673c9a618f15c8d4e105cf44 100644 (file)
@@ -81,7 +81,11 @@ void http_server_request_fail(struct http_server_request *req,
 void http_server_request_fail_close(struct http_server_request *req,
        unsigned int status, const char *reason);
 
-/* Call the specified callback when HTTP request is destroyed. */
+/* Call the specified callback when HTTP request is destroyed. This always
+   happens only after the response and its payload is fully sent. (If request
+   headers aren't fully read, we never call the handle_request() callback.
+   The request body reading is the responsibility of the caller, which also
+   needs to handle its errors by sending a failure response.) */
 void http_server_request_set_destroy_callback(struct http_server_request *req,
                                              void (*callback)(void *),
                                              void *context);