]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http server: Require handle_request() to either send a response or reference...
authorTimo Sirainen <tss@iki.fi>
Tue, 5 Aug 2014 15:43:31 +0000 (17:43 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 5 Aug 2014 15:43:31 +0000 (17:43 +0200)
This should make it more difficult to accidentally forget to send a
response and cause a hang.

Currently this assert-crashes, although it would have been possible to make
it return some internal error instead also.

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

index f0bcdf8cc1b2b2b976aba9b70bf9cabebcc7a4f6..9931134712ab11616c230597dfdbe039a922d4c4 100644 (file)
@@ -259,7 +259,12 @@ static void http_server_connection_request_callback(
                        http_server_request_fail(req, 505, "Not Implemented");
                        return;
                } else {
+                       unsigned int old_refcount = req->refcount;
+
                        conn->callbacks->handle_request(conn->context, req);
+                       i_assert((req->response != NULL &&
+                                 req->response->submitted) ||
+                                req->refcount > old_refcount);
                }
        }
 }
index fe87fe05a49f412686c5f85eaea80d1f14a9872a..961d9259aef53abd335b3902fd974b3c328399f2 100644 (file)
@@ -38,6 +38,10 @@ struct http_server_tunnel {
 };
 
 struct http_server_callbacks {
+       /* Reference the server request. Before returning you must either send
+          a response to the request or reference the request with
+          http_server_request_ref() and unreference it later after sending
+          the response. */
        void (*handle_request)(void *context, struct http_server_request *req);
        void (*handle_connect_request)(void *context,
                struct http_server_request *req, struct http_url *target);