diff options
Diffstat (limited to 'plugins/fcgi/fcgi.h')
-rw-r--r-- | plugins/fcgi/fcgi.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/plugins/fcgi/fcgi.h b/plugins/fcgi/fcgi.h index 7edfe91..164fecb 100644 --- a/plugins/fcgi/fcgi.h +++ b/plugins/fcgi/fcgi.h @@ -2,8 +2,60 @@ #include "../../plugin_interface.h" +#include <set> +#include <cstdint> + +// TODO: multithreading +class FCGI_ID +{ + std::set<uint16_t >m_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; + public: fcgi_plugin(); ~fcgi_plugin(); @@ -15,6 +67,7 @@ public: std::function<void(const std::string& key, const std::string& value)>& SetResponseHeader // to be added to result string ); + std::string fcgiQuery(FCGIContext& context); }; extern "C" BOOST_SYMBOL_EXPORT fcgi_plugin webserver_plugin; |