diff --git a/mongoose.c b/mongoose.c index 156cef5f160aa5913c0054ee4f1ed10a5e2fc807..55714c1e13bbc39bd64176989a58931eb5656d6d 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 b71533b9664c9966570cf960348725be8e01aee4..d335c8039c352b33f092b4a8ab3c17af0dbfa674 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);