From 34bf941cd2c44b4b8850b69490c1d1cff97850be Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 11 Mar 2023 21:46:08 +0100 Subject: [PATCH] Berry add `webclient` `collect_headers()` and `set_headers` (#18166) --- CHANGELOG.md | 3 +- .../berry_tasmota/src/be_webclient_lib.c | 7 ++++ .../xdrv_52_3_berry_webclient.ino | 35 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69f7aaa97..ca79c9468 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ All notable changes to this project will be documented in this file. - Extended Tariff command for forced tariff (#18080) - Berry support for Tensorflow Lite (TFL) by Christiaan Baars (#18119) - Zigbee send Tuya 'magic spell' to unlock devices when pairing (#18144) -- Berry add `wc.set_follow_redirects(bool)` +- Berry add `webclient` `set_follow_redirects(bool)` +- Berry add `webclient` `collect_headers()` and `set_headers` ### Breaking Changed - Shelly Pro 4PM using standard MCP23xxx driver and needs one time Auto-Configuration diff --git a/lib/libesp32/berry_tasmota/src/be_webclient_lib.c b/lib/libesp32/berry_tasmota/src/be_webclient_lib.c index cacd74ad1..a5c888d01 100644 --- a/lib/libesp32/berry_tasmota/src/be_webclient_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_webclient_lib.c @@ -16,6 +16,8 @@ extern int wc_set_timeouts(bvm *vm); extern int wc_set_useragent(bvm *vm); extern int wc_set_follow_redirects(bvm *vm); extern int wc_set_auth(bvm *vm); +extern int wc_collect_headers(bvm *vm); +extern int wc_get_header(bvm *vm); extern int wc_connected(bvm *vm); extern int wc_close(bvm *vm); extern int wc_addheader(bvm *vm); @@ -50,6 +52,11 @@ class be_class_webclient (scope: global, name: webclient) { set_useragent, func(wc_set_useragent) set_follow_redirects, func(wc_set_follow_redirects) set_auth, func(wc_set_auth) + + // collect response headers + collect_headers, func(wc_collect_headers) + get_header, func(wc_get_header) + close, func(wc_close) add_header, func(wc_addheader) GET, func(wc_GET) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino index 546f1871e..17d590879 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino @@ -273,6 +273,41 @@ extern "C" { be_raise(vm, kTypeError, nullptr); } + // wc.collect_headers( [header:string]+ ) -> self + int32_t wc_collect_headers(struct bvm *vm); + int32_t wc_collect_headers(struct bvm *vm) { + int32_t argc = be_top(vm); + if (argc >= 2) { + size_t header_len = argc-1; + const char** header_array = (const char**) be_os_malloc((header_len) * sizeof(const char*)); + if (!header_array) { be_throw(vm, BE_MALLOC_FAIL); } + + for (int32_t i = 0; i < header_len; i++) { + header_array[i] = be_tostring(vm, i + 2); + } + HTTPClientLight * cl = wc_getclient(vm); + cl->collectHeaders(header_array, header_len); + + be_os_free(header_array); + } + be_pushvalue(vm, 1); + be_return(vm); /* return self */ + } + + // wc.get_header(header_name:string) -> string + int32_t wc_get_header(struct bvm *vm); + int32_t wc_get_header(struct bvm *vm) { + int32_t argc = be_top(vm); + if (argc >= 2 && be_isstring(vm, 2)) { + HTTPClientLight * cl = wc_getclient(vm); + const char * header_name = be_tostring(vm, 2); + String ret = cl->header(header_name); + be_pushstring(vm, ret.c_str()); + be_return(vm); /* return self */ + } + be_raise(vm, kTypeError, nullptr); + } + // wc.wc_set_auth(auth:string | (user:string, password:string)) -> self int32_t wc_set_auth(struct bvm *vm); int32_t wc_set_auth(struct bvm *vm) {