From 82b3cc18260abc8e77375c337cf3f62aafb132ab Mon Sep 17 00:00:00 2001 From: Matus Fabian <matfabia@cisco.com> Date: Thu, 21 Nov 2024 17:01:45 +0100 Subject: http: connection upgrade mechanism Handle "Connection" and "Upgrade" headers in http transport layer which are used to create a tunnel for some other protocol on the same connection. Type: improvement Change-Id: Icf5479f36fbcc7259b157eaad957211be5ea2aae Signed-off-by: Matus Fabian <matfabia@cisco.com> --- src/plugins/hs_apps/http_client.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) (limited to 'src/plugins/hs_apps/http_client.c') diff --git a/src/plugins/hs_apps/http_client.c b/src/plugins/hs_apps/http_client.c index a86bf1f3db3..cfa5e9c1001 100644 --- a/src/plugins/hs_apps/http_client.c +++ b/src/plugins/hs_apps/http_client.c @@ -38,6 +38,12 @@ typedef struct http_msg_t msg; } hc_worker_t; +typedef struct +{ + u8 *name; + u8 *value; +} hc_http_header_t; + typedef struct { u32 app_index; @@ -52,7 +58,7 @@ typedef struct u8 *resp_headers; u8 *http_response; u8 *response_status; - http_header_ht_t *custom_header; + hc_http_header_t *custom_header; u8 is_file; u8 use_ptr; u8 *filename; @@ -181,7 +187,7 @@ hc_session_connected_callback (u32 app_index, u32 hc_session_index, hc_main_t *hcm = &hc_main; hc_worker_t *wrk; u32 new_hc_index; - http_header_ht_t *header; + hc_http_header_t *header; HTTP_DBG (1, "ho hc_index: %d", hc_session_index); if (err) @@ -344,7 +350,6 @@ hc_rx_callback (session_t *s) format (0, "%U", format_http_status_code, msg.code); svm_fifo_dequeue_drop (s->rx_fifo, msg.data.headers_offset); - http_header_table_t *ht; vec_validate (hcm->resp_headers, msg.data.headers_len - 1); vec_set_len (hcm->resp_headers, msg.data.headers_len); rv = svm_fifo_dequeue (s->rx_fifo, msg.data.headers_len, @@ -352,14 +357,6 @@ hc_rx_callback (session_t *s) ASSERT (rv == msg.data.headers_len); HTTP_DBG (1, (char *) format (0, "%v", hcm->resp_headers)); - if (http_parse_headers (hcm->resp_headers, &ht)) - { - clib_warning ("invalid headers received"); - vlib_process_signal_event_mt ( - wrk->vlib_main, hcm->cli_node_index, HC_GENERIC_ERR, 0); - return -1; - } - http_free_header_table (ht); msg.data.body_offset -= msg.data.headers_len + msg.data.headers_offset; } @@ -666,7 +663,7 @@ hc_cleanup () HTTP_DBG (1, "cleanup"); hc_main_t *hcm = &hc_main; hc_worker_t *wrk; - http_header_ht_t *header; + hc_http_header_t *header; vec_foreach (wrk, hcm->wrk) hcc_worker_cleanup (wrk); @@ -696,7 +693,7 @@ hc_command_fn (vlib_main_t *vm, unformat_input_t *input, unformat_input_t _line_input, *line_input = &_line_input; u8 *path = 0; u8 *file_data; - http_header_ht_t new_header; + hc_http_header_t new_header; u8 *name; u8 *value; int rv; -- cgit