diff --git a/lib/core-net/service.c b/lib/core-net/service.c index 080c271dc..e00bc3717 100644 --- a/lib/core-net/service.c +++ b/lib/core-net/service.c @@ -689,11 +689,16 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, if ((!(pollfd->revents & pollfd->events & LWS_POLLIN)) && (pollfd->revents & LWS_POLLHUP)) { - wsi->socket_is_permanently_unusable = 1; - lwsl_debug("Session Socket %s (fd=%d) dead\n", - lws_wsi_tag(wsi), pollfd->fd); - goto close_and_handled; + if (lws_buflist_total_len(&wsi->buflist)) + lws_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_ACK, 3); + else { + wsi->socket_is_permanently_unusable = 1; + lwsl_debug("Session Socket %s (fd=%d) dead\n", + lws_wsi_tag(wsi), pollfd->fd); + + goto close_and_handled; + } } #ifdef _WIN32 @@ -701,13 +706,6 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, wsi->sock_send_blocking = FALSE; #endif - if ((!(pollfd->revents & pollfd->events & LWS_POLLIN)) && - (pollfd->revents & LWS_POLLHUP)) { - lwsl_debug("pollhup\n"); - wsi->socket_is_permanently_unusable = 1; - goto close_and_handled; - } - #if defined(LWS_WITH_TLS) if (lwsi_state(wsi) == LRS_SHUTDOWN && lws_is_ssl(wsi) && wsi->tls.ssl) {