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