/* WEBSERVER MODULE Copyright (C) 2016-2019 by Xose PĂ©rez */ #pragma once #include "espurna.h" #if WEB_SUPPORT #include #include #include #include struct AsyncWebPrintConfig { const char* const mimeType; size_t backlogCountMax; size_t backlogSizeMax; decltype(millis()) backlogTimeout; }; struct AsyncWebPrint : public Print { enum class State { None, Sending, Done, Error }; using BufferType = std::vector; // To be able to safely output data right from the request callback, // we schedule a 'printer' task that will print into the request response buffer via AsyncChunkedResponse // Note: implementation must be included in the header template static void scheduleFromRequest(const AsyncWebPrintConfig& config, AsyncWebServerRequest*, CallbackType); template static void scheduleFromRequest(AsyncWebServerRequest*, CallbackType); State getState(); void setState(State); // note: existing implementation only expects this to be available via AsyncWebPrint #if defined(ARDUINO_ESP8266_RELEASE_2_3_0) void flush(); #else void flush() final override; #endif size_t write(uint8_t) final override; size_t write(const uint8_t *buffer, size_t size) final override; const char* const mimeType; const size_t backlogCountMax; const size_t backlogSizeMax; const decltype(millis()) backlogTimeout; protected: std::list _buffers; AsyncWebServerRequest* const _request; State _state; AsyncWebPrint(const AsyncWebPrintConfig&, AsyncWebServerRequest* req); bool _addBuffer(); bool _exhaustBuffers(); void _prepareRequest(); }; using web_body_callback_f = std::function; using web_request_callback_f = std::function; AsyncWebServer& webServer(); bool webAuthenticate(AsyncWebServerRequest *request); void webLog(AsyncWebServerRequest *request); void webBodyRegister(web_body_callback_f); void webRequestRegister(web_request_callback_f); uint16_t webPort(); void webSetup(); #endif // WEB_SUPPORT == 1