From d3801be6d9fa4f72f68b79696cc952d72b75c12d Mon Sep 17 00:00:00 2001 From: David Cermak Date: Thu, 27 Aug 2020 16:50:19 +0200 Subject: [PATCH] esp_http_server: Add httpd_ws_get_fd_info() API to check active WS clients Added a new API to WebSocket server to test provided socket descriptor if it belongs to active clients for this server and if websocket handshake has been performed Closes https://github.com/espressif/esp-idf/issues/5602 --- .../esp_http_server/include/esp_http_server.h | 13 +++++++++++++ components/esp_http_server/src/httpd_ws.c | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/components/esp_http_server/include/esp_http_server.h b/components/esp_http_server/include/esp_http_server.h index 0d936de88a..2eafca1839 100644 --- a/components/esp_http_server/include/esp_http_server.h +++ b/components/esp_http_server/include/esp_http_server.h @@ -1586,6 +1586,19 @@ esp_err_t httpd_ws_send_frame(httpd_req_t *req, httpd_ws_frame_t *pkt); */ esp_err_t httpd_ws_send_frame_async(httpd_handle_t hd, int fd, httpd_ws_frame_t *frame); +/** + * @brief Checks the supplied socket descriptor if it belongs to any active client + * of this server instance and if the websoket protocol is active + * + * @param[in] hd Server instance data + * @param[in] fd Socket descriptor + * @return + * - -1 : This fd is not a client of this httpd + * - 0 : This fd is an active client, protocol is not WS + * - 1 : This fd is an active client, protocol is WS + */ +int httpd_ws_get_fd_info(httpd_handle_t hd, int fd) + #endif /* CONFIG_HTTPD_WS_SUPPORT */ /** End of WebSocket related stuff * @} diff --git a/components/esp_http_server/src/httpd_ws.c b/components/esp_http_server/src/httpd_ws.c index a6af5c5d9e..07b9824a26 100644 --- a/components/esp_http_server/src/httpd_ws.c +++ b/components/esp_http_server/src/httpd_ws.c @@ -383,4 +383,15 @@ esp_err_t httpd_ws_get_frame_type(httpd_req_t *req) return ESP_OK; } +int httpd_ws_get_fd_info(httpd_handle_t hd, int fd) +{ + struct sock_db *sess = httpd_sess_get(hd, fd); + + if (sess == NULL) { + return -1; + } + bool is_active_ws = sess->ws_handshake_done && (!sess->ws_close); + return is_active_ws ? 1 : 0; +} + #endif /* CONFIG_HTTPD_WS_SUPPORT */