From 0ae0adf4361beae3b0b0cd39ecf54f1001a2abb6 Mon Sep 17 00:00:00 2001 From: Matus Fabian Date: Mon, 26 May 2025 08:19:00 -0400 Subject: [PATCH] hsa: http client init wrk->vlib_main in setup Type: fix Change-Id: I3f16900a05904d8896c8495531ac7ccbb44790ba Signed-off-by: Matus Fabian --- extras/hs-test/http_test.go | 50 ++++++++++++++++++++++++++++++++++++++- src/plugins/hs_apps/http_client.c | 10 ++++---- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/extras/hs-test/http_test.go b/extras/hs-test/http_test.go index 37bdecff240..4f3e852ed62 100644 --- a/extras/hs-test/http_test.go +++ b/extras/hs-test/http_test.go @@ -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, "", " 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() diff --git a/src/plugins/hs_apps/http_client.c b/src/plugins/hs_apps/http_client.c index 34c2a545650..3f72dccfead 100644 --- a/src/plugins/hs_apps/http_client.c +++ b/src/plugins/hs_apps/http_client.c @@ -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, -- 2.16.6