1 // 2 // connection.hpp 3 // ~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef HTTP_CONNECTION_HPP 12 #define HTTP_CONNECTION_HPP 13 14 #include <boost/asio.hpp> 15 #include <boost/array.hpp> 16 #include <boost/noncopyable.hpp> 17 #include <boost/shared_ptr.hpp> 18 #include <boost/enable_shared_from_this.hpp> 19 #include "reply.hpp" 20 #include "request.hpp" 21 #include "request_handler.hpp" 22 #include "request_parser.hpp" 23 24 namespace http { 25 namespace server { 26 27 class connection_manager; 28 29 /// Represents a single connection from a client. 30 class connection 31 : public boost::enable_shared_from_this<connection>, 32 private boost::noncopyable 33 { 34 public: 35 /// Construct a connection with the given io_context. 36 explicit connection(boost::asio::io_context& io_context, 37 connection_manager& manager, request_handler& handler); 38 39 /// Get the socket associated with the connection. 40 boost::asio::ip::tcp::socket& socket(); 41 42 /// Start the first asynchronous operation for the connection. 43 void start(); 44 45 /// Stop all asynchronous operations associated with the connection. 46 void stop(); 47 48 private: 49 /// Handle completion of a read operation. 50 void handle_read(const boost::system::error_code& e, 51 std::size_t bytes_transferred); 52 53 /// Handle completion of a write operation. 54 void handle_write(const boost::system::error_code& e); 55 56 /// Socket for the connection. 57 boost::asio::ip::tcp::socket socket_; 58 59 /// The manager for this connection. 60 connection_manager& connection_manager_; 61 62 /// The handler used to process the incoming request. 63 request_handler& request_handler_; 64 65 /// Buffer for incoming data. 66 boost::array<char, 8192> buffer_; 67 68 /// The incoming request. 69 request request_; 70 71 /// The parser for the incoming request. 72 request_parser request_parser_; 73 74 /// The reply to be sent back to the client. 75 reply reply_; 76 }; 77 78 typedef boost::shared_ptr<connection> connection_ptr; 79 80 } // namespace server 81 } // namespace http 82 83 #endif // HTTP_CONNECTION_HPP 84