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