summaryrefslogtreecommitdiffstats
path: root/src/fluent-bit/tests/internal/http_client.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 12:08:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 12:08:18 +0000
commit5da14042f70711ea5cf66e034699730335462f66 (patch)
tree0f6354ccac934ed87a2d555f45be4c831cf92f4a /src/fluent-bit/tests/internal/http_client.c
parentReleasing debian version 1.44.3-2. (diff)
downloadnetdata-5da14042f70711ea5cf66e034699730335462f66.tar.xz
netdata-5da14042f70711ea5cf66e034699730335462f66.zip
Merging upstream version 1.45.3+dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/fluent-bit/tests/internal/http_client.c')
-rw-r--r--src/fluent-bit/tests/internal/http_client.c478
1 files changed, 478 insertions, 0 deletions
diff --git a/src/fluent-bit/tests/internal/http_client.c b/src/fluent-bit/tests/internal/http_client.c
new file mode 100644
index 000000000..a37daa355
--- /dev/null
+++ b/src/fluent-bit/tests/internal/http_client.c
@@ -0,0 +1,478 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+#include <fluent-bit/flb_info.h>
+#include <fluent-bit/flb_mem.h>
+#include <fluent-bit/flb_error.h>
+#include <fluent-bit/flb_socket.h>
+#include <fluent-bit/flb_http_client.h>
+
+#include "flb_tests_internal.h"
+
+struct test_ctx {
+ struct flb_upstream *u;
+ struct flb_connection *u_conn;
+ struct flb_config *config;
+};
+
+struct test_ctx* test_ctx_create()
+{
+ struct test_ctx *ret_ctx = NULL;
+
+ ret_ctx = flb_malloc(sizeof(struct test_ctx));
+ if (!TEST_CHECK(ret_ctx != NULL)) {
+ flb_errno();
+ TEST_MSG("flb_malloc(test_ctx) failed");
+ return NULL;
+ }
+ ret_ctx->u = NULL;
+ ret_ctx->u_conn = NULL;
+
+ ret_ctx->config = flb_config_init();
+ if(!TEST_CHECK(ret_ctx->config != NULL)) {
+ TEST_MSG("flb_config_init failed");
+ flb_free(ret_ctx);
+ return NULL;
+ }
+
+ ret_ctx->u = flb_upstream_create(ret_ctx->config, "127.0.0.1", 80, 0, NULL);
+ if (!TEST_CHECK(ret_ctx->u != NULL)) {
+ TEST_MSG("flb_upstream_create failed");
+ flb_config_exit(ret_ctx->config);
+ flb_free(ret_ctx);
+ return NULL;
+ }
+
+ ret_ctx->u_conn = flb_calloc(1, sizeof(struct flb_connection));
+ if(!TEST_CHECK(ret_ctx->u_conn != NULL)) {
+ flb_errno();
+ TEST_MSG("flb_malloc(flb_connection) failed");
+ flb_upstream_destroy(ret_ctx->u);
+ flb_config_exit(ret_ctx->config);
+ flb_free(ret_ctx);
+ return NULL;
+ }
+
+ ret_ctx->u_conn->upstream = ret_ctx->u;
+
+ return ret_ctx;
+}
+
+int test_ctx_destroy(struct test_ctx* ctx)
+{
+ if (!TEST_CHECK(ctx != NULL)) {
+ return -1;
+ }
+ if (ctx->u_conn) {
+ flb_free(ctx->u_conn);
+ }
+ if (ctx->u) {
+ flb_upstream_destroy(ctx->u);
+ }
+ if (ctx->config) {
+ flb_config_exit(ctx->config);
+ }
+
+ flb_free(ctx);
+ return 0;
+}
+
+void test_http_buffer_increase()
+{
+ int ret;
+ size_t s;
+ struct test_ctx *ctx;
+ struct flb_http_client *c;
+ struct flb_http_response *resp;
+
+ ctx = test_ctx_create();
+ if (!TEST_CHECK(ctx != NULL)) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create HTTP client instance */
+ c = flb_http_client(ctx->u_conn, FLB_HTTP_GET, "/", NULL, 0,
+ "127.0.0.1", 80, NULL, 0);
+ TEST_CHECK(c != NULL);
+
+ /* Do buffer tests */
+ resp = &c->resp;
+ TEST_CHECK(resp->data_len == 0);
+ TEST_CHECK(resp->data_size == FLB_HTTP_DATA_SIZE_MAX);
+ TEST_CHECK(resp->data_size_max == FLB_HTTP_DATA_SIZE_MAX);
+
+ /* Invalid size */
+ ret = flb_http_buffer_size(c, 1);
+ TEST_CHECK(ret == -1);
+
+ /* Increase max size to 8KB */
+ flb_http_buffer_size(c, 8192);
+
+ /* Request to allocate +4KB */
+ ret = flb_http_buffer_increase(c, 4096, &s);
+ TEST_CHECK(ret == 0);
+ TEST_CHECK(s == 4096);
+
+ /* Request to allocate 1 byte, it should fail */
+ ret = flb_http_buffer_increase(c, 1, &s);
+ TEST_CHECK(ret == -1);
+
+ /* Test unlimited */
+ flb_http_buffer_size(c, 0);
+ ret = flb_http_buffer_increase(c, 1, &s);
+ TEST_CHECK(ret == 0 && s == 1);
+
+ /* Payload test */
+ memcpy(c->resp.data, "00abc11def22ghi__PAYLOAD__8yz9900", 33);
+ c->resp.data[33] = '\0';
+ c->resp.data_len = 33;
+ c->resp.payload = c->resp.data + 15;
+ c->resp.payload_size = 11;
+
+ ret = flb_http_buffer_increase(c, 819200, &s);
+ TEST_CHECK(ret == 0);
+
+ ret = strncmp(c->resp.payload, "__PAYLOAD__", 11);
+ TEST_CHECK(ret == 0);
+
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+}
+
+void test_http_add_get_header()
+{
+ struct test_ctx *ctx;
+ struct flb_http_client *c;
+ flb_sds_t ret_str;
+ char *ua = "Fluent-Bit";
+ char *host = "127.0.0.1:80";
+ int ret;
+
+ ctx = test_ctx_create();
+ if (!TEST_CHECK(ctx != NULL)) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create HTTP client instance */
+ c = flb_http_client(ctx->u_conn, FLB_HTTP_GET, "/", NULL, 0,
+ "127.0.0.1", 80, NULL, 0);
+ if(!TEST_CHECK(c != NULL)) {
+ TEST_MSG("flb_http_client failed");
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Check User-Agent */
+ ret = flb_http_add_header(c, "User-Agent", 10, ua, strlen(ua));
+ TEST_CHECK(ret == 0);
+
+ ret_str = flb_http_get_header(c, "User-Agent", 10);
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_http_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, ua, strlen(ua)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, ua);
+ }
+ flb_sds_destroy(ret_str);
+
+
+ /* Check Host */
+ ret_str = flb_http_get_header(c, "Host", 4);
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_http_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, host, strlen(host)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, host);
+ }
+
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+}
+
+void test_http_set_keepalive()
+{
+ struct test_ctx *ctx;
+ struct flb_http_client *c;
+ flb_sds_t ret_str;
+ int ret;
+
+ ctx = test_ctx_create();
+ if (!TEST_CHECK(ctx != NULL)) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create HTTP client instance */
+ c = flb_http_client(ctx->u_conn, FLB_HTTP_GET, "/", NULL, 0,
+ "127.0.0.1", 80, NULL, 0);
+ if(!TEST_CHECK(c != NULL)) {
+ TEST_MSG("flb_http_client failed");
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Set keepalive header */
+ ret = flb_http_set_keepalive(c);
+ TEST_CHECK(ret == 0);
+
+ ret_str = flb_http_get_header(c, FLB_HTTP_HEADER_CONNECTION,
+ strlen(FLB_HTTP_HEADER_CONNECTION));
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Compare */
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, FLB_HTTP_HEADER_KA, strlen(FLB_HTTP_HEADER_KA)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, FLB_HTTP_HEADER_KA);
+ }
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+}
+
+void test_http_strip_port_from_host()
+{
+ struct test_ctx *ctx;
+ struct flb_http_client *c;
+ flb_sds_t ret_str;
+ char *host_port = "127.0.0.1:80";
+ char *host = "127.0.0.1";
+ int ret;
+
+ ctx = test_ctx_create();
+ if (!TEST_CHECK(ctx != NULL)) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create HTTP client instance */
+ c = flb_http_client(ctx->u_conn, FLB_HTTP_GET, "/", NULL, 0,
+ "127.0.0.1", 80, NULL, 0);
+ if(!TEST_CHECK(c != NULL)) {
+ TEST_MSG("flb_http_client failed");
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Check Host. It should contain port number */
+ ret_str = flb_http_get_header(c, "Host", 4);
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_http_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, host_port, strlen(host_port)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, host_port);
+ }
+ flb_sds_destroy(ret_str);
+
+
+ ret = flb_http_strip_port_from_host(c);
+ TEST_CHECK(ret == 0);
+
+ /* Check Host. Port number should be removed. */
+ ret_str = flb_http_get_header(c, "Host", 4);
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_http_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, host, strlen(host)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, host);
+ }
+
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+}
+
+void test_http_encoding_gzip()
+{
+ struct test_ctx *ctx;
+ struct flb_http_client *c;
+ flb_sds_t ret_str;
+ char *gzip = "gzip";
+ int ret;
+
+ ctx = test_ctx_create();
+ if (!TEST_CHECK(ctx != NULL)) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create HTTP client instance */
+ c = flb_http_client(ctx->u_conn, FLB_HTTP_GET, "/", NULL, 0,
+ "127.0.0.1", 80, NULL, 0);
+ if(!TEST_CHECK(c != NULL)) {
+ TEST_MSG("flb_http_client failed");
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Check encoding. It should be error */
+ ret_str = flb_http_get_header(c, FLB_HTTP_HEADER_CONTENT_ENCODING,
+ strlen(FLB_HTTP_HEADER_CONTENT_ENCODING));
+ if (!TEST_CHECK(ret_str == NULL)) {
+ TEST_MSG("Got encoding? Header:%s", ret_str);
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ ret = flb_http_set_content_encoding_gzip(c);
+ TEST_CHECK(ret == 0);
+
+ /* Check Encoding */
+ ret_str = flb_http_get_header(c, FLB_HTTP_HEADER_CONTENT_ENCODING,
+ strlen(FLB_HTTP_HEADER_CONTENT_ENCODING));
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_http_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, gzip, strlen(gzip)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, gzip);
+ }
+
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+}
+
+void test_http_add_basic_auth_header()
+{
+ struct test_ctx *ctx;
+ struct flb_http_client *c;
+ flb_sds_t ret_str;
+ char *expect = "Basic dXNlcjpwYXNzd29yZA=="; /* user:password in base64 */
+ char *auth = FLB_HTTP_HEADER_AUTH;
+ const char *user = "user";
+ char *passwd = "password";
+ int ret;
+
+ ctx = test_ctx_create();
+ if (!TEST_CHECK(ctx != NULL)) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create HTTP client instance */
+ c = flb_http_client(ctx->u_conn, FLB_HTTP_GET, "/", NULL, 0,
+ "127.0.0.1", 80, NULL, 0);
+ if(!TEST_CHECK(c != NULL)) {
+ TEST_MSG("flb_http_client failed");
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Check Autholization. It should be error. */
+ ret_str = flb_http_get_header(c, auth, strlen(auth));
+ if (!TEST_CHECK(ret_str == NULL)) {
+ TEST_MSG("Got auth? Header:%s", ret_str);
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ ret = flb_http_basic_auth(c, user, passwd);
+ TEST_CHECK(ret == 0);
+
+ /* Check Autholization. */
+ ret_str = flb_http_get_header(c, auth, strlen(auth));
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_http_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, expect, strlen(expect)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, expect);
+ }
+
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+}
+
+void test_http_add_proxy_auth_header()
+{
+ struct test_ctx *ctx;
+ struct flb_http_client *c;
+ flb_sds_t ret_str;
+ char *expect = "Basic dXNlcjpwYXNzd29yZA=="; /* user:password in base64 */
+ char *auth = FLB_HTTP_HEADER_PROXY_AUTH;
+ const char *user = "user";
+ char *passwd = "password";
+ int ret;
+
+ ctx = test_ctx_create();
+ if (!TEST_CHECK(ctx != NULL)) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create HTTP client instance */
+ c = flb_http_client(ctx->u_conn, FLB_HTTP_GET, "/", NULL, 0,
+ "127.0.0.1", 80, NULL, 0);
+ if(!TEST_CHECK(c != NULL)) {
+ TEST_MSG("flb_http_client failed");
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Check autholization header. It should be error. */
+ ret_str = flb_http_get_header(c, auth, strlen(auth));
+ if (!TEST_CHECK(ret_str == NULL)) {
+ TEST_MSG("Got auth? Header:%s", ret_str);
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ ret = flb_http_proxy_auth(c, user, passwd);
+ TEST_CHECK(ret == 0);
+
+ /* Check autholization header. */
+ ret_str = flb_http_get_header(c, auth, strlen(auth));
+ if (!TEST_CHECK(ret_str != NULL)) {
+ TEST_MSG("flb_http_get_header failed");
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!TEST_CHECK(flb_sds_cmp(ret_str, expect, strlen(expect)) == 0)) {
+ TEST_MSG("strcmp failed. got=%s expect=%s", ret_str, expect);
+ }
+
+ flb_sds_destroy(ret_str);
+ flb_http_client_destroy(c);
+ test_ctx_destroy(ctx);
+}
+
+TEST_LIST = {
+ { "http_buffer_increase" , test_http_buffer_increase},
+ { "add_get_header" , test_http_add_get_header},
+ { "set_keepalive" , test_http_set_keepalive},
+ { "strip_port_from_host" , test_http_strip_port_from_host},
+ { "encoding_gzip" , test_http_encoding_gzip},
+ { "add_basic_auth_header" , test_http_add_basic_auth_header},
+ { "add_proxy_auth_header" , test_http_add_proxy_auth_header},
+ { 0 }
+};