/*============================================================================ AbyssServer.hpp ============================================================================== This declares class AbyssServer, which provides facilities for running an Abyss server, which is a simple HTTP server ============================================================================*/ #ifndef ABYSS_SERVER_HPP_INCLUDED #define ABYSS_SERVER_HPP_INCLUDED #include #include #include #include #if defined(__GNUC__) && __GNUC__ < 3 #include #else #include #endif #include #include namespace xmlrpc_c { #ifdef XMLRPC_BUILDING_ABYSSPP #define XMLRPC_ABYSSPP_EXPORTED XMLRPC_DLLEXPORT #else #define XMLRPC_ABYSSPP_EXPORTED #endif class XMLRPC_ABYSSPP_EXPORTED AbyssServer { /*---------------------------------------------------------------------------- An object of this class represents an Abyss HTTP server. The class does not provide any specific HTTP service, such as web service from files or XML-RPC. Rather, it provides a basic framework that handles the details of the HTTP protocol and the user provides request handlers that do the real work. For example, the user can provide an XML-RPC request handler and then the server is an XML-RPC server. -----------------------------------------------------------------------------*/ public: class XMLRPC_ABYSSPP_EXPORTED Exception : public std::runtime_error { public: Exception(unsigned short const httpStatusCode, std::string const& explanation); unsigned short httpStatusCode() const; private: unsigned short _httpStatusCode; }; class XMLRPC_ABYSSPP_EXPORTED Session { public: class Impl; Session(TSession * const cSessionP); ~Session(); enum Method { METHOD_UNKNOWN, METHOD_GET, METHOD_PUT, METHOD_HEAD, METHOD_POST, METHOD_DELETE, METHOD_TRACE, METHOD_OPTIONS }; Method method() const; std::string const requestLine() const; std::string const uriPathName() const; std::vector const uriPathNameSegment() const; bool uriHasQuery() const; std::string const uriQuery() const; std::map const formInput() const; bool hasHost() const; std::string const host() const; bool hasFrom() const; std::string const from() const; bool hasUseragent() const; std::string const useragent() const; bool hasReferer() const; std::string const referer() const; bool userIsAuthenticated() const; std::string const user() const; unsigned short port() const; bool keepalive() const; bool hasContentLength() const; size_t contentLength() const; std::string const body(); void readRequestBody(unsigned char * const buffer, size_t const size); void readSomeRequestBody(size_t const max, unsigned char * const buffer, bool * const eofP, size_t * const byteCtP); void getHeaderField(std::string const& fieldName, bool * const isPresentP, std::string * const valueP) const; std::string const headerFieldValue(std::string const& fieldName) const; void setRespStatus(unsigned short const statusCode); void setRespContentType(std::string const& contentType); void setRespContentLength(uint64_t const contentLength); void startWriteResponse(); void endWriteResponse(); void writeResponseBody(const unsigned char * const data, size_t const size); void writeResponse(std::string const& body); void sendErrorResponse(std::string const& explanation); void sendErrorResponse(Exception const& e); private: Impl * const implP; }; class XMLRPC_ABYSSPP_EXPORTED ReqHandler { /*------------------------------------------------------------------------ An object of this class handles HTTP requests, which essentially means it provides responses to them. An AbyssServer object calls methods of objects of this class to execute HTTP requests. The object also decides and reports whether a particular request is appropriate for this object to handle. An AbyssServer object may have multiple ReqHandler objects on which it can call, each specializing in different kinds of requests. This is an abstract base class. A derived class knows how to handle, for example, HTTP requests that are XML-RPC RPCs. -------------------------------------------------------------------------*/ public: virtual ~ReqHandler(); virtual void handleRequest(Session * const sessionP, bool * const handledP) = 0; virtual size_t handleReqStackSize() const; virtual void terminate(); }; AbyssServer(AbyssChanSwitch * const chanSwitchP); ~AbyssServer(); void addRequestHandler(ReqHandler * const handlerP); void init(); void run(); void runOnce(); void terminate(); void resetTerminate(); private: TServer cServer; }; } // namespace XMLRPC_ABYSSPP_EXPORTED std::ostream& operator<<(std::ostream & out, xmlrpc_c::AbyssServer::Session::Method const& method); #endif