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