hsa: http client init wrk->vlib_main in setup 12/43012/2
authorMatus Fabian <[email protected]>
Mon, 26 May 2025 12:19:00 +0000 (08:19 -0400)
committerMatus Fabian <[email protected]>
Mon, 26 May 2025 14:55:03 +0000 (10:55 -0400)
Type: fix

Change-Id: I3f16900a05904d8896c8495531ac7ccbb44790ba
Signed-off-by: Matus Fabian <[email protected]>
extras/hs-test/http_test.go
src/plugins/hs_apps/http_client.c

index 37bdecf..4f3e852 100644 (file)
@@ -36,7 +36,8 @@ func init() {
                HttpClientErrRespTest, HttpClientPostFormTest, HttpClientGet128kbResponseTest, HttpClientGetResponseBodyTest,
                HttpClientGetTlsNoRespBodyTest, HttpClientPostFileTest, HttpClientPostFilePtrTest, HttpUnitTest,
                HttpRequestLineTest, HttpClientGetTimeout, HttpStaticFileHandlerWrkTest, HttpStaticUrlHandlerWrkTest, HttpConnTimeoutTest,
-               HttpClientGetRepeatTest, HttpClientPostRepeatTest, HttpIgnoreH2UpgradeTest, HttpInvalidAuthorityFormUriTest, HttpHeaderErrorConnectionDropTest)
+               HttpClientGetRepeatTest, HttpClientPostRepeatTest, HttpIgnoreH2UpgradeTest, HttpInvalidAuthorityFormUriTest, HttpHeaderErrorConnectionDropTest,
+               HttpClientInvalidHeaderNameTest)
        RegisterNoTopoSoloTests(HttpStaticPromTest, HttpGetTpsTest, HttpGetTpsInterruptModeTest, PromConcurrentConnectionsTest,
                PromMemLeakTest, HttpClientPostMemLeakTest, HttpInvalidClientRequestMemLeakTest, HttpPostTpsTest, HttpPostTpsInterruptModeTest,
                PromConsecutiveConnectionsTest, HttpGetTpsTlsTest, HttpPostTpsTlsTest, HttpClientGetRepeatMTTest, HttpClientPtrGetRepeatMTTest)
@@ -335,6 +336,53 @@ func HttpClientTest(s *NoTopoSuite) {
        s.AssertContains(o, "</html>", "</html> not found in the result!")
 }
 
+func HttpClientInvalidHeaderNameTest(s *NoTopoSuite) {
+       serverAddress := s.HostAddr()
+       l, err := net.Listen("tcp", serverAddress+":80")
+       s.AssertNil(err, fmt.Sprint(err))
+       defer l.Close()
+       go func() {
+               b := make([]byte, 512)
+               conn, err := l.Accept()
+               if err != nil {
+                       return
+               }
+               _, err = conn.Read(b)
+               if err != nil {
+                       return
+               }
+               _, err = conn.Write([]byte("HTTP/1.1 200 OK\r\n\xE0\x81\x9C\r\n\r\n"))
+               if err != nil {
+                       return
+               }
+       }()
+       uri := "http://" + serverAddress + "/index.html"
+       vpp := s.Containers.Vpp.VppInstance
+       o := vpp.Vppctl("http client uri " + uri + " timeout 5")
+       s.Log(o)
+       s.AssertContains(o, "transport closed")
+
+       /* wait until cleanup to be sure we don't crash */
+       httpCleanupDone := false
+       tcpSessionCleanupDone := false
+       for nTries := 0; nTries < 60; nTries++ {
+               o := vpp.Vppctl("show session verbose 2")
+               if !strings.Contains(o, "[T]") {
+                       tcpSessionCleanupDone = true
+               }
+               if !strings.Contains(o, "[H1]") {
+                       httpCleanupDone = true
+               }
+               if httpCleanupDone && tcpSessionCleanupDone {
+                       s.Log(o)
+                       break
+               }
+               time.Sleep(1 * time.Second)
+       }
+       s.AssertEqual(true, tcpSessionCleanupDone, "TCP session not cleanup")
+       s.AssertEqual(true, httpCleanupDone, "HTTP not cleanup")
+}
+
 func HttpClientErrRespTest(s *NoTopoSuite) {
        serverAddress := s.HostAddr()
        server := ghttp.NewUnstartedServer()
index 34c2a54..3f72dcc 100644 (file)
@@ -107,7 +107,6 @@ static inline hc_session_t *
 hc_session_get (u32 session_index, clib_thread_index_t thread_index)
 {
   hc_worker_t *wrk = hc_worker_get (thread_index);
-  wrk->vlib_main = vlib_get_main_by_index (thread_index);
   return pool_elt_at_index (wrk->sessions, session_index);
 }
 
@@ -197,16 +196,17 @@ hc_session_connected_callback (u32 app_index, u32 hc_session_index,
   hc_session_t *hc_session;
   hc_http_header_t *header;
 
+  wrk = hc_worker_get (s->thread_index);
+
   if (err)
     {
       clib_warning ("hc_session_index[%d] connected error: %U",
                    hc_session_index, format_session_error, err);
-      vlib_process_signal_event_mt (vlib_get_main (), hcm->cli_node_index,
+      vlib_process_signal_event_mt (wrk->vlib_main, hcm->cli_node_index,
                                    HC_CONNECT_FAILED, 0);
       return -1;
     }
 
-  wrk = hc_worker_get (s->thread_index);
   hc_session = hc_session_alloc (wrk);
   clib_spinlock_lock_if_init (&hcm->lock);
   hcm->connected_counter++;
@@ -285,8 +285,7 @@ hc_session_connected_callback (u32 app_index, u32 hc_session_index,
        }
     }
 
-  hc_session->stats.start =
-    vlib_time_now (vlib_get_main_by_index (s->thread_index));
+  hc_session->stats.start = vlib_time_now (wrk->vlib_main);
 
   return hc_request (s, wrk, hc_session, err);
 }
@@ -751,6 +750,7 @@ hc_run (vlib_main_t *vm)
     {
       wrk->has_common_headers = false;
       wrk->thread_index = wrk - hcm->wrk;
+      wrk->vlib_main = vlib_get_main_by_index (wrk->thread_index);
       /* 4k for headers should be enough */
       vec_validate (wrk->headers_buf, 4095);
       http_init_headers_ctx (&wrk->req_headers, wrk->headers_buf,