// // server.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_SERVER_HPP #define HTTP_SERVER4_SERVER_HPP #include #include #include #include #include #include "request_parser.hpp" namespace http { namespace server4 { struct request; struct reply; /// The top-level coroutine of the HTTP server. class server : boost::asio::coroutine { public: /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit server(boost::asio::io_context& io_context, const std::string& address, const std::string& port, boost::function request_handler); /// Perform work associated with the server. void operator()( boost::system::error_code ec = boost::system::error_code(), std::size_t length = 0); private: typedef boost::asio::ip::tcp tcp; /// The user-supplied handler for all incoming requests. boost::function request_handler_; /// Acceptor used to listen for incoming connections. boost::shared_ptr acceptor_; /// The current connection from a client. boost::shared_ptr socket_; /// Buffer for incoming data. boost::shared_ptr > buffer_; /// The incoming request. boost::shared_ptr request_; /// Whether the request is valid or not. boost::tribool valid_request_; /// The parser for the incoming request. request_parser request_parser_; /// The reply to be sent back to the client. boost::shared_ptr reply_; }; } // namespace server4 } // namespace http #endif // HTTP_SERVER4_SERVER_HPP