From 64a4e8d7cde13eeb0034bc2d835defef88d8f345 Mon Sep 17 00:00:00 2001 From: Matus Fabian Date: Fri, 11 Apr 2025 05:15:52 -0400 Subject: [PATCH] http_static: url handler POST improvement for POST request url handler expect data immediately after msg, but in case of http/2 this was broken because headers and data are different frames Type: improvement Change-Id: I32f93c3945c10c95a7d2150a9b60f79bac2a7e5a Signed-off-by: Matus Fabian --- src/plugins/http_static/static_server.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/plugins/http_static/static_server.c b/src/plugins/http_static/static_server.c index c21658ce925..4478fa4553e 100644 --- a/src/plugins/http_static/static_server.c +++ b/src/plugins/http_static/static_server.c @@ -32,6 +32,7 @@ hss_main_t hss_main; static int file_handler_discard_body (hss_session_t *hs, session_t *ts); +static int url_handler_wait_body (hss_session_t *hs, session_t *ts); static int hss_add_header (hss_session_t *hs, http_header_name_t name, const char *value, @@ -316,12 +317,9 @@ try_url_handler (hss_session_t *hs) if (hs->left_recv) { ts = session_get (hs->vpp_session_index, hs->thread_index); - /* TODO: add support for large content (use hs->read_body_handler) */ if (svm_fifo_max_dequeue (ts->rx_fifo) < hs->left_recv) { - hs->left_recv = 0; - start_send_data (hs, HTTP_STATUS_INTERNAL_ERROR); - hss_session_disconnect_transport (hs); + hs->read_body_handler = url_handler_wait_body; return 0; } vec_validate (data, hs->left_recv - 1); @@ -606,6 +604,23 @@ file_handler_discard_body (hss_session_t *hs, session_t *ts) return 0; } +static int +url_handler_wait_body (hss_session_t *hs, session_t *ts) +{ + /* TODO: add support for large content (buffer or stream data) */ + if (svm_fifo_max_dequeue (ts->rx_fifo) < hs->left_recv) + { + clib_warning ("not all data in fifo, max deq %u, left recv %u", + ts->rx_fifo, hs->left_recv); + hs->left_recv = 0; + start_send_data (hs, HTTP_STATUS_INTERNAL_ERROR); + hss_session_disconnect_transport (hs); + return 0; + } + hs->left_recv = 0; + return try_url_handler (hs); +} + static int hss_ts_rx_callback (session_t *ts) { -- 2.16.6