aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/hs_apps
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/hs_apps')
-rw-r--r--src/plugins/hs_apps/http_cli.c34
-rw-r--r--src/plugins/hs_apps/http_client.c33
-rw-r--r--src/plugins/hs_apps/http_client_cli.c16
-rw-r--r--src/plugins/hs_apps/http_tps.c35
-rw-r--r--src/plugins/hs_apps/proxy.c42
-rw-r--r--src/plugins/hs_apps/proxy.h3
-rw-r--r--src/plugins/hs_apps/vcl/vcl_test_protos.c13
7 files changed, 84 insertions, 92 deletions
diff --git a/src/plugins/hs_apps/http_cli.c b/src/plugins/hs_apps/http_cli.c
index d670ae6b369..531e2750c1e 100644
--- a/src/plugins/hs_apps/http_cli.c
+++ b/src/plugins/hs_apps/http_cli.c
@@ -52,7 +52,8 @@ typedef struct
u32 tx_offset;
u32 vpp_session_index;
http_header_table_t req_headers;
- http_header_t *resp_headers;
+ http_headers_ctx_t resp_headers;
+ u8 *resp_headers_buf;
} hcs_session_t;
typedef struct
@@ -92,6 +93,7 @@ hcs_session_alloc (u32 thread_index)
memset (hs, 0, sizeof (*hs));
hs->session_index = hs - hcm->sessions[thread_index];
hs->thread_index = thread_index;
+ vec_validate (hs->resp_headers_buf, 255);
return hs;
}
@@ -172,21 +174,10 @@ start_send_data (hcs_session_t *hs, http_status_code_t status)
{
http_msg_t msg;
session_t *ts;
- u8 *headers_buf = 0;
int rv;
- if (vec_len (hs->resp_headers))
- {
- headers_buf = http_serialize_headers (hs->resp_headers);
- vec_reset_length (hs->resp_headers);
- msg.data.headers_offset = 0;
- msg.data.headers_len = vec_len (headers_buf);
- }
- else
- {
- msg.data.headers_offset = 0;
- msg.data.headers_len = 0;
- }
+ msg.data.headers_offset = 0;
+ msg.data.headers_len = hs->resp_headers.tail_offset;
msg.type = HTTP_MSG_REPLY;
msg.code = status;
@@ -201,9 +192,9 @@ start_send_data (hcs_session_t *hs, http_status_code_t status)
if (msg.data.headers_len)
{
- rv = svm_fifo_enqueue (ts->tx_fifo, vec_len (headers_buf), headers_buf);
+ rv = svm_fifo_enqueue (ts->tx_fifo, msg.data.headers_len,
+ hs->resp_headers.buf);
ASSERT (rv == msg.data.headers_len);
- vec_free (headers_buf);
}
if (!msg.data.body_len)
@@ -245,8 +236,7 @@ send_data_to_http (void *rpc_args)
if (args->plain_text)
type = HTTP_CONTENT_TEXT_PLAIN;
- http_add_header (&hs->resp_headers,
- http_header_name_token (HTTP_HEADER_CONTENT_TYPE),
+ http_add_header (&hs->resp_headers, HTTP_HEADER_CONTENT_TYPE,
http_content_type_token (type));
start_send_data (hs, HTTP_STATUS_OK);
@@ -371,7 +361,8 @@ hcs_ts_rx_callback (session_t *ts)
hs = hcs_session_get (ts->thread_index, ts->opaque);
hs->tx_buf = 0;
- vec_reset_length (hs->resp_headers);
+ http_init_headers_ctx (&hs->resp_headers, hs->resp_headers_buf,
+ vec_len (hs->resp_headers_buf));
http_reset_header_table (&hs->req_headers);
/* Read the http message header */
@@ -380,8 +371,7 @@ hcs_ts_rx_callback (session_t *ts)
if (msg.type != HTTP_MSG_REQUEST || msg.method_type != HTTP_REQ_GET)
{
- http_add_header (&hs->resp_headers,
- http_header_name_token (HTTP_HEADER_ALLOW),
+ http_add_header (&hs->resp_headers, HTTP_HEADER_ALLOW,
http_token_lit ("GET"));
start_send_data (hs, HTTP_STATUS_METHOD_NOT_ALLOWED);
goto done;
@@ -540,7 +530,7 @@ hcs_ts_cleanup_callback (session_t *s, session_cleanup_ntf_t ntf)
return;
vec_free (hs->tx_buf);
- vec_free (hs->resp_headers);
+ vec_free (hs->resp_headers_buf);
http_free_header_table (&hs->req_headers);
hcs_session_free (hs);
}
diff --git a/src/plugins/hs_apps/http_client.c b/src/plugins/hs_apps/http_client.c
index 91ac6cf0032..20271fc4aea 100644
--- a/src/plugins/hs_apps/http_client.c
+++ b/src/plugins/hs_apps/http_client.c
@@ -6,7 +6,6 @@
#include <vnet/session/application_interface.h>
#include <vnet/session/session.h>
#include <http/http.h>
-#include <http/http_header_names.h>
#include <http/http_content_types.h>
#include <http/http_status_codes.h>
#include <vppinfra/unix.h>
@@ -34,7 +33,7 @@ typedef struct
u32 thread_index;
vlib_main_t *vlib_main;
u8 *headers_buf;
- http_header_t *req_headers;
+ http_headers_ctx_t req_headers;
http_msg_t msg;
} hc_worker_t;
@@ -155,9 +154,9 @@ hc_request (session_t *s, session_error_t err)
rv = svm_fifo_enqueue (s->tx_fifo, vec_len (hcm->target), hcm->target);
ASSERT (rv == vec_len (hcm->target));
- rv = svm_fifo_enqueue (s->tx_fifo, vec_len (wrk->headers_buf),
+ rv = svm_fifo_enqueue (s->tx_fifo, wrk->req_headers.tail_offset,
wrk->headers_buf);
- ASSERT (rv == wrk->msg.data.headers_len);
+ ASSERT (rv == wrk->req_headers.tail_offset);
if (hcm->req_method == HTTP_REQ_POST)
{
@@ -214,22 +213,22 @@ hc_session_connected_callback (u32 app_index, u32 hc_session_index,
{
if (hcm->is_file)
http_add_header (
- &wrk->req_headers, http_header_name_token (HTTP_HEADER_CONTENT_TYPE),
+ &wrk->req_headers, HTTP_HEADER_CONTENT_TYPE,
http_content_type_token (HTTP_CONTENT_APP_OCTET_STREAM));
else
http_add_header (
- &wrk->req_headers, http_header_name_token (HTTP_HEADER_CONTENT_TYPE),
+ &wrk->req_headers, HTTP_HEADER_CONTENT_TYPE,
http_content_type_token (HTTP_CONTENT_APP_X_WWW_FORM_URLENCODED));
}
+ http_add_header (&wrk->req_headers, HTTP_HEADER_ACCEPT, "*", 1);
vec_foreach (header, hcm->custom_header)
- http_add_header (&wrk->req_headers, (const char *) header->name,
- vec_len (header->name), (const char *) header->value,
- vec_len (header->value));
-
- wrk->headers_buf = http_serialize_headers (wrk->req_headers);
- vec_free (wrk->req_headers);
+ http_add_custom_header (
+ &wrk->req_headers, (const char *) header->name, vec_len (header->name),
+ (const char *) header->value, vec_len (header->value));
+ clib_warning ("%U", format_http_bytes, wrk->headers_buf,
+ wrk->req_headers.tail_offset);
wrk->msg.method_type = hcm->req_method;
if (hcm->req_method == HTTP_REQ_POST)
wrk->msg.data.body_len = vec_len (hcm->data);
@@ -240,7 +239,7 @@ hc_session_connected_callback (u32 app_index, u32 hc_session_index,
/* request target */
wrk->msg.data.target_path_len = vec_len (hcm->target);
/* custom headers */
- wrk->msg.data.headers_len = vec_len (wrk->headers_buf);
+ wrk->msg.data.headers_len = wrk->req_headers.tail_offset;
/* total length */
wrk->msg.data.len = wrk->msg.data.target_path_len +
wrk->msg.data.headers_len + wrk->msg.data.body_len;
@@ -621,7 +620,13 @@ hc_run (vlib_main_t *vm)
num_threads = 1 /* main thread */ + vtm->n_threads;
vec_validate (hcm->wrk, num_threads - 1);
vec_foreach (wrk, hcm->wrk)
- wrk->thread_index = wrk - hcm->wrk;
+ {
+ wrk->thread_index = wrk - hcm->wrk;
+ /* 4k for headers should be enough */
+ vec_validate (wrk->headers_buf, 4095);
+ http_init_headers_ctx (&wrk->req_headers, wrk->headers_buf,
+ vec_len (wrk->headers_buf));
+ }
if ((err = hc_attach ()))
return clib_error_return (0, "http client attach: %U", format_clib_error,
diff --git a/src/plugins/hs_apps/http_client_cli.c b/src/plugins/hs_apps/http_client_cli.c
index 3c50e24c9fd..4ee3b49444c 100644
--- a/src/plugins/hs_apps/http_client_cli.c
+++ b/src/plugins/hs_apps/http_client_cli.c
@@ -16,7 +16,6 @@
#include <vnet/session/application_interface.h>
#include <vnet/session/session.h>
#include <http/http.h>
-#include <http/http_header_names.h>
#include <http/http_content_types.h>
#include <http/http_status_codes.h>
@@ -37,7 +36,6 @@ typedef struct
u32 vpp_session_index;
u64 to_recv;
u8 is_closed;
- http_header_t *req_headers;
} hcc_session_t;
typedef struct
@@ -131,9 +129,10 @@ hcc_ts_connected_callback (u32 app_index, u32 hc_index, session_t *as,
hcc_session_t *hs, *new_hs;
hcc_worker_t *wrk;
http_msg_t msg;
- u8 *headers_buf;
+ u8 *headers_buf = 0;
u32 new_hs_index;
int rv;
+ http_headers_ctx_t headers;
HCC_DBG ("ho hc_index: %d", hc_index);
@@ -157,11 +156,10 @@ hcc_ts_connected_callback (u32 app_index, u32 hc_index, session_t *as,
HCC_DBG ("new hc_index: %d", new_hs->session_index);
as->opaque = new_hs_index;
- http_add_header (&new_hs->req_headers,
- http_header_name_token (HTTP_HEADER_ACCEPT),
+ vec_validate (headers_buf, 63);
+ http_init_headers_ctx (&headers, headers_buf, vec_len (headers_buf));
+ http_add_header (&headers, HTTP_HEADER_ACCEPT,
http_content_type_token (HTTP_CONTENT_TEXT_HTML));
- headers_buf = http_serialize_headers (new_hs->req_headers);
- vec_free (new_hs->req_headers);
msg.type = HTTP_MSG_REQUEST;
msg.method_type = HTTP_REQ_GET;
@@ -170,7 +168,7 @@ hcc_ts_connected_callback (u32 app_index, u32 hc_index, session_t *as,
msg.data.target_path_len = vec_len (hcm->http_query);
/* custom headers */
msg.data.headers_offset = msg.data.target_path_len;
- msg.data.headers_len = vec_len (headers_buf);
+ msg.data.headers_len = headers.tail_offset;
/* request body */
msg.data.body_len = 0;
/* data type and total length */
@@ -180,7 +178,7 @@ hcc_ts_connected_callback (u32 app_index, u32 hc_index, session_t *as,
svm_fifo_seg_t segs[3] = { { (u8 *) &msg, sizeof (msg) },
{ hcm->http_query, vec_len (hcm->http_query) },
- { headers_buf, vec_len (headers_buf) } };
+ { headers_buf, msg.data.headers_len } };
rv = svm_fifo_enqueue_segments (as->tx_fifo, segs, 3, 0 /* allow partial */);
vec_free (headers_buf);
diff --git a/src/plugins/hs_apps/http_tps.c b/src/plugins/hs_apps/http_tps.c
index f4ef808e410..59a0309e363 100644
--- a/src/plugins/hs_apps/http_tps.c
+++ b/src/plugins/hs_apps/http_tps.c
@@ -17,7 +17,6 @@
#include <vnet/session/application_interface.h>
#include <vnet/session/session.h>
#include <http/http.h>
-#include <http/http_header_names.h>
#include <http/http_content_types.h>
#define HTS_RX_BUF_SIZE (64 << 10)
@@ -41,7 +40,8 @@ typedef struct
};
u8 *uri;
u8 *rx_buf;
- http_header_t *resp_headers;
+ http_headers_ctx_t resp_headers;
+ u8 *resp_headers_buf;
} hts_session_t;
typedef struct hts_listen_cfg_
@@ -86,6 +86,7 @@ hts_session_alloc (u32 thread_index)
pool_get_zero (htm->sessions[thread_index], hs);
hs->session_index = hs - htm->sessions[thread_index];
hs->thread_index = thread_index;
+ vec_validate (hs->resp_headers_buf, 255);
return hs;
}
@@ -111,6 +112,7 @@ hts_session_free (hts_session_t *hs)
clib_warning ("Freeing session %u", hs->session_index);
vec_free (hs->rx_buf);
+ vec_free (hs->resp_headers_buf);
if (CLIB_DEBUG)
clib_memset (hs, 0xfa, sizeof (*hs));
@@ -233,26 +235,20 @@ hts_start_send_data (hts_session_t *hs, http_status_code_t status)
{
http_msg_t msg;
session_t *ts;
- u8 *headers_buf = 0;
u32 n_segs = 1;
svm_fifo_seg_t seg[2];
int rv;
- if (vec_len (hs->resp_headers))
+ msg.data.headers_offset = 0;
+ msg.data.headers_len = 0;
+
+ if (hs->resp_headers.tail_offset)
{
- headers_buf = http_serialize_headers (hs->resp_headers);
- vec_free (hs->resp_headers);
- msg.data.headers_offset = 0;
- msg.data.headers_len = vec_len (headers_buf);
- seg[1].data = headers_buf;
+ msg.data.headers_len = hs->resp_headers.tail_offset;
+ seg[1].data = hs->resp_headers_buf;
seg[1].len = msg.data.headers_len;
n_segs = 2;
}
- else
- {
- msg.data.headers_offset = 0;
- msg.data.headers_len = 0;
- }
msg.type = HTTP_MSG_REPLY;
msg.code = status;
@@ -266,7 +262,6 @@ hts_start_send_data (hts_session_t *hs, http_status_code_t status)
ts = session_get (hs->vpp_session_index, hs->thread_index);
rv = svm_fifo_enqueue_segments (ts->tx_fifo, seg, n_segs,
0 /* allow partial */);
- vec_free (headers_buf);
ASSERT (rv == (sizeof (msg) + msg.data.headers_len));
if (!msg.data.body_len)
@@ -320,8 +315,7 @@ try_test_file (hts_session_t *hs, u8 *target)
}
}
- http_add_header (&hs->resp_headers,
- http_header_name_token (HTTP_HEADER_CONTENT_TYPE),
+ http_add_header (&hs->resp_headers, HTTP_HEADER_CONTENT_TYPE,
http_content_type_token (HTTP_CONTENT_APP_OCTET_STREAM));
hts_start_send_data (hs, HTTP_STATUS_OK);
@@ -380,9 +374,9 @@ hts_ts_rx_callback (session_t *ts)
if (hs->left_recv == 0)
{
hs->data_len = 0;
- hs->resp_headers = 0;
hs->rx_buf = 0;
-
+ http_init_headers_ctx (&hs->resp_headers, hs->resp_headers_buf,
+ vec_len (hs->resp_headers_buf));
/* Read the http message header */
rv = svm_fifo_dequeue (ts->rx_fifo, sizeof (msg), (u8 *) &msg);
ASSERT (rv == sizeof (msg));
@@ -394,8 +388,7 @@ hts_ts_rx_callback (session_t *ts)
}
if (msg.method_type != HTTP_REQ_GET && msg.method_type != HTTP_REQ_POST)
{
- http_add_header (&hs->resp_headers,
- http_header_name_token (HTTP_HEADER_ALLOW),
+ http_add_header (&hs->resp_headers, HTTP_HEADER_ALLOW,
http_token_lit ("GET, POST"));
hts_start_send_data (hs, HTTP_STATUS_METHOD_NOT_ALLOWED);
goto done;
diff --git a/src/plugins/hs_apps/proxy.c b/src/plugins/hs_apps/proxy.c
index 38d96bbf5ac..1bcc1e85a17 100644
--- a/src/plugins/hs_apps/proxy.c
+++ b/src/plugins/hs_apps/proxy.c
@@ -63,32 +63,39 @@ proxy_session_side_ctx_get (proxy_worker_t *wrk, u32 ctx_index)
}
static_always_inline void
-proxy_send_http_resp (session_t *s, http_status_code_t sc, u8 *headers_buf)
+proxy_send_http_resp (session_t *s, http_status_code_t sc,
+ http_headers_ctx_t *headers)
{
http_msg_t msg;
int rv;
uword headers_ptr;
+ svm_fifo_seg_t seg[2];
+ u32 n_segs = 1;
ASSERT (s->thread_index == vlib_get_thread_index ());
+ msg.data.headers_len = 0;
+ if (headers)
+ {
+ msg.data.headers_len = headers->tail_offset;
+ headers_ptr = pointer_to_uword (headers->buf);
+ seg[1].data = (u8 *) &headers_ptr;
+ seg[1].len = sizeof (headers_ptr);
+ n_segs = 2;
+ }
msg.type = HTTP_MSG_REPLY;
msg.code = sc;
msg.data.type = HTTP_MSG_DATA_PTR;
- msg.data.headers_len = vec_len (headers_buf);
msg.data.len = msg.data.headers_len;
msg.data.headers_offset = 0;
msg.data.body_len = 0;
msg.data.body_offset = 0;
+ seg[0].data = (u8 *) &msg;
+ seg[0].len = sizeof (msg);
- headers_ptr = pointer_to_uword (headers_buf);
- svm_fifo_seg_t seg[2] = {
- { (u8 *) &msg, sizeof (msg) },
- { (u8 *) &headers_ptr, sizeof (headers_ptr) },
- };
-
- rv = svm_fifo_enqueue_segments (s->tx_fifo, seg, msg.data.len ? 2 : 1,
- 0 /* allow partial */);
- ASSERT (rv == (sizeof (msg) + (msg.data.len ? sizeof (headers_ptr) : 0)));
+ rv =
+ svm_fifo_enqueue_segments (s->tx_fifo, seg, n_segs, 0 /* allow partial */);
+ ASSERT (rv == (sizeof (msg) + (n_segs == 2 ? sizeof (headers_ptr) : 0)));
if (svm_fifo_set_event (s->tx_fifo))
session_program_tx_io_evt (s->handle, SESSION_IO_EVT_TX);
@@ -872,7 +879,7 @@ active_open_send_http_resp_rpc (void *arg)
session_get_from_handle (ps->ao.session_handle));
if (ao_tp == TRANSPORT_PROTO_UDP)
proxy_send_http_resp (po_s, HTTP_STATUS_SWITCHING_PROTOCOLS,
- pm->capsule_proto_header);
+ &pm->capsule_proto_header);
else
proxy_send_http_resp (po_s, HTTP_STATUS_OK, 0);
}
@@ -1469,8 +1476,6 @@ VLIB_CLI_COMMAND (proxy_create_command, static) = {
clib_error_t *
proxy_main_init (vlib_main_t * vm)
{
- http_header_t *headers = 0;
-
proxy_main_t *pm = &proxy_main;
pm->server_client_index = ~0;
pm->active_open_client_index = ~0;
@@ -1478,11 +1483,12 @@ proxy_main_init (vlib_main_t * vm)
pm->idle_timeout = 600; /* connect-proxy default idle timeout 10 minutes */
vec_validate (pm->client_sep, TRANSPORT_N_PROTOS - 1);
- http_add_header (&headers,
- http_header_name_token (HTTP_HEADER_CAPSULE_PROTOCOL),
+ vec_validate (pm->capsule_proto_header_buf, 10);
+ http_init_headers_ctx (&pm->capsule_proto_header,
+ pm->capsule_proto_header_buf,
+ vec_len (pm->capsule_proto_header_buf));
+ http_add_header (&pm->capsule_proto_header, HTTP_HEADER_CAPSULE_PROTOCOL,
http_token_lit (HTTP_BOOLEAN_TRUE));
- pm->capsule_proto_header = http_serialize_headers (headers);
- vec_free (headers);
return 0;
}
diff --git a/src/plugins/hs_apps/proxy.h b/src/plugins/hs_apps/proxy.h
index 814bebfe6cb..f26f4bf0ea2 100644
--- a/src/plugins/hs_apps/proxy.h
+++ b/src/plugins/hs_apps/proxy.h
@@ -90,7 +90,8 @@ typedef struct
u32 active_open_app_index; /**< active open index after attach */
u32 ckpair_index; /**< certkey pair index for tls */
- u8 *capsule_proto_header;
+ http_headers_ctx_t capsule_proto_header;
+ u8 *capsule_proto_header_buf;
/*
* Configuration params
diff --git a/src/plugins/hs_apps/vcl/vcl_test_protos.c b/src/plugins/hs_apps/vcl/vcl_test_protos.c
index da4b6997ec1..fd17c7b2c54 100644
--- a/src/plugins/hs_apps/vcl/vcl_test_protos.c
+++ b/src/plugins/hs_apps/vcl/vcl_test_protos.c
@@ -15,7 +15,6 @@
#include <hs_apps/vcl/vcl_test.h>
#include <http/http.h>
-#include <http/http_header_names.h>
#include <http/http_content_types.h>
typedef enum vcl_test_http_state_
@@ -1162,7 +1161,7 @@ vt_process_http_client_write_msg (vcl_test_session_t *ts, void *buf,
uint32_t nbytes)
{
http_msg_t msg;
- http_header_t *req_headers = 0;
+ http_headers_ctx_t req_headers;
u8 *headers_buf = 0;
u8 *target;
vcl_test_http_ctx_t *vcl_test_http_ctx = (vcl_test_http_ctx_t *) ts->opaque;
@@ -1207,11 +1206,11 @@ vt_process_http_client_write_msg (vcl_test_session_t *ts, void *buf,
else if (PREDICT_FALSE (vcl_test_http_ctx->test_state == VCL_TEST_HTTP_IDLE))
{
+ vec_validate (headers_buf, 63);
+ http_init_headers_ctx (&req_headers, headers_buf, vec_len (headers_buf));
http_add_header (
- &req_headers, http_header_name_token (HTTP_HEADER_CONTENT_TYPE),
+ &req_headers, HTTP_HEADER_CONTENT_TYPE,
http_content_type_token (HTTP_CONTENT_APP_OCTET_STREAM));
- headers_buf = http_serialize_headers (req_headers);
- vec_free (req_headers);
memset (&msg, 0, sizeof (http_msg_t));
msg.type = HTTP_MSG_REQUEST;
@@ -1223,7 +1222,7 @@ vt_process_http_client_write_msg (vcl_test_session_t *ts, void *buf,
/* headers */
msg.data.headers_offset = msg.data.target_path_len;
- msg.data.headers_len = vec_len (headers_buf);
+ msg.data.headers_len = req_headers.tail_offset;
/* body */
msg.data.body_offset = msg.data.headers_offset + msg.data.headers_len;
@@ -1236,7 +1235,7 @@ vt_process_http_client_write_msg (vcl_test_session_t *ts, void *buf,
vppcom_data_segment_t segs[3] = { { (u8 *) &msg, sizeof (msg) },
{ target, strlen ((char *) target) },
{ headers_buf,
- vec_len (headers_buf) } };
+ msg.data.headers_len } };
do
{