From patchwork Thu Sep 9 15:41:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sava Jakovljev X-Patchwork-Id: 1526235 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20210112 header.b=QY7Epn8q; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2607:f8b0:4864:20::1037; helo=mail-pj1-x1037.google.com; envelope-from=swupdate+bncbaabboww5ceqmgqems63ply@googlegroups.com; receiver=) Received: from mail-pj1-x1037.google.com (mail-pj1-x1037.google.com [IPv6:2607:f8b0:4864:20::1037]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4H53CL5Clmz9sR4 for ; Fri, 10 Sep 2021 01:41:49 +1000 (AEST) Received: by mail-pj1-x1037.google.com with SMTP id m9-20020a17090ade09b029017903cc8d6csf1558844pjv.4 for ; Thu, 09 Sep 2021 08:41:49 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1631202106; cv=pass; d=google.com; s=arc-20160816; b=c/3MbV7PHwp76hQ7gf0rO7LdjYtMmXtZ1qVTo1Cff+OqtkF7MsFjvSkhdEJxY9IVnq tWOKVB8mCGZWly4uy9zrsmvQ6XnvwUNioNcoJXh4Rv1BfpTRIOXyaevlsXVZNA3oTi/P XMVLp2FWKgD+PLcKRS9f8t3aIbx8POx7qYkDpt6nLJul4drvtC8T/Y479oCpdBZJDd2Q Szw8Mt/QuK8sYLei3c7ubgnwhN5SiIIF6scWuR1+SgdNNhI4C5Qqqn6wPX2pYxCDWUzf UMDBEeiy916mKGMhdPZW1XtWJddWaJoqpeFUD2TzTfNEKdVdIQPVLiAXydMUhM8UC6N/ LpGQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:mime-version:message-id:date :subject:cc:to:from:sender:dkim-signature; bh=IPxZL8mgdYX7dtIwGtGfxMMMfMsDmDdlxwTtlnzzbaQ=; b=AY6jWs4fN083tP0Qy0wV/EXyn87gjBt227LJTpCvvaFIO/+LOtKVC58n9DdQ9Wiyeu ouA+ctIPUA7VPutVpBQSXj9ktswhbpsRSVBw5+WiGrpU1HUSLNYBuLahldgXhleM+mMT ObFjUDhFlFDGHJM2EsaHltzYjIoJ/0MRPey7LT0sZl+MB/9HFrWwUbSQRT6yoDNCF+md 8CByab0Jv1VB3FInqRANKWzWYzVaEWq8uTg3ZzSktuidsW73139tpnbzOcmkGdp2bFi6 Q8Y/icJXZV70i4lXbiUjIpuXOInknBlo1nxp1Ci5M3W1krc04sfCKmJ7Heu7B23Q9UTx eFSA== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=WyLOmm7I; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.136.198 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=teufel.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:mime-version :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=IPxZL8mgdYX7dtIwGtGfxMMMfMsDmDdlxwTtlnzzbaQ=; b=QY7Epn8qS/A/BNOBO31wICjFHak+hUqlZnZCNTHtAKCg4KYl7OM4SKAIlA0NydUenw UBuOyTYTJzS2acCGrdMfY4zeFXVzQHSw5RY2dwYP2QFnvwhjuQIZpFgs6llmkaF17WFD D4l2utmTp3TAVyiOaT+cQEK/YKJfddUXGPipQzYR3OvmnEnbhp8LpbTTLo3BVo3LdWDK VGiIvyEqz0xHXMowcOqsMzgo6o0cZxkTMqsI8VDaRr7MI8RTq6K+VRvgmucNATHOt3tG kYCK0VmwQoahYV1J6oV9zNNEeAQhGD81HmWfARzqRHhcE7WFTDdEt+tRrApMc0mvYLxF wGCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=sender:x-gm-message-state:from:to:cc:subject:date:message-id :mime-version:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=IPxZL8mgdYX7dtIwGtGfxMMMfMsDmDdlxwTtlnzzbaQ=; b=2CmrgYizXAdKZMSgNdqLKMnvMYfU903T3KbaN+EvhZqZY53aCj7ZOpqZIcApyywa2i GgK4pPFkPzMIZVmp2TeVpUNoISuyq4pbA0auI/Ji1BclZjqerauocLfn297vDguh+jYX aGM1DFx6LQZW4TmcAYVzDXMsM5rxd7D3EGPznXtEs2Wa0L8U1aD38/sqjtI/ARSLZAta NMYMPRqhHYO4C59Nl1gYSic/e+s6ahtMk7Rue7+3Bway5UDoIrvpFBGOv2NyHSbZCupD YluPvGcngmuyYxBbG40w6L+vY7rhoqXGIMtaNkDAVIyxkX25jKTjmKhAHYO9S/cQDou6 diEg== Sender: swupdate@googlegroups.com X-Gm-Message-State: AOAM5323Yvr+p8rSu0uVha5jQ7EmKPpDtjos13k2jpJnuKAiKYH/ArqW c27xNxDfZU31Hu5t+uJJmE8= X-Google-Smtp-Source: ABdhPJyEMBRLF57fNAcoZQ7WJRLNi1ErOh9ix0SSfbxABuwkjYLqZGZXRVv4sv9SBuohuqsuZEWi1Q== X-Received: by 2002:a17:90a:1990:: with SMTP id 16mr4317063pji.11.1631202106306; Thu, 09 Sep 2021 08:41:46 -0700 (PDT) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a17:902:ed83:: with SMTP id e3ls1453661plj.2.gmail; Thu, 09 Sep 2021 08:41:45 -0700 (PDT) X-Received: by 2002:a17:90a:f002:: with SMTP id bt2mr4336001pjb.207.1631202105698; Thu, 09 Sep 2021 08:41:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631202105; cv=none; d=google.com; s=arc-20160816; b=gRAxVbU64RlPW1kFZ9QaRseSRWAv3f6au9+EOFXKKMEBWg2nEvsDWhhJRO/5hLFcq6 /VAU6jOGrMgNZC85PV7OnvLiZ6nJNxQtEjw7jlDQLipVw/x9AGSC5Ai4zVGR2+NK06/3 sf/T5JxF4gFnl9ae3zMOj6PH+LoY+HxeHUwsESyC9rEN3Aapo6/RSTdVTvgW+2xGzzT1 IAWtFZ2XDg00RRA8CDtJQMC8U8acVqNht3ctRTCZ3KlxXyoHTNCrAJKbWcmGcPWk9vYM EbT9E9i8sR8AWE507mK1rsYP2z9OKzZPw1xhqnyrDX7ETYggeDuTJHMnb2Lp8ZLToL5k bUzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=dkim-signature:content-transfer-encoding:mime-version:message-id :date:subject:cc:to:from; bh=Zl5ZFMJ9TawbOXjgROBkxFCXPptgvcabjQdWPC5EfyM=; b=V+CvYGeR2T9ISZP3tL+2DimDVpZ2fk6c4mnXBUn2UXKwARknKDk/XF/vVukI9Bxhf1 4yJ6JV5dp8BIiHQaYKOCH+YmNswVOCqvZQP4D6vxzH6+XwMC4yl2w4yCrARGReYoDINe wf1l36HweiZ7iYyjvEal3L8WM121/lG6E2yJQSUZaotVDXzc968qH8h1wMumYYK8aUTU OJD/9V30r6kEdcObZABvUeZOV5Yd9RBmxd2LGvbhEiqa7EuHuFIuO4PjsVGOuCC/oQpl twQbmKlT+PyGyzuO7MRFs/8ghwsivWoDmTOtzr/KqKwnxMcI8jz2jORWEuF/WUbRBrpu QPXA== ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=WyLOmm7I; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.136.198 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=teufel.de Received: from mx-relay98-hz2.antispameurope.com (mx-relay98-hz2.antispameurope.com. [94.100.136.198]) by gmr-mx.google.com with ESMTPS id a14si231539pjg.2.2021.09.09.08.41.44 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 09 Sep 2021 08:41:45 -0700 (PDT) Received-SPF: pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.136.198 as permitted sender) client-ip=94.100.136.198; Received: from unknown ([212.91.255.190]) by mx-relay98-hz2.antispameurope.com; Thu, 09 Sep 2021 17:41:41 +0200 From: Sava Jakovljev To: CC: Sava Jakovljev Subject: [swupdate] [PATCH v5] channel_curl: Add ability to define a set of custom HTTP headers Date: Thu, 9 Sep 2021 17:41:20 +0200 Message-ID: <20210909154120.449596-1-sava.jakovljev@teufel.de> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Originating-IP: [10.10.25.44] X-ClientProxiedBy: DNS-EX-01.teufel.local (10.10.0.80) To DNS-EX-02.teufel.local (10.10.0.81) X-C2ProcessedOrg: b93e13a0-e8da-4ba4-97b8-f14375b21c41 X-cloud-security-sender: sava.jakovljev@teufel.de X-cloud-security-recipient: swupdate@googlegroups.com X-cloud-security-Virusscan: CLEAN X-cloud-security-disclaimer: This E-Mail was scanned by E-Mailservice on mx-relay98-hz2.antispameurope.com with 2630B207E9C X-cloud-security-connect: unknown[212.91.255.190], TLS=1, IP=212.91.255.190 X-cloud-security-Digest: 6799465ec6d2699b024a2d2db2dca5d2 X-cloud-security: scantime:1.713 X-Original-Sender: sava.jakovljev@teufel.de X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=WyLOmm7I; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.136.198 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=teufel.de Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , * Expand Suricatta/Hawkbit client with ability to define a custom set of HTTP requests, defined through command line or configuration file, using 'a' short option or "custom-http-header" long option. Signed-off-by: Sava Jakovljev --- corelib/channel_curl.c | 8 +++++--- corelib/downloader.c | 3 ++- doc/source/swupdate.rst | 8 ++++++-- include/channel_curl.h | 3 ++- suricatta/server_general.c | 30 +++++++++++++++++++++++------- suricatta/server_general.h | 3 ++- suricatta/server_hawkbit.c | 31 ++++++++++++++++++++++++++----- suricatta/server_hawkbit.h | 1 + 8 files changed, 67 insertions(+), 20 deletions(-) diff --git a/corelib/channel_curl.c b/corelib/channel_curl.c index e5a3b0e..0761811 100644 --- a/corelib/channel_curl.c +++ b/corelib/channel_curl.c @@ -593,7 +593,7 @@ channel_op_res_t channel_set_options(channel_t *this, channel_data_t *channel_da goto cleanup; } - if (channel_data->headers) { + if (channel_data->received_headers) { /* * Setup supply request and receive reply HTTP headers. * A LIST_INIT()'d dictionary is expected at channel_data->headers. @@ -604,14 +604,16 @@ channel_op_res_t channel_set_options(channel_t *this, channel_data_t *channel_da CURLOPT_HEADERFUNCTION, channel_callback_headers) != CURLE_OK) || (curl_easy_setopt(channel_curl->handle, CURLOPT_HEADERDATA, - channel_data->headers) != CURLE_OK)) { + channel_data->received_headers) != CURLE_OK)) { result = CHANNEL_EINIT; goto cleanup; } + } + if (channel_data->headers_to_send) { struct dict_entry *entry; char *header; - LIST_FOREACH(entry, channel_data->headers, next) + LIST_FOREACH(entry, channel_data->headers_to_send, next) { if (ENOMEM_ASPRINTF == asprintf(&header, "%s: %s", diff --git a/corelib/downloader.c b/corelib/downloader.c index 437b36d..3d0a0a5 100644 --- a/corelib/downloader.c +++ b/corelib/downloader.c @@ -104,7 +104,8 @@ static channel_data_t channel_options = { .source = SOURCE_DOWNLOADER, .debug = false, .retries = DL_DEFAULT_RETRIES, - .low_speed_timeout = DL_LOWSPEED_TIME + .low_speed_timeout = DL_LOWSPEED_TIME, + .headers_to_send = NULL }; int start_download(const char *fname, int argc, char *argv[]) diff --git a/doc/source/swupdate.rst b/doc/source/swupdate.rst index 70375fa..8a60fcc 100644 --- a/doc/source/swupdate.rst +++ b/doc/source/swupdate.rst @@ -184,7 +184,7 @@ Images fully streamed --------------------- In case of remote update, SWUpdate extracts relevant images from the stream -and copies them into the directory pointed to by the environment variable +and copies them into the directory pointed to by the environment variable ``TMPDIR`` (if unset, to ``/tmp``) before calling the handlers. This guarantee that an update is initiated only if all parts are present and correct. However, on some systems with less resources, the amount of RAM @@ -652,6 +652,10 @@ Mandatory arguments are marked with '\*': | | | during this period - adapt this value to | | | | your use case! | +-------------------------+----------+--------------------------------------------+ +| -a | strings | Custom HTTP header with given name and | +| | | value to be sent with every HTTP request | +| | | made. | ++-------------------------+----------+--------------------------------------------+ systemd Integration @@ -706,7 +710,7 @@ files are also handed over on a "regular" start of SWUpdate via ``systemctl start swupdate.service``. Note that the socket paths in the two ``ListenStream=`` directives -have to match the socket paths ``CONFIG_SOCKET_CTRL_PATH`` and +have to match the socket paths ``CONFIG_SOCKET_CTRL_PATH`` and ``CONFIG_SOCKET_PROGRESS_PATH`` in SWUpdate's configuration. Here, the default socket path configuration is depicted. diff --git a/include/channel_curl.h b/include/channel_curl.h index 4de098e..6dabae6 100644 --- a/include/channel_curl.h +++ b/include/channel_curl.h @@ -72,5 +72,6 @@ typedef struct { struct swupdate_digest *dgst; char sha1hash[SWUPDATE_SHA_DIGEST_LENGTH * 2 + 1]; sourcetype source; - struct dict *headers; + struct dict *headers_to_send; + struct dict *received_headers; } channel_data_t; diff --git a/suricatta/server_general.c b/suricatta/server_general.c index 1d11ada..8b76205 100644 --- a/suricatta/server_general.c +++ b/suricatta/server_general.c @@ -453,8 +453,9 @@ static server_op_res_t server_get_deployment_info(channel_t *channel, channel_da */ channel_data->url= server_prepare_query(server_general.url, &server_general.configdata); - LIST_INIT(&server_general.httpheaders); - channel_data->headers = &server_general.httpheaders; + LIST_INIT(&server_general.received_httpheaders); + LIST_INIT(&server_general.httpheaders_to_send); + channel_data->received_headers = &server_general.received_httpheaders; result = map_http_retcode(channel->get(channel, (void *)channel_data)); @@ -462,12 +463,12 @@ static server_op_res_t server_get_deployment_info(channel_t *channel, channel_da free(channel_data->url); } - pollstring = dict_get_value(&server_general.httpheaders, "Retry-After"); + pollstring = dict_get_value(&server_general.received_httpheaders, "Retry-After"); if (pollstring) { server_set_polling_interval(pollstring); } - dict_drop_db(&server_general.httpheaders); + dict_drop_db(&server_general.received_httpheaders); return result; } @@ -522,7 +523,9 @@ void server_print_help(void) "\t -w, --retrywait Time to wait prior to retry and " "resume a download (default: %ds).\n" "\t -y, --proxy Use proxy. Either give proxy URL, else " - "{http,all}_proxy env is tried.\n", + "{http,all}_proxy env is tried.\n" + "\t -a, --custom-http-header Set custom HTTP header, " + "appended to every HTTP request being sent.", CHANNEL_DEFAULT_POLLING_INTERVAL, CHANNEL_DEFAULT_RESUME_TRIES, CHANNEL_DEFAULT_RESUME_DELAY); } @@ -608,6 +611,7 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) int choice = 0; LIST_INIT(&server_general.configdata); + LIST_INIT(&server_general.httpheaders_to_send); if (fname) { swupdate_cfg_handle handle; @@ -626,7 +630,7 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) /* reset to optind=1 to parse suricatta's argument vector */ optind = 1; opterr = 0; - while ((choice = getopt_long(argc, argv, "u:l:r:w:p:2:", + while ((choice = getopt_long(argc, argv, "u:l:r:w:p:2:a:", long_options, NULL)) != -1) { switch (choice) { case 'u': @@ -651,8 +655,18 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) case '2': SETSTRING(server_general.cached_file, optarg); break; - /* Ignore not recognized options, they can be already parsed by the caller */ + case 'a': + if (optind >= argc) + return SERVER_EINIT; + + if (dict_insert_value(&server_hawkbit.httpheaders, + optarg, + argv[optind++]) < 0) + return SERVER_EINIT; + + break; case '?': + /* Ignore not recognized options, they can be already parsed by the caller */ default: break; } @@ -664,6 +678,8 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) return SERVER_EINIT; } + channel_data_defaults.headers_to_send = &server_general.httpheaders_to_send; + if (channel_curl_init() != CHANNEL_OK) return SERVER_EINIT; diff --git a/suricatta/server_general.h b/suricatta/server_general.h index 69345a1..d5d8d48 100644 --- a/suricatta/server_general.h +++ b/suricatta/server_general.h @@ -23,7 +23,8 @@ typedef struct { bool debug; char *cached_file; struct dict configdata; - struct dict httpheaders; + struct dict received_httpheaders; + struct dict httpheaders_to_send; update_state_t update_state; channel_t *channel; } server_general_t; diff --git a/suricatta/server_hawkbit.c b/suricatta/server_hawkbit.c index 805158d..9a338d8 100644 --- a/suricatta/server_hawkbit.c +++ b/suricatta/server_hawkbit.c @@ -52,6 +52,7 @@ static struct option long_options[] = { {"cache", required_argument, NULL, '2'}, {"initial-report-resend-period", required_argument, NULL, 'm'}, {"connection-timeout", required_argument, NULL, 's'}, + {"custom-http-header", required_argument, NULL, 'a'}, {NULL, 0, NULL, 0}}; static unsigned short mandatory_argument_count = 0; @@ -132,7 +133,9 @@ static channel_data_t channel_data_defaults = {.debug = false, .nocheckanswer = false, .nofollow = false, .strictssl = true, - .connection_timeout = 0 + .connection_timeout = 0, + .headers_to_send = NULL, + .received_headers = NULL }; static struct timeval server_time; @@ -1604,9 +1607,11 @@ void server_print_help(void) "\t -f, --interface Set the network interface to connect to hawkBit.\n" "\t --disable-token-for-dwl Do not send authentication header when downlloading SWU.\n" "\t --cache Use cache file as starting SWU\n" - "\t -m, --initial-report-resend-period Time to wait prior to retry " - "sending initial state with '-c' option (default: %ds).\n" - "\t -s, --connection-timeout Set the server connection timeout (default: 300s).\n", + "\t -m, --initial-report-resend-period Time to wait prior to retry " + "sending initial state with '-c' option (default: %ds).\n" + "\t -s, --connection-timeout Set the server connection timeout (default: 300s).\n" + "\t -a, --custom-http-header Set custom HTTP header, " + "appended to every HTTP request being sent.", CHANNEL_DEFAULT_POLLING_INTERVAL, CHANNEL_DEFAULT_RESUME_TRIES, CHANNEL_DEFAULT_RESUME_DELAY, INITIAL_STATUS_REPORT_WAIT_DELAY); @@ -1665,6 +1670,7 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) mandatory_argument_count = 0; LIST_INIT(&server_hawkbit.configdata); + LIST_INIT(&server_hawkbit.httpheaders); server_hawkbit.initial_report_resend_period = INITIAL_STATUS_REPORT_WAIT_DELAY; if (fname) { @@ -1681,6 +1687,9 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) */ read_module_settings(&handle, "hawkbit", server_hawkbit_settings, NULL); read_module_settings(&handle, "identify", settings_into_dict, &server_hawkbit.configdata); + + read_module_settings(&handle, "custom-http-headers", + settings_into_dict, &server_hawkbit.httpheaders); } swupdate_cfg_destroy(&handle); } @@ -1693,7 +1702,7 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) /* reset to optind=1 to parse suricatta's argument vector */ optind = 1; opterr = 0; - while ((choice = getopt_long(argc, argv, "t:i:c:u:p:xr:y::w:k:g:f:2:m:s:", + while ((choice = getopt_long(argc, argv, "t:i:c:u:p:xr:y::w:k:g:f:2:m:s:a:", long_options, NULL)) != -1) { switch (choice) { case 't': @@ -1786,6 +1795,16 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) channel_data_defaults.connection_timeout = (unsigned int)strtoul(optarg, NULL, 10); break; + case 'a': + if (optind >= argc) + return SERVER_EINIT; + + if (dict_insert_value(&server_hawkbit.httpheaders, + optarg, + argv[optind++]) < 0) + return SERVER_EINIT; + + break; /* Ignore not recognized options, they can be already parsed by the caller */ case '?': break; @@ -1803,6 +1822,8 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) return SERVER_EINIT; } + channel_data_defaults.headers_to_send = &server_hawkbit.httpheaders; + if (channel_curl_init() != CHANNEL_OK) return SERVER_EINIT; diff --git a/suricatta/server_hawkbit.h b/suricatta/server_hawkbit.h index aea4bb0..67f1c31 100644 --- a/suricatta/server_hawkbit.h +++ b/suricatta/server_hawkbit.h @@ -29,6 +29,7 @@ typedef struct { bool polling_interval_from_server; bool debug; struct dict configdata; + struct dict httpheaders; bool has_to_send_configData; char *configData_url; char *cancel_url;