From b22f7d3a49d8c5fbd9f4d9d1012c11e2f59d9c3e Mon Sep 17 00:00:00 2001
From: Andrea Guzzo <xant@xant.net>
Date: Thu, 6 Feb 2014 10:17:56 +0000
Subject: [PATCH] added a new handler callback to be used when the http
 connection is being closed

so that in case of connections closed prematurely, the user can clear resources
eventually bound to the connection using the 'connection_param' member of the
mg_connection structure
---
 mongoose.c | 9 +++++++++
 mongoose.h | 1 +
 2 files changed, 10 insertions(+)

diff --git a/mongoose.c b/mongoose.c
index 156cef5f1..55714c1e1 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -297,6 +297,7 @@ struct mg_server {
   union socket_address lsa;   // Listening socket address
   struct ll active_connections;
   mg_handler_t request_handler;
+  mg_handler_t http_close_handler;
   mg_handler_t error_handler;
   mg_handler_t auth_handler;
   char *config_options[NUM_OPTIONS];
@@ -1391,6 +1392,10 @@ static void close_conn(struct connection *conn) {
   LINKED_LIST_REMOVE(&conn->link);
   closesocket(conn->client_sock);
   close_local_endpoint(conn);
+
+  if (conn->server->http_close_handler)
+    conn->server->http_close_handler(&conn->mg_conn);
+
   DBG(("%p %d %d", conn, conn->flags, conn->endpoint_type));
   free(conn->request);            // It's OK to free(NULL), ditto below
   free(conn->path_info);
@@ -4175,6 +4180,10 @@ void mg_set_request_handler(struct mg_server *server, mg_handler_t handler) {
   server->request_handler = handler;
 }
 
+void mg_set_http_close_handler(struct mg_server *server, mg_handler_t handler) {
+  server->http_close_handler = handler;
+}
+
 void mg_set_http_error_handler(struct mg_server *server, mg_handler_t handler) {
   server->error_handler = handler;
 }
diff --git a/mongoose.h b/mongoose.h
index b71533b96..d335c8039 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -67,6 +67,7 @@ void mg_destroy_server(struct mg_server **);
 const char *mg_set_option(struct mg_server *, const char *opt, const char *val);
 unsigned int mg_poll_server(struct mg_server *, int milliseconds);
 void mg_set_request_handler(struct mg_server *, mg_handler_t);
+void mg_set_http_close_handler(struct mg_server *, mg_handler_t);
 void mg_set_http_error_handler(struct mg_server *, mg_handler_t);
 void mg_set_auth_handler(struct mg_server *, mg_handler_t);
 const char **mg_get_valid_option_names(void);
-- 
GitLab