#pragma once #include "fastcgiprocess.h" #include "fcgiid.h" #include #include #include #include #include class fcgi_eof_error: public std::runtime_error { public: fcgi_eof_error(const std::string& what_arg): std::runtime_error(what_arg) {} }; class fcgi_broken_pipe_error: public std::runtime_error { public: fcgi_broken_pipe_error(const std::string& what_arg): std::runtime_error(what_arg) {} }; class Socket { std::mutex m_mutex; // guard socket use in different threads FCGI_ID m_fcgi_id; public: virtual ~Socket() {} std::mutex& getMutex(); FCGI_ID& fcgi_id(); virtual void open() = 0; virtual void close() = 0; virtual bool is_open() = 0; virtual size_t write(const std::vector& data) = 0; virtual size_t read(std::vector& data) = 0; }; class SocketFactory { boost::asio::io_context m_io_context; public: SocketFactory(); std::shared_ptr create(const std::string& name); }; class TCPSocket: public Socket { boost::asio::io_context& m_io_context; std::string m_host; std::string m_port; boost::asio::ip::tcp::socket m_socket; public: TCPSocket(const std::string& host, const std::string& port, boost::asio::io_context& io_context); ~TCPSocket() override; void open() override; void close() override; bool is_open() override; size_t write(const std::vector& data) override; size_t read(std::vector& data) override; }; class FileSocket: public Socket { std::string m_app_addr; boost::asio::local::stream_protocol::socket m_socket; public: FileSocket(const std::string& app_addr, boost::asio::io_context& io_context); ~FileSocket() override; void open() override; void close() override; bool is_open() override; size_t write(const std::vector& data) override; size_t read(std::vector& data) override; }; // File Socket, with Application started by us class FileSocketApp: public Socket { public: FileSocketApp(const std::string& app_addr, boost::asio::io_context& io_context); ~FileSocketApp() override; void open() override; void close() override; bool is_open() override; size_t write(const std::vector& data) override; size_t read(std::vector& data) override; private: std::string m_socket_file; FastCGIProcess m_fcgi_process; // Application server FileSocket m_file_socket; // Connection from client side };