From 0ef074a91ebfa1da3fbb0c89ab45d08b8f3d0080 Mon Sep 17 00:00:00 2001 From: Andrew Titmuss Date: Thu, 25 Apr 2024 20:37:46 +1000 Subject: [PATCH 1/7] http_server: fix keep-alive for http/1.1 requests This patch moves the initialisation of a HTTP/1.1 stream from the session initialisation to the session ingestion step. Previously, using keep-alive on HTTP/1.1 would panic on the second request, as it would attempt to use components like the header map that are destroyed after each stream, but only initialised at the start of the session, when the HTTP protocol autodetection was run. Signed-off-by: Andrew Titmuss --- src/http_server/flb_http_server_http1.c | 36 ++++++++++++------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/http_server/flb_http_server_http1.c b/src/http_server/flb_http_server_http1.c index f5e2d735dae..9f5fbdd4b53 100644 --- a/src/http_server/flb_http_server_http1.c +++ b/src/http_server/flb_http_server_http1.c @@ -432,16 +432,6 @@ int flb_http1_response_set_body(struct flb_http_response *response, int flb_http1_server_session_init(struct flb_http1_server_session *session, struct flb_http_server_session *parent) { - void *user_data; - int result; - - if (parent != NULL && parent->parent != NULL) { - user_data = parent->parent->user_data; - } - else { - user_data = NULL; - } - session->initialized = FLB_TRUE; dummy_mk_http_session_init(&session->inner_session, &session->inner_server); @@ -450,13 +440,6 @@ int flb_http1_server_session_init(struct flb_http1_server_session *session, mk_http_parser_init(&session->inner_parser); - result = flb_http_stream_init(&session->stream, parent, 0, HTTP_STREAM_ROLE_SERVER, - user_data); - - if (result != 0) { - return -1; - } - session->parent = parent; return 0; @@ -475,11 +458,26 @@ void flb_http1_server_session_destroy(struct flb_http1_server_session *session) } } -int flb_http1_server_session_ingest(struct flb_http1_server_session *session, +int flb_http1_server_session_ingest(struct flb_http1_server_session *session, unsigned char *buffer, size_t length) { - int result; + void *user_data; + int result; + + if (session->parent != NULL && session->parent->parent != NULL) { + user_data = session->parent->parent->user_data; + } + else { + user_data = NULL; + } + + result = flb_http_stream_init(&session->stream, session->parent, 0, HTTP_STREAM_ROLE_SERVER, + user_data); + + if (result != 0) { + return HTTP_SERVER_PROVIDER_ERROR; + } result = mk_http_parser(&session->inner_request, &session->inner_parser, From 1237efff9486cec32e854e5b1c5a2a185ffc8f6e Mon Sep 17 00:00:00 2001 From: Andrew Titmuss Date: Thu, 25 Apr 2024 20:50:59 +1000 Subject: [PATCH 2/7] in_http: enable keep-alive This patch stops the forced connection-close for requests that aren't HTTP/2 on the in_http plugin Signed-off-by: Andrew Titmuss --- plugins/in_http/http.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/in_http/http.c b/plugins/in_http/http.c index 62f355ba293..2aa777cc490 100644 --- a/plugins/in_http/http.c +++ b/plugins/in_http/http.c @@ -96,7 +96,7 @@ static int in_http_init(struct flb_input_instance *ins, if (ctx->enable_http2) { ret = flb_http_server_init(&ctx->http_server, HTTP_PROTOCOL_AUTODETECT, - FLB_HTTP_SERVER_FLAG_AUTO_INFLATE, + (FLB_HTTP_SERVER_FLAG_KEEPALIVE | FLB_HTTP_SERVER_FLAG_AUTO_INFLATE), NULL, ins->host.listen, ins->host.port, From 61b5928b86d3e6ea2f4c839f72f4fa1928c46d0c Mon Sep 17 00:00:00 2001 From: Andrew Titmuss Date: Thu, 25 Apr 2024 20:53:02 +1000 Subject: [PATCH 3/7] in_elasticsearch: enable keep-alive This patch stops the forced connection-close for requests that aren't HTTP/2 on the in_elasticsearch plugin Signed-off-by: Andrew Titmuss --- plugins/in_elasticsearch/in_elasticsearch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/in_elasticsearch/in_elasticsearch.c b/plugins/in_elasticsearch/in_elasticsearch.c index d3963d7ff34..72096d19a06 100644 --- a/plugins/in_elasticsearch/in_elasticsearch.c +++ b/plugins/in_elasticsearch/in_elasticsearch.c @@ -139,7 +139,7 @@ static int in_elasticsearch_bulk_init(struct flb_input_instance *ins, if (ctx->enable_http2) { ret = flb_http_server_init(&ctx->http_server, HTTP_PROTOCOL_AUTODETECT, - FLB_HTTP_SERVER_FLAG_AUTO_INFLATE, + (FLB_HTTP_SERVER_FLAG_KEEPALIVE | FLB_HTTP_SERVER_FLAG_AUTO_INFLATE), NULL, ins->host.listen, ins->host.port, From 2890b8c26a003838cdb7a58ea3ced69f41ca9d1b Mon Sep 17 00:00:00 2001 From: Andrew Titmuss Date: Thu, 25 Apr 2024 20:54:04 +1000 Subject: [PATCH 4/7] in_opentelemetry: enable keep-alive This patch stops the forced connection-close for requests that aren't HTTP/2 on the in_opentelemetry plugin Signed-off-by: Andrew Titmuss --- plugins/in_opentelemetry/opentelemetry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/in_opentelemetry/opentelemetry.c b/plugins/in_opentelemetry/opentelemetry.c index e01eeacc936..fdaddffde68 100644 --- a/plugins/in_opentelemetry/opentelemetry.c +++ b/plugins/in_opentelemetry/opentelemetry.c @@ -93,7 +93,7 @@ static int in_opentelemetry_init(struct flb_input_instance *ins, if (ctx->enable_http2) { ret = flb_http_server_init(&ctx->http_server, HTTP_PROTOCOL_AUTODETECT, - FLB_HTTP_SERVER_FLAG_AUTO_INFLATE, + (FLB_HTTP_SERVER_FLAG_KEEPALIVE | FLB_HTTP_SERVER_FLAG_AUTO_INFLATE), NULL, ins->host.listen, ins->host.port, From 3a2f91f8292a526c5e88cf9d7e18d9e01e573fdb Mon Sep 17 00:00:00 2001 From: Andrew Titmuss Date: Thu, 25 Apr 2024 20:54:53 +1000 Subject: [PATCH 5/7] in_splunk: enable keep-alive This patch stops the forced connection-close for requests that aren't HTTP/2 on the in_splunk plugin Signed-off-by: Andrew Titmuss --- plugins/in_splunk/splunk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/in_splunk/splunk.c b/plugins/in_splunk/splunk.c index 0a1a37bd7cf..1511a8ff31d 100644 --- a/plugins/in_splunk/splunk.c +++ b/plugins/in_splunk/splunk.c @@ -97,7 +97,7 @@ static int in_splunk_init(struct flb_input_instance *ins, if (ctx->enable_http2) { ret = flb_http_server_init(&ctx->http_server, HTTP_PROTOCOL_AUTODETECT, - FLB_HTTP_SERVER_FLAG_AUTO_INFLATE, + (FLB_HTTP_SERVER_FLAG_KEEPALIVE | FLB_HTTP_SERVER_FLAG_AUTO_INFLATE), NULL, ins->host.listen, ins->host.port, From d0911e52453dbbaf8d815fe0a1046ffefb8f097b Mon Sep 17 00:00:00 2001 From: Andrew Titmuss Date: Tue, 30 Apr 2024 00:41:01 +1000 Subject: [PATCH 6/7] http_server: initialize request in process_request for http/1.1 This patch addresses feedback from @leonardo-albertovich, reducing how many components are being recreated on each new request for a single session. Now it only recreates the request object, rather than creating a new stream for each request of a session. It replaces my original fix in 0ef074a Signed-off-by: Andrew Titmuss --- src/flb_http_common.c | 7 +++- src/http_server/flb_http_server_http1.c | 43 ++++++++++++++++--------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/flb_http_common.c b/src/flb_http_common.c index fbd4273356c..f68d893cbcd 100644 --- a/src/flb_http_common.c +++ b/src/flb_http_common.c @@ -437,6 +437,11 @@ void flb_http_stream_destroy(struct flb_http_stream *stream) cfl_list_del(&stream->_head); } - flb_free(stream); + flb_http_request_destroy(&stream->request); + flb_http_response_destroy(&stream->response); + + if (stream->releasable) { + flb_free(stream); + } } } diff --git a/src/http_server/flb_http_server_http1.c b/src/http_server/flb_http_server_http1.c index 9f5fbdd4b53..8a3cc7d143b 100644 --- a/src/http_server/flb_http_server_http1.c +++ b/src/http_server/flb_http_server_http1.c @@ -138,6 +138,14 @@ static int http1_session_process_request(struct flb_http1_server_session *sessio struct mk_http_header *header; int result; + result = flb_http_request_init(&session->stream.request); + + if (result != 0) { + return -1; + } + + session->stream.request.stream = &session->stream; + if (session->inner_request.uri_processed.data != NULL) { session->stream.request.path = \ cfl_sds_create_len(session->inner_request.uri_processed.data, @@ -432,6 +440,15 @@ int flb_http1_response_set_body(struct flb_http_response *response, int flb_http1_server_session_init(struct flb_http1_server_session *session, struct flb_http_server_session *parent) { + void *user_data; + int result; + + if (parent != NULL && parent->parent != NULL) { + user_data = parent->parent->user_data; + } else { + user_data = NULL; + } + session->initialized = FLB_TRUE; dummy_mk_http_session_init(&session->inner_session, &session->inner_server); @@ -440,6 +457,13 @@ int flb_http1_server_session_init(struct flb_http1_server_session *session, mk_http_parser_init(&session->inner_parser); + result = flb_http_stream_init(&session->stream, parent, 0, HTTP_STREAM_ROLE_SERVER, + user_data); + + if (result != 0) { + return -1; + } + session->parent = parent; return 0; @@ -454,6 +478,8 @@ void flb_http1_server_session_destroy(struct flb_http1_server_session *session) session->inner_session.channel = NULL; } + flb_http_stream_destroy(&session->stream); + session->initialized = FLB_FALSE; } } @@ -462,22 +488,7 @@ int flb_http1_server_session_ingest(struct flb_http1_server_session *session, unsigned char *buffer, size_t length) { - void *user_data; - int result; - - if (session->parent != NULL && session->parent->parent != NULL) { - user_data = session->parent->parent->user_data; - } - else { - user_data = NULL; - } - - result = flb_http_stream_init(&session->stream, session->parent, 0, HTTP_STREAM_ROLE_SERVER, - user_data); - - if (result != 0) { - return HTTP_SERVER_PROVIDER_ERROR; - } + int result; result = mk_http_parser(&session->inner_request, &session->inner_parser, From 4020f68050829caca87a79ed7f389c9a75c54da0 Mon Sep 17 00:00:00 2001 From: Andrew Titmuss Date: Tue, 30 Apr 2024 00:48:37 +1000 Subject: [PATCH 7/7] http_server: fix formatting of if/else block Signed-off-by: Andrew Titmuss --- src/http_server/flb_http_server_http1.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/http_server/flb_http_server_http1.c b/src/http_server/flb_http_server_http1.c index 8a3cc7d143b..6a61d2a3e93 100644 --- a/src/http_server/flb_http_server_http1.c +++ b/src/http_server/flb_http_server_http1.c @@ -445,7 +445,8 @@ int flb_http1_server_session_init(struct flb_http1_server_session *session, if (parent != NULL && parent->parent != NULL) { user_data = parent->parent->user_data; - } else { + } + else { user_data = NULL; }