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);
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)
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;
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);