diff --git a/components/esp_http_server/include/esp_http_server.h b/components/esp_http_server/include/esp_http_server.h index 1c8b78583ff..1f790b5ff86 100644 --- a/components/esp_http_server/include/esp_http_server.h +++ b/components/esp_http_server/include/esp_http_server.h @@ -40,6 +40,8 @@ initializer that should be kept in sync .global_user_ctx_free_fn = NULL, \ .global_transport_ctx = NULL, \ .global_transport_ctx_free_fn = NULL, \ + .enable_so_linger = false, \ + .linger_timeout = 0, \ .open_fn = NULL, \ .close_fn = NULL, \ .uri_match_fn = NULL \ @@ -185,6 +187,9 @@ typedef struct httpd_config { */ httpd_free_ctx_fn_t global_transport_ctx_free_fn; + bool enable_so_linger; /*!< bool to enable/disable linger */ + int linger_timeout; /*!< linger timeout (in seconds) */ + /** * Custom session opening callback. * diff --git a/components/esp_http_server/src/httpd_sess.c b/components/esp_http_server/src/httpd_sess.c index dea8e67d1ab..66c30260e26 100644 --- a/components/esp_http_server/src/httpd_sess.c +++ b/components/esp_http_server/src/httpd_sess.c @@ -353,6 +353,13 @@ void httpd_sess_delete(struct httpd_data *hd, struct sock_db *session) } ESP_LOGD(TAG, LOG_FMT("fd = %d"), session->fd); + if (hd->config.enable_so_linger) { + struct linger so_linger = { + .l_onoff = true, + .l_linger = hd->config.linger_timeout, + }; + setsockopt(session->fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(struct linger)); + } // Call close function if defined if (hd->config.close_fn) {