Blame | Last modification | View Log | RSS feed
// SPDX-License-Identifier: LGPL-3.0-or-later// Copyright 2016-2026 Hristo Gochkov, Mathieu Carbou, Emil Muratov, Will Miles#pragma once#include <ESPAsyncWebServer.h>#include "ChunkPrint.h"#include <utility>#if ASYNC_JSON_SUPPORT == 1#if ARDUINOJSON_VERSION_MAJOR == 6#ifndef DYNAMIC_JSON_DOCUMENT_SIZE#define DYNAMIC_JSON_DOCUMENT_SIZE 1024#endif#endif// Json content type response classesclass AsyncJsonResponse : public AsyncAbstractResponse {protected:#if ARDUINOJSON_VERSION_MAJOR == 5DynamicJsonBuffer _jsonBuffer;#elif ARDUINOJSON_VERSION_MAJOR == 6DynamicJsonDocument _jsonBuffer;#elseJsonDocument _jsonBuffer;#endifJsonVariant _root;bool _isValid;public:#if ARDUINOJSON_VERSION_MAJOR == 6AsyncJsonResponse(bool isArray = false, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE);#elseAsyncJsonResponse(bool isArray = false);#endifJsonVariant &getRoot() {return _root;}bool _sourceValid() const {return _isValid;}virtual size_t setLength();size_t getSize() const {return _jsonBuffer.size();}virtual size_t _fillBuffer(uint8_t *data, size_t len);#if ARDUINOJSON_VERSION_MAJOR >= 6bool overflowed() const {return _jsonBuffer.overflowed();}#endif};class PrettyAsyncJsonResponse : public AsyncJsonResponse {public:#if ARDUINOJSON_VERSION_MAJOR == 6PrettyAsyncJsonResponse(bool isArray = false, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE);#elsePrettyAsyncJsonResponse(bool isArray = false);#endifsize_t setLength() override;size_t _fillBuffer(uint8_t *data, size_t len) override;};// MessagePack content type response#if ASYNC_MSG_PACK_SUPPORT == 1class AsyncMessagePackResponse : public AsyncJsonResponse {public:#if ARDUINOJSON_VERSION_MAJOR == 6AsyncMessagePackResponse(bool isArray = false, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE) : AsyncJsonResponse(isArray, maxJsonBufferSize) {_contentType = asyncsrv::T_application_msgpack;}#elseAsyncMessagePackResponse(bool isArray = false) : AsyncJsonResponse(isArray) {_contentType = asyncsrv::T_application_msgpack;}#endifsize_t setLength() override;size_t _fillBuffer(uint8_t *data, size_t len) override;};#endif// Body handler supporting both content types: JSON and MessagePackclass AsyncCallbackJsonWebHandler : public AsyncWebHandler {protected:AsyncURIMatcher _uri;WebRequestMethodComposite _method;ArJsonRequestHandlerFunction _onRequest;#if ARDUINOJSON_VERSION_MAJOR == 6size_t maxJsonBufferSize;#endifsize_t _maxContentLength;public:#if ARDUINOJSON_VERSION_MAJOR == 6AsyncCallbackJsonWebHandler(AsyncURIMatcher uri, ArJsonRequestHandlerFunction onRequest = nullptr, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE);#elseAsyncCallbackJsonWebHandler(AsyncURIMatcher uri, ArJsonRequestHandlerFunction onRequest = nullptr);#endifvoid setMethod(WebRequestMethodComposite method) {_method = std::move(method);}void setMaxContentLength(int maxContentLength) {_maxContentLength = maxContentLength;}void onRequest(ArJsonRequestHandlerFunction fn) {_onRequest = fn;}bool canHandle(AsyncWebServerRequest *request) const final;void handleRequest(AsyncWebServerRequest *request) final;void handleUpload(__asyncws_unused AsyncWebServerRequest *request, __asyncws_unused const String &filename, __asyncws_unused size_t index, __asyncws_unused uint8_t *data,__asyncws_unused size_t len, __asyncws_unused bool final) final {}void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) final;bool isRequestHandlerTrivial() const final {return !_onRequest;}};#endif // ASYNC_JSON_SUPPORT == 1