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)
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()
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);
}
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++;
}
}
- 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);
}
{
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,