From edd38f6ccd71d80a7875258876fd1d4900167aea Mon Sep 17 00:00:00 2001 From: "Deomid \"rojer\" Ryabkov" Date: Fri, 5 Mar 2021 23:32:27 +0000 Subject: [PATCH] mongoose: Read file data directly into send_mbuf Reduces stack usage and avoids an extra copy --- mongoose.c | 18 +++++++++++------- src/mg_http.c | 18 +++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/mongoose.c b/mongoose.c index e2d9e0df..e7be5e00 100644 --- a/mongoose.c +++ b/mongoose.c @@ -6165,8 +6165,7 @@ struct mg_str *mg_get_http_header(struct http_message *hm, const char *name) { #if MG_ENABLE_FILESYSTEM static void mg_http_transfer_file_data(struct mg_connection *nc) { struct mg_http_proto_data *pd = mg_http_get_proto_data(nc); - char buf[MG_MAX_HTTP_SEND_MBUF]; - size_t n = 0, to_read = 0, left = (size_t)(pd->file.cl - pd->file.sent); + size_t to_read = 0, left = (size_t)(pd->file.cl - pd->file.sent); if (pd->file.type == DATA_FILE) { struct mbuf *io = &nc->send_mbuf; @@ -6179,11 +6178,16 @@ static void mg_http_transfer_file_data(struct mg_connection *nc) { to_read = left; } if (to_read > 0) { - n = mg_fread(buf, 1, to_read, pd->file.fp); - if (n > 0) { - mg_send(nc, buf, n); - pd->file.sent += n; - DBG(("%p sent %d (total %d)", nc, (int) n, (int) pd->file.sent)); + size_t new_size = io->len + to_read; + mbuf_resize(io, new_size); + if (io->size == new_size) { + char *buf = io->buf + io->len; + size_t n = mg_fread(buf, 1, to_read, pd->file.fp); + if (n > 0) { + io->len += n; + pd->file.sent += n; + DBG(("%p sent %d (total %d)", nc, (int) n, (int) pd->file.sent)); + } } } else { /* Rate-limited */ diff --git a/src/mg_http.c b/src/mg_http.c index fb57d6a3..02e446d7 100644 --- a/src/mg_http.c +++ b/src/mg_http.c @@ -521,8 +521,7 @@ struct mg_str *mg_get_http_header(struct http_message *hm, const char *name) { #if MG_ENABLE_FILESYSTEM static void mg_http_transfer_file_data(struct mg_connection *nc) { struct mg_http_proto_data *pd = mg_http_get_proto_data(nc); - char buf[MG_MAX_HTTP_SEND_MBUF]; - size_t n = 0, to_read = 0, left = (size_t)(pd->file.cl - pd->file.sent); + size_t to_read = 0, left = (size_t)(pd->file.cl - pd->file.sent); if (pd->file.type == DATA_FILE) { struct mbuf *io = &nc->send_mbuf; @@ -535,11 +534,16 @@ static void mg_http_transfer_file_data(struct mg_connection *nc) { to_read = left; } if (to_read > 0) { - n = mg_fread(buf, 1, to_read, pd->file.fp); - if (n > 0) { - mg_send(nc, buf, n); - pd->file.sent += n; - DBG(("%p sent %d (total %d)", nc, (int) n, (int) pd->file.sent)); + size_t new_size = io->len + to_read; + mbuf_resize(io, new_size); + if (io->size == new_size) { + char *buf = io->buf + io->len; + size_t n = mg_fread(buf, 1, to_read, pd->file.fp); + if (n > 0) { + io->len += n; + pd->file.sent += n; + DBG(("%p sent %d (total %d)", nc, (int) n, (int) pd->file.sent)); + } } } else { /* Rate-limited */