summaryrefslogtreecommitdiff
path: root/libraries/ESP_Async_WebServer/src/AsyncMessagePack.h
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ESP_Async_WebServer/src/AsyncMessagePack.h')
-rw-r--r--libraries/ESP_Async_WebServer/src/AsyncMessagePack.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/libraries/ESP_Async_WebServer/src/AsyncMessagePack.h b/libraries/ESP_Async_WebServer/src/AsyncMessagePack.h
new file mode 100644
index 0000000..7488b5c
--- /dev/null
+++ b/libraries/ESP_Async_WebServer/src/AsyncMessagePack.h
@@ -0,0 +1,126 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+// Copyright 2016-2025 Hristo Gochkov, Mathieu Carbou, Emil Muratov
+
+#pragma once
+
+/*
+ server.on("/msg_pack", HTTP_ANY, [](AsyncWebServerRequest * request) {
+ AsyncMessagePackResponse * response = new AsyncMessagePackResponse();
+ JsonObject& root = response->getRoot();
+ root["key1"] = "key number one";
+ JsonObject& nested = root.createNestedObject("nested");
+ nested["key1"] = "key number one";
+ response->setLength();
+ request->send(response);
+ });
+
+ --------------------
+
+ AsyncCallbackMessagePackWebHandler* handler = new AsyncCallbackMessagePackWebHandler("/msg_pack/endpoint");
+ handler->onRequest([](AsyncWebServerRequest *request, JsonVariant &json) {
+ JsonObject jsonObj = json.as<JsonObject>();
+ // ...
+ });
+ server.addHandler(handler);
+*/
+
+#if __has_include("ArduinoJson.h")
+#include <ArduinoJson.h>
+#if ARDUINOJSON_VERSION_MAJOR >= 6
+#define ASYNC_MSG_PACK_SUPPORT 1
+#else
+#define ASYNC_MSG_PACK_SUPPORT 0
+#endif // ARDUINOJSON_VERSION_MAJOR >= 6
+#endif // __has_include("ArduinoJson.h")
+
+#if ASYNC_MSG_PACK_SUPPORT == 1
+#include <ESPAsyncWebServer.h>
+
+#include "ChunkPrint.h"
+
+#if ARDUINOJSON_VERSION_MAJOR == 6
+#ifndef DYNAMIC_JSON_DOCUMENT_SIZE
+#define DYNAMIC_JSON_DOCUMENT_SIZE 1024
+#endif
+#endif
+
+class AsyncMessagePackResponse : public AsyncAbstractResponse {
+protected:
+#if ARDUINOJSON_VERSION_MAJOR == 6
+ DynamicJsonDocument _jsonBuffer;
+#else
+ JsonDocument _jsonBuffer;
+#endif
+
+ JsonVariant _root;
+ bool _isValid;
+
+public:
+#if ARDUINOJSON_VERSION_MAJOR == 6
+ AsyncMessagePackResponse(bool isArray = false, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE);
+#else
+ AsyncMessagePackResponse(bool isArray = false);
+#endif
+ JsonVariant &getRoot() {
+ return _root;
+ }
+ bool _sourceValid() const {
+ return _isValid;
+ }
+ size_t setLength();
+ size_t getSize() const {
+ return _jsonBuffer.size();
+ }
+ size_t _fillBuffer(uint8_t *data, size_t len);
+#if ARDUINOJSON_VERSION_MAJOR >= 6
+ bool overflowed() const {
+ return _jsonBuffer.overflowed();
+ }
+#endif
+};
+
+typedef std::function<void(AsyncWebServerRequest *request, JsonVariant &json)> ArMessagePackRequestHandlerFunction;
+
+class AsyncCallbackMessagePackWebHandler : public AsyncWebHandler {
+protected:
+ String _uri;
+ WebRequestMethodComposite _method;
+ ArMessagePackRequestHandlerFunction _onRequest;
+ size_t _contentLength;
+#if ARDUINOJSON_VERSION_MAJOR == 6
+ size_t maxJsonBufferSize;
+#endif
+ size_t _maxContentLength;
+
+public:
+#if ARDUINOJSON_VERSION_MAJOR == 6
+ AsyncCallbackMessagePackWebHandler(
+ const String &uri, ArMessagePackRequestHandlerFunction onRequest = nullptr, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE
+ );
+#else
+ AsyncCallbackMessagePackWebHandler(const String &uri, ArMessagePackRequestHandlerFunction onRequest = nullptr);
+#endif
+
+ void setMethod(WebRequestMethodComposite method) {
+ _method = method;
+ }
+ void setMaxContentLength(int maxContentLength) {
+ _maxContentLength = maxContentLength;
+ }
+ void onRequest(ArMessagePackRequestHandlerFunction fn) {
+ _onRequest = fn;
+ }
+
+ bool canHandle(AsyncWebServerRequest *request) const override final;
+ void handleRequest(AsyncWebServerRequest *request) override final;
+ void handleUpload(
+ __unused AsyncWebServerRequest *request, __unused const String &filename, __unused size_t index, __unused uint8_t *data, __unused size_t len,
+ __unused bool final
+ ) override final {}
+ void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override final;
+ bool isRequestHandlerTrivial() const override final {
+ return !_onRequest;
+ }
+};
+
+#endif // ASYNC_MSG_PACK_SUPPORT == 1