dovecot-2.2: lib-http server: Call request destroy callback imme...

dovecot at dovecot.org dovecot at dovecot.org
Mon Aug 11 11:21:01 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/0098ed2b4b50
changeset: 17694:0098ed2b4b50
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Aug 11 14:18:53 2014 +0300
description:
lib-http server: Call request destroy callback immediately after response is finished sending.
Regardless of any other references to the request.

diffstat:

 src/lib-http/http-server-private.h |   1 +
 src/lib-http/http-server-request.c |  15 +++++++++++++--
 src/lib-http/http-server.h         |   6 +++++-
 3 files changed, 19 insertions(+), 3 deletions(-)

diffs (62 lines):

diff -r 051a96b3960f -r 0098ed2b4b50 src/lib-http/http-server-private.h
--- a/src/lib-http/http-server-private.h	Mon Aug 11 13:32:06 2014 +0300
+++ b/src/lib-http/http-server-private.h	Mon Aug 11 14:18:53 2014 +0300
@@ -157,6 +157,7 @@
 
 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);
diff -r 051a96b3960f -r 0098ed2b4b50 src/lib-http/http-server-request.c
--- a/src/lib-http/http-server-request.c	Mon Aug 11 13:32:06 2014 +0300
+++ b/src/lib-http/http-server-request.c	Mon Aug 11 14:18:53 2014 +0300
@@ -55,6 +55,17 @@
 	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 @@
 			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;
diff -r 051a96b3960f -r 0098ed2b4b50 src/lib-http/http-server.h
--- a/src/lib-http/http-server.h	Mon Aug 11 13:32:06 2014 +0300
+++ b/src/lib-http/http-server.h	Mon Aug 11 14:18:53 2014 +0300
@@ -81,7 +81,11 @@
 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);


More information about the dovecot-cvs mailing list