http_static: url handler POST improvement 88/42788/2
authorMatus Fabian <[email protected]>
Fri, 11 Apr 2025 09:15:52 +0000 (05:15 -0400)
committerFlorin Coras <[email protected]>
Fri, 11 Apr 2025 19:01:12 +0000 (19:01 +0000)
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 <[email protected]>
src/plugins/http_static/static_server.c

index c21658c..4478fa4 100644 (file)
@@ -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)
 {