#pragma once #include "../../plugin_interface.h" #include #include #include #include // TODO: multithreading class FCGI_ID { std::setm_unused; uint16_t m_current_max{}; public: FCGI_ID(){} // starting at 1 uint16_t getID(){ if (m_unused.empty()) { m_current_max++; return m_current_max; } else { uint16_t result{*m_unused.begin()}; m_unused.erase(m_unused.begin()); return result; } } void putID(uint16_t id){ m_unused.insert(id); } }; // automatically reserves ID, and releases it via RAII class FCGI_ID_Guard { FCGI_ID& m_fcgi_id; uint16_t m_id; public: FCGI_ID_Guard(FCGI_ID& fcgi_id): m_fcgi_id(fcgi_id), m_id(fcgi_id.getID()) { } ~FCGI_ID_Guard() { m_fcgi_id.putID(m_id); } uint16_t getID() const { return m_id; } }; struct FCGIContext; class fcgi_plugin: public webserver_plugin_interface { FCGI_ID m_fcgi_id; boost::asio::io_context m_io_context; boost::asio::ip::tcp::resolver m_resolver; std::mutex m_socket_mutex; // guard m_socket use in different threads std::unordered_map m_sockets; public: fcgi_plugin(); ~fcgi_plugin(); std::string name(); std::string generate_page( std::function& GetServerParam, std::function& GetRequestParam, // request including body (POST...) std::function& SetResponseHeader // to be added to result string ); std::string fcgiQuery(FCGIContext& context); }; extern "C" BOOST_SYMBOL_EXPORT fcgi_plugin webserver_plugin; fcgi_plugin webserver_plugin;