From 30632c0c340f99de9c51c7a023ebe32c5ae2811a Mon Sep 17 00:00:00 2001 From: Anurag Kar Date: Tue, 9 Oct 2018 17:54:33 +0530 Subject: [PATCH] HTTP Server : Bug fixed in httpd_recv logic and updated function descriptions --- components/http_server/include/http_server.h | 5 +++-- components/http_server/src/httpd_txrx.c | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/components/http_server/include/http_server.h b/components/http_server/include/http_server.h index fa65dd32fb..dec25768df 100644 --- a/components/http_server/include/http_server.h +++ b/components/http_server/include/http_server.h @@ -378,6 +378,7 @@ typedef int (*httpd_send_func_t)(int sockfd, const char *buf, size_t buf_len, in * * @return * - Bytes : The number of bytes received successfully + * - 0 : Buffer length parameter is zero / connection closed by peer * - HTTPD_SOCK_ERR_INVALID : Invalid arguments * - HTTPD_SOCK_ERR_TIMEOUT : Timeout/interrupted while calling socket recv() * - HTTPD_SOCK_ERR_FAIL : Unrecoverable error while calling socket recv() @@ -480,8 +481,8 @@ int httpd_req_to_sockfd(httpd_req_t *r); * @param[in] buf_len Length of the buffer * * @return - * - Bytes : Number of bytes read into the buffer successfully - * - Zero : When no more data is left for read + * - Bytes : Number of bytes read into the buffer successfully + * - 0 : Buffer length parameter is zero / connection closed by peer * - HTTPD_SOCK_ERR_INVALID : Invalid arguments * - HTTPD_SOCK_ERR_TIMEOUT : Timeout/interrupted while calling socket recv() * - HTTPD_SOCK_ERR_FAIL : Unrecoverable error while calling socket recv() diff --git a/components/http_server/src/httpd_txrx.c b/components/http_server/src/httpd_txrx.c index 0d31eaed27..ed90cb75da 100644 --- a/components/http_server/src/httpd_txrx.c +++ b/components/http_server/src/httpd_txrx.c @@ -128,6 +128,15 @@ int httpd_recv_with_opt(httpd_req_t *r, char *buf, size_t buf_len, bool halt_aft int ret = ra->sd->recv_fn(ra->sd->fd, buf, buf_len, 0); if (ret < 0) { ESP_LOGD(TAG, LOG_FMT("error in recv_fn")); + if ((ret == HTTPD_SOCK_ERR_TIMEOUT) && (pending_len != 0)) { + /* If recv() timeout occurred, but pending data is + * present, return length of pending data. + * This behavior is similar to that of socket recv() + * function, which, in case has only partially read the + * requested length, due to timeout, returns with read + * length, rather than error */ + return pending_len; + } return ret; } -- 2.40.0