diff options
author | 2024-04-22 08:04:58 +1000 | |
---|---|---|
committer | 2024-04-22 08:04:58 +1000 | |
commit | 184292b730f4236bd4840e780fdad97ee060ec84 (patch) | |
tree | 67902161a465fe92aec78ca502de07092b8cde0f /3rdparty/asio/src/examples/cpp03/http/client/async_client.cpp | |
parent | 24154bc1f00790f344120b3a85175d6f616c5ad0 (diff) |
3rdparty/asio: Updated to 1.30.2
Diffstat (limited to '3rdparty/asio/src/examples/cpp03/http/client/async_client.cpp')
-rw-r--r-- | 3rdparty/asio/src/examples/cpp03/http/client/async_client.cpp | 204 |
1 files changed, 0 insertions, 204 deletions
diff --git a/3rdparty/asio/src/examples/cpp03/http/client/async_client.cpp b/3rdparty/asio/src/examples/cpp03/http/client/async_client.cpp deleted file mode 100644 index 210715bbd98..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/client/async_client.cpp +++ /dev/null @@ -1,204 +0,0 @@ -// -// async_client.cpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2021 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) -// - -#include <iostream> -#include <istream> -#include <ostream> -#include <string> -#include <asio.hpp> -#include <boost/bind/bind.hpp> - -using asio::ip::tcp; - -class client -{ -public: - client(asio::io_context& io_context, - const std::string& server, const std::string& path) - : resolver_(io_context), - socket_(io_context) - { - // Form the request. We specify the "Connection: close" header so that the - // server will close the socket after transmitting the response. This will - // allow us to treat all data up until the EOF as the content. - std::ostream request_stream(&request_); - request_stream << "GET " << path << " HTTP/1.0\r\n"; - request_stream << "Host: " << server << "\r\n"; - request_stream << "Accept: */*\r\n"; - request_stream << "Connection: close\r\n\r\n"; - - // Start an asynchronous resolve to translate the server and service names - // into a list of endpoints. - resolver_.async_resolve(server, "http", - boost::bind(&client::handle_resolve, this, - asio::placeholders::error, - asio::placeholders::results)); - } - -private: - void handle_resolve(const asio::error_code& err, - const tcp::resolver::results_type& endpoints) - { - if (!err) - { - // Attempt a connection to each endpoint in the list until we - // successfully establish a connection. - asio::async_connect(socket_, endpoints, - boost::bind(&client::handle_connect, this, - asio::placeholders::error)); - } - else - { - std::cout << "Error: " << err.message() << "\n"; - } - } - - void handle_connect(const asio::error_code& err) - { - if (!err) - { - // The connection was successful. Send the request. - asio::async_write(socket_, request_, - boost::bind(&client::handle_write_request, this, - asio::placeholders::error)); - } - else - { - std::cout << "Error: " << err.message() << "\n"; - } - } - - void handle_write_request(const asio::error_code& err) - { - if (!err) - { - // Read the response status line. The response_ streambuf will - // automatically grow to accommodate the entire line. The growth may be - // limited by passing a maximum size to the streambuf constructor. - asio::async_read_until(socket_, response_, "\r\n", - boost::bind(&client::handle_read_status_line, this, - asio::placeholders::error)); - } - else - { - std::cout << "Error: " << err.message() << "\n"; - } - } - - void handle_read_status_line(const asio::error_code& err) - { - if (!err) - { - // Check that response is OK. - std::istream response_stream(&response_); - std::string http_version; - response_stream >> http_version; - unsigned int status_code; - response_stream >> status_code; - std::string status_message; - std::getline(response_stream, status_message); - if (!response_stream || http_version.substr(0, 5) != "HTTP/") - { - std::cout << "Invalid response\n"; - return; - } - if (status_code != 200) - { - std::cout << "Response returned with status code "; - std::cout << status_code << "\n"; - return; - } - - // Read the response headers, which are terminated by a blank line. - asio::async_read_until(socket_, response_, "\r\n\r\n", - boost::bind(&client::handle_read_headers, this, - asio::placeholders::error)); - } - else - { - std::cout << "Error: " << err << "\n"; - } - } - - void handle_read_headers(const asio::error_code& err) - { - if (!err) - { - // Process the response headers. - std::istream response_stream(&response_); - std::string header; - while (std::getline(response_stream, header) && header != "\r") - std::cout << header << "\n"; - std::cout << "\n"; - - // Write whatever content we already have to output. - if (response_.size() > 0) - std::cout << &response_; - - // Start reading remaining data until EOF. - asio::async_read(socket_, response_, - asio::transfer_at_least(1), - boost::bind(&client::handle_read_content, this, - asio::placeholders::error)); - } - else - { - std::cout << "Error: " << err << "\n"; - } - } - - void handle_read_content(const asio::error_code& err) - { - if (!err) - { - // Write all of the data that has been read so far. - std::cout << &response_; - - // Continue reading remaining data until EOF. - asio::async_read(socket_, response_, - asio::transfer_at_least(1), - boost::bind(&client::handle_read_content, this, - asio::placeholders::error)); - } - else if (err != asio::error::eof) - { - std::cout << "Error: " << err << "\n"; - } - } - - tcp::resolver resolver_; - tcp::socket socket_; - asio::streambuf request_; - asio::streambuf response_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cout << "Usage: async_client <server> <path>\n"; - std::cout << "Example:\n"; - std::cout << " async_client www.boost.org /LICENSE_1_0.txt\n"; - return 1; - } - - asio::io_context io_context; - client c(io_context, argv[1], argv[2]); - io_context.run(); - } - catch (std::exception& e) - { - std::cout << "Exception: " << e.what() << "\n"; - } - - return 0; -} |