diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8089c6a..ef80faf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,6 +106,9 @@ jobs: - env: ci-arduino-3 board: esp32-h2-devkitm-1 + - env: ci-arduino-3-no-json + board: esp32dev + - env: ci-arduino-310rc1 board: esp32dev - env: ci-arduino-310rc1 diff --git a/examples/SimpleServer/SimpleServer.ino b/examples/SimpleServer/SimpleServer.ino index b37ba6a..67419d5 100644 --- a/examples/SimpleServer/SimpleServer.ino +++ b/examples/SimpleServer/SimpleServer.ino @@ -19,9 +19,12 @@ #include -#include -#include -#include +#if ASYNC_JSON_SUPPORT == 1 + #include + #include + #include +#endif + #include AsyncWebServer server(80); @@ -103,8 +106,10 @@ void notFound(AsyncWebServerRequest* request) { request->send(404, "text/plain", "Not found"); } +#if ASYNC_JSON_SUPPORT == 1 AsyncCallbackJsonWebHandler* jsonHandler = new AsyncCallbackJsonWebHandler("/json2"); AsyncCallbackMessagePackWebHandler* msgPackHandler = new AsyncCallbackMessagePackWebHandler("/msgpack2"); +#endif void setup() { @@ -293,6 +298,7 @@ void setup() { request->send(200, "text/plain", "Hello, POST: " + message); }); +#if ASYNC_JSON_SUPPORT == 1 // JSON // receives JSON and sends JSON @@ -338,6 +344,7 @@ void setup() { response->setLength(); request->send(response); }); +#endif events.onConnect([](AsyncEventSourceClient* client) { if (client->lastId()) { @@ -376,8 +383,11 @@ void setup() { server.addHandler(&events); server.addHandler(&ws); + +#if ASYNC_JSON_SUPPORT == 1 server.addHandler(jsonHandler); server.addHandler(msgPackHandler); +#endif server.onNotFound(notFound); diff --git a/platformio.ini b/platformio.ini index 661e4a6..d242032 100644 --- a/platformio.ini +++ b/platformio.ini @@ -36,6 +36,13 @@ platform = https://github.com/pioarduino/platform-espressif32/releases/download/ ; board = esp32-s3-devkitc-1 ; board = esp32-c6-devkitc-1 +[env:arduino-3-no-json] +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.05/platform-espressif32.zip +; board = esp32-s3-devkitc-1 +; board = esp32-c6-devkitc-1 +lib_deps = + mathieucarbou/AsyncTCP @ 3.2.5 + [env:arduino-310rc1] platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.10-rc1/platform-espressif32.zip ; board = esp32-s3-devkitc-1 @@ -74,6 +81,12 @@ board = ${sysenv.PIO_BOARD} platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.05/platform-espressif32.zip board = ${sysenv.PIO_BOARD} +[env:ci-arduino-3-no-json] +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.05/platform-espressif32.zip +board = ${sysenv.PIO_BOARD} +lib_deps = + mathieucarbou/AsyncTCP @ 3.2.5 + [env:ci-arduino-310rc1] platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.10-rc1/platform-espressif32.zip board = ${sysenv.PIO_BOARD} diff --git a/src/AsyncJson.cpp b/src/AsyncJson.cpp index 511f2ec..ec464d1 100644 --- a/src/AsyncJson.cpp +++ b/src/AsyncJson.cpp @@ -1,6 +1,8 @@ #include "AsyncJson.h" -#if ARDUINOJSON_VERSION_MAJOR == 5 +#if ASYNC_JSON_SUPPORT == 1 + + #if ARDUINOJSON_VERSION_MAJOR == 5 AsyncJsonResponse::AsyncJsonResponse(bool isArray) : _isValid{false} { _code = 200; _contentType = JSON_MIMETYPE; @@ -9,7 +11,7 @@ AsyncJsonResponse::AsyncJsonResponse(bool isArray) : _isValid{false} { else _root = _jsonBuffer.createObject(); } -#elif ARDUINOJSON_VERSION_MAJOR == 6 + #elif ARDUINOJSON_VERSION_MAJOR == 6 AsyncJsonResponse::AsyncJsonResponse(bool isArray, size_t maxJsonBufferSize) : _jsonBuffer(maxJsonBufferSize), _isValid{false} { _code = 200; _contentType = JSON_MIMETYPE; @@ -18,7 +20,7 @@ AsyncJsonResponse::AsyncJsonResponse(bool isArray, size_t maxJsonBufferSize) : _ else _root = _jsonBuffer.createNestedObject(); } -#else + #else AsyncJsonResponse::AsyncJsonResponse(bool isArray) : _isValid{false} { _code = 200; _contentType = JSON_MIMETYPE; @@ -27,14 +29,14 @@ AsyncJsonResponse::AsyncJsonResponse(bool isArray) : _isValid{false} { else _root = _jsonBuffer.add(); } -#endif + #endif size_t AsyncJsonResponse::setLength() { -#if ARDUINOJSON_VERSION_MAJOR == 5 + #if ARDUINOJSON_VERSION_MAJOR == 5 _contentLength = _root.measureLength(); -#else + #else _contentLength = measureJson(_root); -#endif + #endif if (_contentLength) { _isValid = true; } @@ -43,26 +45,26 @@ size_t AsyncJsonResponse::setLength() { size_t AsyncJsonResponse::_fillBuffer(uint8_t* data, size_t len) { ChunkPrint dest(data, _sentLength, len); -#if ARDUINOJSON_VERSION_MAJOR == 5 + #if ARDUINOJSON_VERSION_MAJOR == 5 _root.printTo(dest); -#else + #else serializeJson(_root, dest); -#endif + #endif return len; } -#if ARDUINOJSON_VERSION_MAJOR == 6 + #if ARDUINOJSON_VERSION_MAJOR == 6 PrettyAsyncJsonResponse::PrettyAsyncJsonResponse(bool isArray, size_t maxJsonBufferSize) : AsyncJsonResponse{isArray, maxJsonBufferSize} {} -#else + #else PrettyAsyncJsonResponse::PrettyAsyncJsonResponse(bool isArray) : AsyncJsonResponse{isArray} {} -#endif + #endif size_t PrettyAsyncJsonResponse::setLength() { -#if ARDUINOJSON_VERSION_MAJOR == 5 + #if ARDUINOJSON_VERSION_MAJOR == 5 _contentLength = _root.measurePrettyLength(); -#else + #else _contentLength = measureJsonPretty(_root); -#endif + #endif if (_contentLength) { _isValid = true; } @@ -71,21 +73,21 @@ size_t PrettyAsyncJsonResponse::setLength() { size_t PrettyAsyncJsonResponse::_fillBuffer(uint8_t* data, size_t len) { ChunkPrint dest(data, _sentLength, len); -#if ARDUINOJSON_VERSION_MAJOR == 5 + #if ARDUINOJSON_VERSION_MAJOR == 5 _root.prettyPrintTo(dest); -#else + #else serializeJsonPretty(_root, dest); -#endif + #endif return len; } -#if ARDUINOJSON_VERSION_MAJOR == 6 + #if ARDUINOJSON_VERSION_MAJOR == 6 AsyncCallbackJsonWebHandler::AsyncCallbackJsonWebHandler(const String& uri, ArJsonRequestHandlerFunction onRequest, size_t maxJsonBufferSize) : _uri(uri), _method(HTTP_GET | HTTP_POST | HTTP_PUT | HTTP_PATCH), _onRequest(onRequest), maxJsonBufferSize(maxJsonBufferSize), _maxContentLength(16384) {} -#else + #else AsyncCallbackJsonWebHandler::AsyncCallbackJsonWebHandler(const String& uri, ArJsonRequestHandlerFunction onRequest) : _uri(uri), _method(HTTP_GET | HTTP_POST | HTTP_PUT | HTTP_PATCH), _onRequest(onRequest), _maxContentLength(16384) {} -#endif + #endif bool AsyncCallbackJsonWebHandler::canHandle(AsyncWebServerRequest* request) { if (!_onRequest) @@ -112,21 +114,21 @@ void AsyncCallbackJsonWebHandler::handleRequest(AsyncWebServerRequest* request) return; } else if (request->_tempObject != NULL) { -#if ARDUINOJSON_VERSION_MAJOR == 5 + #if ARDUINOJSON_VERSION_MAJOR == 5 DynamicJsonBuffer jsonBuffer; JsonVariant json = jsonBuffer.parse((uint8_t*)(request->_tempObject)); if (json.success()) { -#elif ARDUINOJSON_VERSION_MAJOR == 6 + #elif ARDUINOJSON_VERSION_MAJOR == 6 DynamicJsonDocument jsonBuffer(this->maxJsonBufferSize); DeserializationError error = deserializeJson(jsonBuffer, (uint8_t*)(request->_tempObject)); if (!error) { JsonVariant json = jsonBuffer.as(); -#else + #else JsonDocument jsonBuffer; DeserializationError error = deserializeJson(jsonBuffer, (uint8_t*)(request->_tempObject)); if (!error) { JsonVariant json = jsonBuffer.as(); -#endif + #endif _onRequest(request, json); return; @@ -148,4 +150,6 @@ void AsyncCallbackJsonWebHandler::handleBody(AsyncWebServerRequest* request, uin memcpy((uint8_t*)(request->_tempObject) + index, data, len); } } -} \ No newline at end of file +} + +#endif // ASYNC_JSON_SUPPORT diff --git a/src/AsyncJson.h b/src/AsyncJson.h index 0e7e61d..e0d88f0 100644 --- a/src/AsyncJson.h +++ b/src/AsyncJson.h @@ -34,16 +34,21 @@ */ #ifndef ASYNC_JSON_H_ #define ASYNC_JSON_H_ -#include -#include -#include "ChunkPrint.h" +#if __has_include("ArduinoJson.h") -#if ARDUINOJSON_VERSION_MAJOR == 6 - #ifndef DYNAMIC_JSON_DOCUMENT_SIZE - #define DYNAMIC_JSON_DOCUMENT_SIZE 1024 + #define ASYNC_JSON_SUPPORT 1 + + #include + #include + + #include "ChunkPrint.h" + + #if ARDUINOJSON_VERSION_MAJOR == 6 + #ifndef DYNAMIC_JSON_DOCUMENT_SIZE + #define DYNAMIC_JSON_DOCUMENT_SIZE 1024 + #endif #endif -#endif constexpr const char* JSON_MIMETYPE = "application/json"; @@ -53,40 +58,40 @@ constexpr const char* JSON_MIMETYPE = "application/json"; class AsyncJsonResponse : public AsyncAbstractResponse { protected: -#if ARDUINOJSON_VERSION_MAJOR == 5 + #if ARDUINOJSON_VERSION_MAJOR == 5 DynamicJsonBuffer _jsonBuffer; -#elif ARDUINOJSON_VERSION_MAJOR == 6 + #elif ARDUINOJSON_VERSION_MAJOR == 6 DynamicJsonDocument _jsonBuffer; -#else + #else JsonDocument _jsonBuffer; -#endif + #endif JsonVariant _root; bool _isValid; public: -#if ARDUINOJSON_VERSION_MAJOR == 6 + #if ARDUINOJSON_VERSION_MAJOR == 6 AsyncJsonResponse(bool isArray = false, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE); -#else + #else AsyncJsonResponse(bool isArray = false); -#endif + #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 + #if ARDUINOJSON_VERSION_MAJOR >= 6 bool overflowed() const { return _jsonBuffer.overflowed(); } -#endif + #endif }; class PrettyAsyncJsonResponse : public AsyncJsonResponse { public: -#if ARDUINOJSON_VERSION_MAJOR == 6 + #if ARDUINOJSON_VERSION_MAJOR == 6 PrettyAsyncJsonResponse(bool isArray = false, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE); -#else + #else PrettyAsyncJsonResponse(bool isArray = false); -#endif + #endif size_t setLength(); size_t _fillBuffer(uint8_t* data, size_t len); }; @@ -99,17 +104,17 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { WebRequestMethodComposite _method; ArJsonRequestHandlerFunction _onRequest; size_t _contentLength; -#if ARDUINOJSON_VERSION_MAJOR == 6 + #if ARDUINOJSON_VERSION_MAJOR == 6 const size_t maxJsonBufferSize; -#endif + #endif size_t _maxContentLength; public: -#if ARDUINOJSON_VERSION_MAJOR == 6 + #if ARDUINOJSON_VERSION_MAJOR == 6 AsyncCallbackJsonWebHandler(const String& uri, ArJsonRequestHandlerFunction onRequest = nullptr, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE); -#else + #else AsyncCallbackJsonWebHandler(const String& uri, ArJsonRequestHandlerFunction onRequest = nullptr); -#endif + #endif void setMethod(WebRequestMethodComposite method) { _method = method; } void setMaxContentLength(int maxContentLength) { _maxContentLength = maxContentLength; } @@ -121,4 +126,9 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { virtual void handleBody(AsyncWebServerRequest* request, uint8_t* data, size_t len, size_t index, size_t total) override final; virtual bool isRequestHandlerTrivial() override final { return !_onRequest; } }; + +#else // __has_include("ArduinoJson.h") + #define ASYNC_JSON_SUPPORT 0 +#endif // __has_include("ArduinoJson.h") + #endif diff --git a/src/AsyncMessagePack.cpp b/src/AsyncMessagePack.cpp index 65827d7..27e0786 100644 --- a/src/AsyncMessagePack.cpp +++ b/src/AsyncMessagePack.cpp @@ -1,5 +1,7 @@ #include "AsyncMessagePack.h" +#if ASYNC_MSG_PACK_SUPPORT == 1 + AsyncMessagePackResponse::AsyncMessagePackResponse(bool isArray) : _isValid{false} { _code = 200; _contentType = asyncsrv::T_application_msgpack; @@ -77,3 +79,5 @@ void AsyncCallbackMessagePackWebHandler::handleBody(AsyncWebServerRequest* reque } } } + +#endif // ASYNC_MSG_PACK_SUPPORT diff --git a/src/AsyncMessagePack.h b/src/AsyncMessagePack.h index 16104ef..cfb9902 100644 --- a/src/AsyncMessagePack.h +++ b/src/AsyncMessagePack.h @@ -21,10 +21,14 @@ server.addHandler(handler); */ -#include -#include +#if __has_include("ArduinoJson.h") -#include "ChunkPrint.h" + #define ASYNC_MSG_PACK_SUPPORT 1 + + #include + #include + + #include "ChunkPrint.h" class AsyncMessagePackResponse : public AsyncAbstractResponse { protected: @@ -65,3 +69,7 @@ class AsyncCallbackMessagePackWebHandler : public AsyncWebHandler { virtual void handleBody(AsyncWebServerRequest* request, uint8_t* data, size_t len, size_t index, size_t total) override final; virtual bool isRequestHandlerTrivial() override final { return _onRequest ? false : true; } }; + +#else // __has_include("ArduinoJson.h") + #define ASYNC_MSG_PACK_SUPPORT 0 +#endif // __has_include("ArduinoJson.h")