.. _program_listing_file_stream-client_stream_http_socket.hpp: Program Listing for File http_socket.hpp ======================================== |exhale_lsh| :ref:`Return to documentation for file ` (``stream-client/stream/http_socket.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include "detail/static_allocator.hpp" #include "dgram_socket.hpp" #include "ssl_stream_socket.hpp" #include "stream_socket.hpp" #include #include #include #include #include #include namespace stream_client { namespace http { template class base_socket { public: static const size_t kHeaderLimit; static const size_t kBodyLimit; using allocator_type = std::allocator; using next_layer_type = typename std::remove_reference::type; using protocol_type = typename next_layer_type::protocol_type; using endpoint_type = typename next_layer_type::endpoint_type; using clock_type = typename next_layer_type::clock_type; using time_duration_type = typename next_layer_type::time_duration_type; using time_point_type = typename next_layer_type::time_point_type; template ::type, base_socket>::value>::type> base_socket(Arg1&& arg1, ArgN&&... argn) : stream_(std::forward(arg1), std::forward(argn)...) , buffer_(kBodyLimit + kHeaderLimit) { } base_socket(const base_socket& other) = delete; base_socket& operator=(const base_socket& other) = delete; base_socket(base_socket&& other) = default; base_socket& operator=(base_socket&& other) = default; virtual ~base_socket() = default; template boost::optional> perform(const boost::beast::http::request& request, boost::system::error_code& ec, const time_point_type& deadline); template inline boost::optional> perform(const boost::beast::http::request& request, boost::system::error_code& ec, const time_duration_type& timeout) { return perform(request, ec, clock_type::now() + timeout); } template inline boost::optional> perform(const boost::beast::http::request& request, boost::system::error_code& ec) { return perform(request, ec, stream_.io_timeout()); } template inline boost::beast::http::response perform(const boost::beast::http::request& request) { boost::system::error_code ec; auto response = perform(request, ec); if (ec) { throw boost::system::system_error{ec}; } if (!response) { throw boost::system::system_error{boost::asio::error::operation_aborted}; } return *response; } inline const next_layer_type& next_layer() const { return stream_; } inline next_layer_type& next_layer() { return stream_; } inline bool is_open() const { return next_layer().is_open(); } protected: template void send_request(const boost::beast::http::request& request, boost::system::error_code& ec, const time_point_type& deadline); template void recv_response(Parser& response_parser, DynamicBuffer& buffer, boost::system::error_code& ec, const time_point_type& deadline); template boost::optional> recv_response(boost::system::error_code& ec, const time_point_type& deadline); private: Stream stream_; boost::beast::basic_flat_buffer buffer_; }; using http_client = base_socket<::stream_client::tcp_client>; using https_client = base_socket<::stream_client::ssl::ssl_client>; } // namespace http } // namespace stream_client #include "impl/http_socket.ipp"