// // connection.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 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_CONNECTION_HPP #define HTTP_CONNECTION_HPP #include #include #include #include "reply.hpp" #include "request.hpp" #include "request_handler.hpp" #include "request_parser.hpp" #ifndef SSL_R_SHORT_READ #define SSL_R_SHORT_READ 219 #endif #include "ssl/ssl_locl.h" #include #if defined(close) #undef close #endif typedef boost::asio::ssl::stream ssl_socket; namespace http { namespace server { class connection_manager; /// Represents a single connection from a client. class connection : public std::enable_shared_from_this { public: connection(const connection&) = delete; connection& operator=(const connection&) = delete; /// Construct a connection with the given socket. explicit connection(std::shared_ptr newSocketPtr, connection_manager& manager, request_handler& handler, boost::asio::io_context& io_context); /// Start the first asynchronous operation for the connection. void start(); /// Stop all asynchronous operations associated with the connection. void stop(); private: void doHandshake(); /// Perform an asynchronous read operation. void do_read(); /// Perform an asynchronous write operation. void do_write(); /// Socket for the connection. //boost::asio::ip::tcp::socket socket_; std::shared_ptr socketPtr; /// The manager for this connection. connection_manager& connection_manager_; /// The handler used to process the incoming request. request_handler& request_handler_; /// Buffer for incoming data. std::array buffer_; /// The incoming request. request request_; /// The parser for the incoming request. request_parser request_parser_; /// The reply to be sent back to the client. reply reply_; boost::asio::io_context& io_context_; boost::asio::ip::tcp::socket outsideSocket_; std::array forwardBuffer; std::array backwardBuffer; void do_try_connect_remote(std::string host, std::string port); void transferDataForward(); void transferDataBackward(); }; typedef std::shared_ptr connection_ptr; } // namespace server } // namespace http #endif // HTTP_CONNECTION_HPP