/* Part of WEBSERVER MODULE Copyright (C) 2016-2019 by Xose PĂ©rez */ #pragma once #include "espurna.h" #include #include #include #include namespace espurna { namespace web { namespace print { struct Config { struct Backlog { size_t count; size_t size; duration::Seconds timeout; }; const char* const mimeType; Backlog backlog; }; class RequestPrint : public Print { public: enum class State { None, Sending, Done, Error }; using BufferType = std::vector; using TimeSource = espurna::time::CoreClock; // 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(Config config, AsyncWebServerRequest*, CallbackType); template static void scheduleFromRequest(AsyncWebServerRequest*, CallbackType); void flush() final override; size_t write(uint8_t) final override; size_t write(const uint8_t *buffer, size_t size) final override; State state() const { return _state; } void state(State state) { _state = state; } AsyncWebServerRequest* request() const { return _request; } private: Config _config; std::list _buffers; AsyncWebServerRequest* const _request; State _state; RequestPrint(Config config, AsyncWebServerRequest* request) : _config(config), _request(request), _state(State::None) {} bool _addBuffer(); bool _exhaustBuffers(); void _prepareRequest(); size_t _handleRequest(uint8_t* data, size_t maxLen); void _onDisconnect(); template void _callback(CallbackType&&); }; template void scheduleFromRequest(AsyncWebServerRequest* request, T&& callback) { RequestPrint::scheduleFromRequest(request, std::forward(callback)); } } // namespace print } // namespace web } // namespace espurna