diff --git a/changelog b/changelog
index 8b79f121a958bb98e0d7b6c277b5d4f9f8ad5c24..f6b85d94cbccca7c321f3f08fa18e2ccd053d841 100644
--- a/changelog
+++ b/changelog
@@ -28,6 +28,9 @@ User api additions
 	then does not have to try to track while connections it choked, this
 	will free up all of them in one call.
 
+ - there's a new, optional callback LWS_CALLBACK_CLOSED_HTTP which gets
+	called when an HTTP protocol socket closes
+
 
 User api changes
 ----------------
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index d312390d4cae554ab98d0e8322d99d580c6e6f83..e75a51009edcd622071c906cad8912dbe60a70f9 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -210,6 +210,8 @@ libwebsocket_close_and_free_session(struct libwebsocket_context *context,
 		lwsl_debug("closing http fd %d\n", wsi->u.http.fd);
 		close(wsi->u.http.fd);
 		wsi->u.http.fd = 0;
+		context->protocols[0].callback(context, wsi,
+			LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0);
 	}
 
 #ifndef LWS_NO_EXTENSIONS
diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h
index 65bae14534e93213fd1315feff6b17ada613f8bb..9f686bd8796f5ed3097904cf3ab9fff85427292a 100644
--- a/lib/libwebsockets.h
+++ b/lib/libwebsockets.h
@@ -138,6 +138,7 @@ enum libwebsocket_callback_reasons {
 	LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH,
 	LWS_CALLBACK_CLIENT_ESTABLISHED,
 	LWS_CALLBACK_CLOSED,
+	LWS_CALLBACK_CLOSED_HTTP,
 	LWS_CALLBACK_RECEIVE,
 	LWS_CALLBACK_CLIENT_RECEIVE,
 	LWS_CALLBACK_CLIENT_RECEIVE_PONG,
@@ -419,6 +420,8 @@ struct libwebsocket_extension;
  *
  *	LWS_CALLBACK_CLOSED: when the websocket session ends
  *
+ *	LWS_CALLBACK_CLOSED_HTTP: when a HTTP (non-websocket) session ends
+ *
  *	LWS_CALLBACK_RECEIVE: data has appeared for this server endpoint from a
  *				remote client, it can be found at *in and is
  *				len bytes long