From 85fb54fe8d05c93ec13edf85ee68d9529d45346d Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 9 Jan 2024 19:34:19 +0100 Subject: [PATCH] Berry `webserver.header` to read browser sent headers (#20447) --- CHANGELOG.md | 1 + .../berry_tasmota/src/be_webserver_lib.c | 3 +++ .../xdrv_52_3_berry_webserver.ino | 17 +++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 955807727962..045a876d491e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. - Berry add `string` to `bytes()` (#20420) - Berry button to dynamically load GPIO Viewer with Berry backend (#20424) - Berry `debug_panel.tapp` to display real-time heap and wifi rssi +- Berry `webserver.header` to read browser sent headers ### Breaking Changed diff --git a/lib/libesp32/berry_tasmota/src/be_webserver_lib.c b/lib/libesp32/berry_tasmota/src/be_webserver_lib.c index 541233893467..279b1fb05e85 100644 --- a/lib/libesp32/berry_tasmota/src/be_webserver_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_webserver_lib.c @@ -34,6 +34,7 @@ extern int w_webserver_arg(bvm *vm); extern int w_webserver_arg_name(bvm *vm); extern int w_webserver_has_arg(bvm *vm); +extern int w_webserver_header(bvm *vm); // To allow a full restart of the Berry VM, we need to supplement the webserver Request Handler // model from Arduino framework. @@ -160,6 +161,8 @@ module webserver (scope: global) { arg, func(w_webserver_arg) arg_name, func(w_webserver_arg_name) has_arg, func(w_webserver_has_arg) + + header, func(w_webserver_header) } @const_object_info_end */ #include "be_fixed_webserver.h" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino index 244e594cf7a7..ca05a02de920 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino @@ -335,6 +335,23 @@ extern "C" { be_raise(vm, kTypeError, nullptr); } + // Berry: `webserver.header(name:string) -> string or nil` + int32_t w_webserver_header(struct bvm *vm); + int32_t w_webserver_header(struct bvm *vm) { + int32_t argc = be_top(vm); // Get the number of arguments + if (argc >= 1 && be_isstring(vm, 1)) { + const char * header_name = be_tostring(vm, 1); + String header = Webserver->header(header_name); + if (header.length() > 0) { + be_pushstring(vm, header.c_str()); + be_return(vm); + } else { + be_return_nil(vm); + } + } + be_raise(vm, kTypeError, nullptr); + } + } #endif // USE_WEBSERVER