http: notify client when connection failed 83/40883/2
authorMatus Fabian <[email protected]>
Mon, 13 May 2024 08:29:11 +0000 (10:29 +0200)
committerFlorin Coras <[email protected]>
Tue, 14 May 2024 22:38:23 +0000 (22:38 +0000)
Type: fix

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

index 63a5b8e..f52d281 100644 (file)
@@ -12,7 +12,7 @@ import (
 
 func init() {
        registerNsTests(HttpTpsTest)
-       registerVethTests(HttpCliTest)
+       registerVethTests(HttpCliTest, HttpCliConnectErrorTest)
        registerNoTopoTests(NginxHttp3Test, NginxAsServerTest,
                NginxPerfCpsTest, NginxPerfRpsTest, NginxPerfWrkTest, HeaderServerTest,
                HttpStaticMovedTest, HttpStaticNotFoundTest, HttpCliMethodNotAllowedTest,
@@ -58,6 +58,20 @@ func HttpCliTest(s *VethsSuite) {
        s.assertContains(o, "<html>", "<html> not found in the result!")
 }
 
+func HttpCliConnectErrorTest(s *VethsSuite) {
+       clientContainer := s.getContainerByName("client-vpp")
+
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
+
+       uri := "http://" + serverVeth.ip4AddressString() + "/80"
+
+       o := clientContainer.vppInstance.vppctl("http cli client" +
+               " uri " + uri + " query /show/vlib/graph")
+
+       s.log(o)
+       s.assertContains(o, "failed to connect")
+}
+
 func NginxHttp3Test(s *NoTopoSuite) {
        s.SkipUnlessExtendedTestsBuilt()
 
index 1a321bf..a99169b 100644 (file)
@@ -67,6 +67,7 @@ typedef enum
 {
   HCC_REPLY_RECEIVED = 100,
   HCC_TRANSPORT_CLOSED,
+  HCC_CONNECT_FAILED,
 } hcc_cli_signal_t;
 
 static hcc_main_t hcc_main;
@@ -135,6 +136,8 @@ hcc_ts_connected_callback (u32 app_index, u32 hc_index, session_t *as,
     {
       clib_warning ("connected error: hc_index(%d): %U", hc_index,
                    format_session_error, err);
+      vlib_process_signal_event_mt (hcm->vlib_main, hcm->cli_node_index,
+                                   HCC_CONNECT_FAILED, 0);
       return -1;
     }
 
@@ -425,6 +428,9 @@ hcc_run (vlib_main_t *vm, int print_output)
     case HCC_TRANSPORT_CLOSED:
       err = clib_error_return (0, "error, transport closed");
       break;
+    case HCC_CONNECT_FAILED:
+      err = clib_error_return (0, "failed to connect");
+      break;
     default:
       err = clib_error_return (0, "unexpected event %d", event_type);
       break;
index 59cb094..797be1b 100644 (file)
@@ -267,17 +267,21 @@ http_ts_connected_callback (u32 http_app_index, u32 ho_hc_index, session_t *ts,
   app_worker_t *app_wrk;
   int rv;
 
+  ho_hc = http_conn_get_w_thread (ho_hc_index, 0);
+  ASSERT (ho_hc->state == HTTP_CONN_STATE_CONNECTING);
+
   if (err)
     {
-      clib_warning ("ERROR: %d", err);
+      clib_warning ("half-open hc index %d, error: %U", ho_hc_index,
+                   format_session_error, err);
+      app_wrk = app_worker_get_if_valid (ho_hc->h_pa_wrk_index);
+      if (app_wrk)
+       app_worker_connect_notify (app_wrk, 0, err, ho_hc->h_pa_app_api_ctx);
       return 0;
     }
 
   new_hc_index = http_conn_alloc_w_thread (ts->thread_index);
   hc = http_conn_get_w_thread (new_hc_index, ts->thread_index);
-  ho_hc = http_conn_get_w_thread (ho_hc_index, 0);
-
-  ASSERT (ho_hc->state == HTTP_CONN_STATE_CONNECTING);
 
   clib_memcpy_fast (hc, ho_hc, sizeof (*hc));