From da562e3fd6008cc8c6aac4a233d90230679d4a49 Mon Sep 17 00:00:00 2001 From: Glenn Strauss Date: Sat, 24 Jul 2021 12:37:22 -0400 Subject: [PATCH] [core] http_response_read() indicate resp finished return HANDLER_FINISHED from http_response_read() if response finished, whether due to reading EOF (prior behavior), or if Content-Length was provided and we have finished reading Content-Length, or if a module sets r->resp_body_finished for any other reason. This may save an unnecessary poll() and read() to receive EOF when Content-Length has already been read. --- src/http-header-glue.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/http-header-glue.c b/src/http-header-glue.c index 34f5755a..d4f0e7fa 100644 --- a/src/http-header-glue.c +++ b/src/http-header-glue.c @@ -1141,10 +1141,11 @@ handler_t http_response_parse_headers(request_st * const r, http_response_opts * handler_t http_response_read(request_st * const r, http_response_opts * const opts, buffer * const b, fdnode * const fdn) { const int fd = fdn->fd; - while (1) { - ssize_t n; - size_t avail = buffer_string_space(b); + ssize_t n; + size_t avail; + do { unsigned int toread = 0; + avail = buffer_string_space(b); if (0 == fdevent_ioctl_fionread(fd, opts->fdfmt, (int *)&toread)) { if (avail < toread) { @@ -1294,10 +1295,8 @@ handler_t http_response_read(request_st * const r, http_response_opts * const op break; } } + } while ((size_t)n == avail); + /* else emptied kernel read buffer or partial read */ - if ((size_t)n < avail) - break; /* emptied kernel read buffer or partial read */ - } - - return HANDLER_GO_ON; + return (!r->resp_body_finished ? HANDLER_GO_ON : HANDLER_FINISHED); }