diff options
Diffstat (limited to '3rdparty/asio/src/examples/cpp03')
178 files changed, 0 insertions, 15973 deletions
diff --git a/3rdparty/asio/src/examples/cpp03/Makefile.am b/3rdparty/asio/src/examples/cpp03/Makefile.am deleted file mode 100644 index adacab88ef6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/Makefile.am +++ /dev/null @@ -1,250 +0,0 @@ -AUTOMAKE_OPTIONS = subdir-objects - -if SEPARATE_COMPILATION -noinst_LIBRARIES = libasio.a -libasio_a_SOURCES = ../../asio.cpp -if HAVE_OPENSSL -libasio_a_SOURCES += ../../asio_ssl.cpp -endif -LDADD = libasio.a -endif - -noinst_PROGRAMS = \ - allocation/server \ - buffers/reference_counted \ - chat/chat_client \ - chat/chat_server \ - echo/async_tcp_echo_server \ - echo/async_udp_echo_server \ - echo/blocking_tcp_echo_client \ - echo/blocking_tcp_echo_server \ - echo/blocking_udp_echo_client \ - echo/blocking_udp_echo_server \ - http/client/async_client \ - http/client/sync_client \ - http/server/http_server \ - http/server2/http_server \ - http/server3/http_server \ - http/server4/http_server \ - icmp/ping \ - invocation/prioritised_handlers \ - iostreams/daytime_client \ - iostreams/daytime_server \ - iostreams/http_client \ - multicast/receiver \ - multicast/sender \ - nonblocking/third_party_lib \ - porthopper/client \ - porthopper/server \ - services/daytime_client \ - socks4/sync_client \ - timeouts/async_tcp_client \ - timeouts/blocking_tcp_client \ - timeouts/blocking_udp_client \ - timeouts/server \ - timers/time_t_timer \ - tutorial/timer1/timer \ - tutorial/timer2/timer \ - tutorial/timer3/timer \ - tutorial/timer4/timer \ - tutorial/timer5/timer \ - tutorial/daytime1/client \ - tutorial/daytime2/server \ - tutorial/daytime3/server \ - tutorial/daytime4/client \ - tutorial/daytime5/server \ - tutorial/daytime6/server \ - tutorial/daytime7/server - -if !WINDOWS_TARGET -noinst_PROGRAMS += \ - chat/posix_chat_client \ - fork/daemon \ - fork/process_per_connection \ - local/connect_pair \ - local/iostream_client \ - local/stream_server \ - local/stream_client -endif - -if WINDOWS_TARGET -noinst_PROGRAMS += \ - windows/transmit_file -endif - -if HAVE_OPENSSL -noinst_PROGRAMS += \ - ssl/client \ - ssl/server -endif - -if HAVE_BOOST_COROUTINE -noinst_PROGRAMS += \ - spawn/echo_server \ - spawn/parallel_grep -endif - -noinst_HEADERS = \ - chat/chat_message.hpp \ - services/basic_logger.hpp \ - services/logger.hpp \ - services/logger_service.hpp - -AM_CXXFLAGS = -I$(srcdir)/../../../include - -allocation_server_SOURCES = allocation/server.cpp -buffers_reference_counted_SOURCES = buffers/reference_counted.cpp -chat_chat_client_SOURCES = chat/chat_client.cpp -chat_chat_server_SOURCES = chat/chat_server.cpp -echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp -echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp -echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp -echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp -echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp -echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp -http_client_async_client_SOURCES = http/client/async_client.cpp -http_client_sync_client_SOURCES = http/client/sync_client.cpp -http_server_http_server_SOURCES = \ - http/server/connection.cpp \ - http/server/connection_manager.cpp \ - http/server/main.cpp \ - http/server/mime_types.cpp \ - http/server/reply.cpp \ - http/server/request_handler.cpp \ - http/server/request_parser.cpp \ - http/server/server.cpp -http_server2_http_server_SOURCES = \ - http/server2/connection.cpp \ - http/server2/io_context_pool.cpp \ - http/server2/main.cpp \ - http/server2/mime_types.cpp \ - http/server2/reply.cpp \ - http/server2/request_handler.cpp \ - http/server2/request_parser.cpp \ - http/server2/server.cpp -http_server3_http_server_SOURCES = \ - http/server3/connection.cpp \ - http/server3/main.cpp \ - http/server3/mime_types.cpp \ - http/server3/reply.cpp \ - http/server3/request_handler.cpp \ - http/server3/request_parser.cpp \ - http/server3/server.cpp -http_server4_http_server_SOURCES = \ - http/server4/file_handler.cpp \ - http/server4/main.cpp \ - http/server4/mime_types.cpp \ - http/server4/reply.cpp \ - http/server4/request_parser.cpp \ - http/server4/server.cpp -icmp_ping_SOURCES = icmp/ping.cpp -invocation_prioritised_handlers_SOURCES = invocation/prioritised_handlers.cpp -iostreams_daytime_client_SOURCES = iostreams/daytime_client.cpp -iostreams_daytime_server_SOURCES = iostreams/daytime_server.cpp -iostreams_http_client_SOURCES = iostreams/http_client.cpp -multicast_receiver_SOURCES = multicast/receiver.cpp -multicast_sender_SOURCES = multicast/sender.cpp -nonblocking_third_party_lib_SOURCES = nonblocking/third_party_lib.cpp -porthopper_client_SOURCES = porthopper/client.cpp -porthopper_server_SOURCES = porthopper/server.cpp -services_daytime_client_SOURCES = \ - services/daytime_client.cpp \ - services/logger_service.cpp -socks4_sync_client_SOURCES = socks4/sync_client.cpp -timeouts_async_tcp_client_SOURCES = timeouts/async_tcp_client.cpp -timeouts_blocking_tcp_client_SOURCES = timeouts/blocking_tcp_client.cpp -timeouts_blocking_udp_client_SOURCES = timeouts/blocking_udp_client.cpp -timeouts_server_SOURCES = timeouts/server.cpp -timers_time_t_timer_SOURCES = timers/time_t_timer.cpp -tutorial_timer1_timer_SOURCES = tutorial/timer1/timer.cpp -tutorial_timer2_timer_SOURCES = tutorial/timer2/timer.cpp -tutorial_timer3_timer_SOURCES = tutorial/timer3/timer.cpp -tutorial_timer4_timer_SOURCES = tutorial/timer4/timer.cpp -tutorial_timer5_timer_SOURCES = tutorial/timer5/timer.cpp -tutorial_daytime1_client_SOURCES = tutorial/daytime1/client.cpp -tutorial_daytime2_server_SOURCES = tutorial/daytime2/server.cpp -tutorial_daytime3_server_SOURCES = tutorial/daytime3/server.cpp -tutorial_daytime4_client_SOURCES = tutorial/daytime4/client.cpp -tutorial_daytime5_server_SOURCES = tutorial/daytime5/server.cpp -tutorial_daytime6_server_SOURCES = tutorial/daytime6/server.cpp -tutorial_daytime7_server_SOURCES = tutorial/daytime7/server.cpp - -if !WINDOWS_TARGET -chat_posix_chat_client_SOURCES = chat/posix_chat_client.cpp -fork_daemon_SOURCES = fork/daemon.cpp -fork_process_per_connection_SOURCES = fork/process_per_connection.cpp -local_connect_pair_SOURCES = local/connect_pair.cpp -local_iostream_client_SOURCES = local/iostream_client.cpp -local_stream_server_SOURCES = local/stream_server.cpp -local_stream_client_SOURCES = local/stream_client.cpp -endif - -if WINDOWS_TARGET -windows_transmit_file_SOURCES = windows/transmit_file.cpp -endif - -if HAVE_OPENSSL -ssl_client_SOURCES = ssl/client.cpp -ssl_server_SOURCES = ssl/server.cpp -endif - -if HAVE_BOOST_COROUTINE -spawn_echo_server_SOURCES = spawn/echo_server.cpp -spawn_echo_server_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system -spawn_parallel_grep_SOURCES = spawn/parallel_grep.cpp -spawn_parallel_grep_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system -endif - -EXTRA_DIST = \ - http/server/connection.hpp \ - http/server/connection_manager.hpp \ - http/server/header.hpp \ - http/server/mime_types.hpp \ - http/server/reply.hpp \ - http/server/request.hpp \ - http/server/request_handler.hpp \ - http/server/request_parser.hpp \ - http/server/server.hpp \ - http/server2/connection.hpp \ - http/server2/io_context_pool.hpp \ - http/server2/header.hpp \ - http/server2/mime_types.hpp \ - http/server2/reply.hpp \ - http/server2/request.hpp \ - http/server2/request_handler.hpp \ - http/server2/request_parser.hpp \ - http/server2/server.hpp \ - http/server3/connection.hpp \ - http/server3/header.hpp \ - http/server3/mime_types.hpp \ - http/server3/reply.hpp \ - http/server3/request.hpp \ - http/server3/request_handler.hpp \ - http/server3/request_parser.hpp \ - http/server3/server.hpp \ - http/server4/file_handler.hpp \ - http/server4/header.hpp \ - http/server4/mime_types.hpp \ - http/server4/reply.hpp \ - http/server4/request.hpp \ - http/server4/request_parser.hpp \ - http/server4/server.hpp \ - icmp/icmp_header.hpp \ - icmp/ipv4_header.hpp \ - porthopper/protocol.hpp \ - serialization/client.cpp \ - serialization/server.cpp \ - serialization/connection.hpp \ - serialization/stock.hpp \ - services/basic_logger.hpp \ - services/logger.hpp \ - services/logger_service.hpp \ - socks4/socks4.hpp \ - ssl/README \ - ssl/ca.pem \ - ssl/server.pem \ - ssl/dh2048.pem \ - timers/tick_count_timer.cpp - -MAINTAINERCLEANFILES = \ - $(srcdir)/Makefile.in diff --git a/3rdparty/asio/src/examples/cpp03/allocation/.gitignore b/3rdparty/asio/src/examples/cpp03/allocation/.gitignore deleted file mode 100644 index 180ba886e58..00000000000 --- a/3rdparty/asio/src/examples/cpp03/allocation/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -server -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/allocation/server.cpp b/3rdparty/asio/src/examples/cpp03/allocation/server.cpp deleted file mode 100644 index e26eb564918..00000000000 --- a/3rdparty/asio/src/examples/cpp03/allocation/server.cpp +++ /dev/null @@ -1,238 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <iostream> -#include <boost/aligned_storage.hpp> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> -#include "asio.hpp" - -using asio::ip::tcp; - -// Class to manage the memory to be used for handler-based custom allocation. -// It contains a single block of memory which may be returned for allocation -// requests. If the memory is in use when an allocation request is made, the -// allocator delegates allocation to the global heap. -class handler_allocator - : private boost::noncopyable -{ -public: - handler_allocator() - : in_use_(false) - { - } - - void* allocate(std::size_t size) - { - if (!in_use_ && size < storage_.size) - { - in_use_ = true; - return storage_.address(); - } - else - { - return ::operator new(size); - } - } - - void deallocate(void* pointer) - { - if (pointer == storage_.address()) - { - in_use_ = false; - } - else - { - ::operator delete(pointer); - } - } - -private: - // Storage space used for handler-based custom memory allocation. - boost::aligned_storage<1024> storage_; - - // Whether the handler-based custom allocation storage has been used. - bool in_use_; -}; - -// Wrapper class template for handler objects to allow handler memory -// allocation to be customised. Calls to operator() are forwarded to the -// encapsulated handler. -template <typename Handler> -class custom_alloc_handler -{ -public: - custom_alloc_handler(handler_allocator& a, Handler h) - : allocator_(a), - handler_(h) - { - } - - template <typename Arg1> - void operator()(Arg1 arg1) - { - handler_(arg1); - } - - template <typename Arg1, typename Arg2> - void operator()(Arg1 arg1, Arg2 arg2) - { - handler_(arg1, arg2); - } - - friend void* asio_handler_allocate(std::size_t size, - custom_alloc_handler<Handler>* this_handler) - { - return this_handler->allocator_.allocate(size); - } - - friend void asio_handler_deallocate(void* pointer, std::size_t /*size*/, - custom_alloc_handler<Handler>* this_handler) - { - this_handler->allocator_.deallocate(pointer); - } - -private: - handler_allocator& allocator_; - Handler handler_; -}; - -// Helper function to wrap a handler object to add custom allocation. -template <typename Handler> -inline custom_alloc_handler<Handler> make_custom_alloc_handler( - handler_allocator& a, Handler h) -{ - return custom_alloc_handler<Handler>(a, h); -} - -class session - : public boost::enable_shared_from_this<session> -{ -public: - session(asio::io_context& io_context) - : socket_(io_context) - { - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - socket_.async_read_some(asio::buffer(data_), - make_custom_alloc_handler(allocator_, - boost::bind(&session::handle_read, - shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred))); - } - - void handle_read(const asio::error_code& error, - size_t bytes_transferred) - { - if (!error) - { - asio::async_write(socket_, - asio::buffer(data_, bytes_transferred), - make_custom_alloc_handler(allocator_, - boost::bind(&session::handle_write, - shared_from_this(), - asio::placeholders::error))); - } - } - - void handle_write(const asio::error_code& error) - { - if (!error) - { - socket_.async_read_some(asio::buffer(data_), - make_custom_alloc_handler(allocator_, - boost::bind(&session::handle_read, - shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred))); - } - } - -private: - // The socket used to communicate with the client. - tcp::socket socket_; - - // Buffer used to store data received from the client. - boost::array<char, 1024> data_; - - // The allocator to use for handler-based custom memory allocation. - handler_allocator allocator_; -}; - -typedef boost::shared_ptr<session> session_ptr; - -class server -{ -public: - server(asio::io_context& io_context, short port) - : io_context_(io_context), - acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) - { - session_ptr new_session(new session(io_context_)); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - - void handle_accept(session_ptr new_session, - const asio::error_code& error) - { - if (!error) - { - new_session->start(); - } - - new_session.reset(new session(io_context_)); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - -private: - asio::io_context& io_context_; - tcp::acceptor acceptor_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: server <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/buffers/.gitignore b/3rdparty/asio/src/examples/cpp03/buffers/.gitignore deleted file mode 100644 index abe68c665f5..00000000000 --- a/3rdparty/asio/src/examples/cpp03/buffers/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -reference_counted -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/buffers/reference_counted.cpp b/3rdparty/asio/src/examples/cpp03/buffers/reference_counted.cpp deleted file mode 100644 index 9f7455cdbbd..00000000000 --- a/3rdparty/asio/src/examples/cpp03/buffers/reference_counted.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// -// reference_counted.cpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <boost/shared_ptr.hpp> -#include <iostream> -#include <vector> - -using asio::ip::tcp; - -// A reference-counted non-modifiable buffer class. -class shared_const_buffer -{ -public: - // Construct from a std::string. - explicit shared_const_buffer(const std::string& data) - : data_(new std::vector<char>(data.begin(), data.end())), - buffer_(asio::buffer(*data_)) - { - } - - // Implement the ConstBufferSequence requirements. - typedef asio::const_buffer value_type; - typedef const asio::const_buffer* const_iterator; - const asio::const_buffer* begin() const { return &buffer_; } - const asio::const_buffer* end() const { return &buffer_ + 1; } - -private: - boost::shared_ptr<std::vector<char> > data_; - asio::const_buffer buffer_; -}; - -class session - : public boost::enable_shared_from_this<session> -{ -public: - session(asio::io_context& io_context) - : socket_(io_context) - { - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - using namespace std; // For time_t, time and ctime. - time_t now = time(0); - shared_const_buffer buffer(ctime(&now)); - asio::async_write(socket_, buffer, - boost::bind(&session::handle_write, shared_from_this())); - } - - void handle_write() - { - } - -private: - // The socket used to communicate with the client. - tcp::socket socket_; -}; - -typedef boost::shared_ptr<session> session_ptr; - -class server -{ -public: - server(asio::io_context& io_context, short port) - : io_context_(io_context), - acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) - { - session_ptr new_session(new session(io_context_)); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - - void handle_accept(session_ptr new_session, - const asio::error_code& error) - { - if (!error) - { - new_session->start(); - } - - new_session.reset(new session(io_context_)); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - -private: - asio::io_context& io_context_; - tcp::acceptor acceptor_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: reference_counted <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/chat/.gitignore b/3rdparty/asio/src/examples/cpp03/chat/.gitignore deleted file mode 100644 index 0882fa6ced3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/chat/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_server -*_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/chat/chat_client.cpp b/3rdparty/asio/src/examples/cpp03/chat/chat_client.cpp deleted file mode 100644 index 9dd16145b81..00000000000 --- a/3rdparty/asio/src/examples/cpp03/chat/chat_client.cpp +++ /dev/null @@ -1,177 +0,0 @@ -// -// chat_client.cpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <deque> -#include <iostream> -#include <boost/bind.hpp> -#include "asio.hpp" -#include "chat_message.hpp" - -using asio::ip::tcp; - -typedef std::deque<chat_message> chat_message_queue; - -class chat_client -{ -public: - chat_client(asio::io_context& io_context, - const tcp::resolver::results_type& endpoints) - : io_context_(io_context), - socket_(io_context) - { - asio::async_connect(socket_, endpoints, - boost::bind(&chat_client::handle_connect, this, - asio::placeholders::error)); - } - - void write(const chat_message& msg) - { - asio::post(io_context_, - boost::bind(&chat_client::do_write, this, msg)); - } - - void close() - { - asio::post(io_context_, - boost::bind(&chat_client::do_close, this)); - } - -private: - - void handle_connect(const asio::error_code& error) - { - if (!error) - { - asio::async_read(socket_, - asio::buffer(read_msg_.data(), chat_message::header_length), - boost::bind(&chat_client::handle_read_header, this, - asio::placeholders::error)); - } - } - - void handle_read_header(const asio::error_code& error) - { - if (!error && read_msg_.decode_header()) - { - asio::async_read(socket_, - asio::buffer(read_msg_.body(), read_msg_.body_length()), - boost::bind(&chat_client::handle_read_body, this, - asio::placeholders::error)); - } - else - { - do_close(); - } - } - - void handle_read_body(const asio::error_code& error) - { - if (!error) - { - std::cout.write(read_msg_.body(), read_msg_.body_length()); - std::cout << "\n"; - asio::async_read(socket_, - asio::buffer(read_msg_.data(), chat_message::header_length), - boost::bind(&chat_client::handle_read_header, this, - asio::placeholders::error)); - } - else - { - do_close(); - } - } - - void do_write(chat_message msg) - { - bool write_in_progress = !write_msgs_.empty(); - write_msgs_.push_back(msg); - if (!write_in_progress) - { - asio::async_write(socket_, - asio::buffer(write_msgs_.front().data(), - write_msgs_.front().length()), - boost::bind(&chat_client::handle_write, this, - asio::placeholders::error)); - } - } - - void handle_write(const asio::error_code& error) - { - if (!error) - { - write_msgs_.pop_front(); - if (!write_msgs_.empty()) - { - asio::async_write(socket_, - asio::buffer(write_msgs_.front().data(), - write_msgs_.front().length()), - boost::bind(&chat_client::handle_write, this, - asio::placeholders::error)); - } - } - else - { - do_close(); - } - } - - void do_close() - { - socket_.close(); - } - -private: - asio::io_context& io_context_; - tcp::socket socket_; - chat_message read_msg_; - chat_message_queue write_msgs_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: chat_client <host> <port>\n"; - return 1; - } - - asio::io_context io_context; - - tcp::resolver resolver(io_context); - tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]); - - chat_client c(io_context, endpoints); - - asio::thread t(boost::bind(&asio::io_context::run, &io_context)); - - char line[chat_message::max_body_length + 1]; - while (std::cin.getline(line, chat_message::max_body_length + 1)) - { - using namespace std; // For strlen and memcpy. - chat_message msg; - msg.body_length(strlen(line)); - memcpy(msg.body(), line, msg.body_length()); - msg.encode_header(); - c.write(msg); - } - - c.close(); - t.join(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/chat/chat_message.hpp b/3rdparty/asio/src/examples/cpp03/chat/chat_message.hpp deleted file mode 100644 index ceeef2f03f8..00000000000 --- a/3rdparty/asio/src/examples/cpp03/chat/chat_message.hpp +++ /dev/null @@ -1,93 +0,0 @@ -// -// chat_message.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 CHAT_MESSAGE_HPP -#define CHAT_MESSAGE_HPP - -#include <cstdio> -#include <cstdlib> -#include <cstring> - -class chat_message -{ -public: - enum { header_length = 4 }; - enum { max_body_length = 512 }; - - chat_message() - : body_length_(0) - { - } - - const char* data() const - { - return data_; - } - - char* data() - { - return data_; - } - - size_t length() const - { - return header_length + body_length_; - } - - const char* body() const - { - return data_ + header_length; - } - - char* body() - { - return data_ + header_length; - } - - size_t body_length() const - { - return body_length_; - } - - void body_length(size_t new_length) - { - body_length_ = new_length; - if (body_length_ > max_body_length) - body_length_ = max_body_length; - } - - bool decode_header() - { - using namespace std; // For strncat and atoi. - char header[header_length + 1] = ""; - strncat(header, data_, header_length); - body_length_ = atoi(header); - if (body_length_ > max_body_length) - { - body_length_ = 0; - return false; - } - return true; - } - - void encode_header() - { - using namespace std; // For sprintf and memcpy. - char header[header_length + 1] = ""; - sprintf(header, "%4d", static_cast<int>(body_length_)); - memcpy(data_, header, header_length); - } - -private: - char data_[header_length + max_body_length]; - size_t body_length_; -}; - -#endif // CHAT_MESSAGE_HPP diff --git a/3rdparty/asio/src/examples/cpp03/chat/chat_server.cpp b/3rdparty/asio/src/examples/cpp03/chat/chat_server.cpp deleted file mode 100644 index 902515b3b54..00000000000 --- a/3rdparty/asio/src/examples/cpp03/chat/chat_server.cpp +++ /dev/null @@ -1,247 +0,0 @@ -// -// chat_server.cpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <algorithm> -#include <cstdlib> -#include <deque> -#include <iostream> -#include <list> -#include <set> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include "asio.hpp" -#include "chat_message.hpp" - -using asio::ip::tcp; - -//---------------------------------------------------------------------- - -typedef std::deque<chat_message> chat_message_queue; - -//---------------------------------------------------------------------- - -class chat_participant -{ -public: - virtual ~chat_participant() {} - virtual void deliver(const chat_message& msg) = 0; -}; - -typedef boost::shared_ptr<chat_participant> chat_participant_ptr; - -//---------------------------------------------------------------------- - -class chat_room -{ -public: - void join(chat_participant_ptr participant) - { - participants_.insert(participant); - std::for_each(recent_msgs_.begin(), recent_msgs_.end(), - boost::bind(&chat_participant::deliver, participant, _1)); - } - - void leave(chat_participant_ptr participant) - { - participants_.erase(participant); - } - - void deliver(const chat_message& msg) - { - recent_msgs_.push_back(msg); - while (recent_msgs_.size() > max_recent_msgs) - recent_msgs_.pop_front(); - - std::for_each(participants_.begin(), participants_.end(), - boost::bind(&chat_participant::deliver, _1, boost::ref(msg))); - } - -private: - std::set<chat_participant_ptr> participants_; - enum { max_recent_msgs = 100 }; - chat_message_queue recent_msgs_; -}; - -//---------------------------------------------------------------------- - -class chat_session - : public chat_participant, - public boost::enable_shared_from_this<chat_session> -{ -public: - chat_session(asio::io_context& io_context, chat_room& room) - : socket_(io_context), - room_(room) - { - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - room_.join(shared_from_this()); - asio::async_read(socket_, - asio::buffer(read_msg_.data(), chat_message::header_length), - boost::bind( - &chat_session::handle_read_header, shared_from_this(), - asio::placeholders::error)); - } - - void deliver(const chat_message& msg) - { - bool write_in_progress = !write_msgs_.empty(); - write_msgs_.push_back(msg); - if (!write_in_progress) - { - asio::async_write(socket_, - asio::buffer(write_msgs_.front().data(), - write_msgs_.front().length()), - boost::bind(&chat_session::handle_write, shared_from_this(), - asio::placeholders::error)); - } - } - - void handle_read_header(const asio::error_code& error) - { - if (!error && read_msg_.decode_header()) - { - asio::async_read(socket_, - asio::buffer(read_msg_.body(), read_msg_.body_length()), - boost::bind(&chat_session::handle_read_body, shared_from_this(), - asio::placeholders::error)); - } - else - { - room_.leave(shared_from_this()); - } - } - - void handle_read_body(const asio::error_code& error) - { - if (!error) - { - room_.deliver(read_msg_); - asio::async_read(socket_, - asio::buffer(read_msg_.data(), chat_message::header_length), - boost::bind(&chat_session::handle_read_header, shared_from_this(), - asio::placeholders::error)); - } - else - { - room_.leave(shared_from_this()); - } - } - - void handle_write(const asio::error_code& error) - { - if (!error) - { - write_msgs_.pop_front(); - if (!write_msgs_.empty()) - { - asio::async_write(socket_, - asio::buffer(write_msgs_.front().data(), - write_msgs_.front().length()), - boost::bind(&chat_session::handle_write, shared_from_this(), - asio::placeholders::error)); - } - } - else - { - room_.leave(shared_from_this()); - } - } - -private: - tcp::socket socket_; - chat_room& room_; - chat_message read_msg_; - chat_message_queue write_msgs_; -}; - -typedef boost::shared_ptr<chat_session> chat_session_ptr; - -//---------------------------------------------------------------------- - -class chat_server -{ -public: - chat_server(asio::io_context& io_context, - const tcp::endpoint& endpoint) - : io_context_(io_context), - acceptor_(io_context, endpoint) - { - start_accept(); - } - - void start_accept() - { - chat_session_ptr new_session(new chat_session(io_context_, room_)); - acceptor_.async_accept(new_session->socket(), - boost::bind(&chat_server::handle_accept, this, new_session, - asio::placeholders::error)); - } - - void handle_accept(chat_session_ptr session, - const asio::error_code& error) - { - if (!error) - { - session->start(); - } - - start_accept(); - } - -private: - asio::io_context& io_context_; - tcp::acceptor acceptor_; - chat_room room_; -}; - -typedef boost::shared_ptr<chat_server> chat_server_ptr; -typedef std::list<chat_server_ptr> chat_server_list; - -//---------------------------------------------------------------------- - -int main(int argc, char* argv[]) -{ - try - { - if (argc < 2) - { - std::cerr << "Usage: chat_server <port> [<port> ...]\n"; - return 1; - } - - asio::io_context io_context; - - chat_server_list servers; - for (int i = 1; i < argc; ++i) - { - using namespace std; // For atoi. - tcp::endpoint endpoint(tcp::v4(), atoi(argv[i])); - chat_server_ptr server(new chat_server(io_context, endpoint)); - servers.push_back(server); - } - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/chat/posix_chat_client.cpp b/3rdparty/asio/src/examples/cpp03/chat/posix_chat_client.cpp deleted file mode 100644 index 91428825aad..00000000000 --- a/3rdparty/asio/src/examples/cpp03/chat/posix_chat_client.cpp +++ /dev/null @@ -1,204 +0,0 @@ -// -// posix_chat_client.cpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <cstring> -#include <iostream> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include "asio.hpp" -#include "chat_message.hpp" - -#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - -using asio::ip::tcp; -namespace posix = asio::posix; - -class posix_chat_client -{ -public: - posix_chat_client(asio::io_context& io_context, - const tcp::resolver::results_type& endpoints) - : socket_(io_context), - input_(io_context, ::dup(STDIN_FILENO)), - output_(io_context, ::dup(STDOUT_FILENO)), - input_buffer_(chat_message::max_body_length) - { - asio::async_connect(socket_, endpoints, - boost::bind(&posix_chat_client::handle_connect, this, - asio::placeholders::error)); - } - -private: - - void handle_connect(const asio::error_code& error) - { - if (!error) - { - // Read the fixed-length header of the next message from the server. - asio::async_read(socket_, - asio::buffer(read_msg_.data(), chat_message::header_length), - boost::bind(&posix_chat_client::handle_read_header, this, - asio::placeholders::error)); - - // Read a line of input entered by the user. - asio::async_read_until(input_, input_buffer_, '\n', - boost::bind(&posix_chat_client::handle_read_input, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - } - - void handle_read_header(const asio::error_code& error) - { - if (!error && read_msg_.decode_header()) - { - // Read the variable-length body of the message from the server. - asio::async_read(socket_, - asio::buffer(read_msg_.body(), read_msg_.body_length()), - boost::bind(&posix_chat_client::handle_read_body, this, - asio::placeholders::error)); - } - else - { - close(); - } - } - - void handle_read_body(const asio::error_code& error) - { - if (!error) - { - // Write out the message we just received, terminated by a newline. - static char eol[] = { '\n' }; - boost::array<asio::const_buffer, 2> buffers = {{ - asio::buffer(read_msg_.body(), read_msg_.body_length()), - asio::buffer(eol) }}; - asio::async_write(output_, buffers, - boost::bind(&posix_chat_client::handle_write_output, this, - asio::placeholders::error)); - } - else - { - close(); - } - } - - void handle_write_output(const asio::error_code& error) - { - if (!error) - { - // Read the fixed-length header of the next message from the server. - asio::async_read(socket_, - asio::buffer(read_msg_.data(), chat_message::header_length), - boost::bind(&posix_chat_client::handle_read_header, this, - asio::placeholders::error)); - } - else - { - close(); - } - } - - void handle_read_input(const asio::error_code& error, - std::size_t length) - { - if (!error) - { - // Write the message (minus the newline) to the server. - write_msg_.body_length(length - 1); - input_buffer_.sgetn(write_msg_.body(), length - 1); - input_buffer_.consume(1); // Remove newline from input. - write_msg_.encode_header(); - asio::async_write(socket_, - asio::buffer(write_msg_.data(), write_msg_.length()), - boost::bind(&posix_chat_client::handle_write, this, - asio::placeholders::error)); - } - else if (error == asio::error::not_found) - { - // Didn't get a newline. Send whatever we have. - write_msg_.body_length(input_buffer_.size()); - input_buffer_.sgetn(write_msg_.body(), input_buffer_.size()); - write_msg_.encode_header(); - asio::async_write(socket_, - asio::buffer(write_msg_.data(), write_msg_.length()), - boost::bind(&posix_chat_client::handle_write, this, - asio::placeholders::error)); - } - else - { - close(); - } - } - - void handle_write(const asio::error_code& error) - { - if (!error) - { - // Read a line of input entered by the user. - asio::async_read_until(input_, input_buffer_, '\n', - boost::bind(&posix_chat_client::handle_read_input, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - close(); - } - } - - void close() - { - // Cancel all outstanding asynchronous operations. - socket_.close(); - input_.close(); - output_.close(); - } - -private: - tcp::socket socket_; - posix::stream_descriptor input_; - posix::stream_descriptor output_; - chat_message read_msg_; - chat_message write_msg_; - asio::streambuf input_buffer_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: posix_chat_client <host> <port>\n"; - return 1; - } - - asio::io_context io_context; - - tcp::resolver resolver(io_context); - tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]); - - posix_chat_client c(io_context, endpoints); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} - -#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) -int main() {} -#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) diff --git a/3rdparty/asio/src/examples/cpp03/echo/.gitignore b/3rdparty/asio/src/examples/cpp03/echo/.gitignore deleted file mode 100644 index 0882fa6ced3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/echo/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_server -*_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/echo/async_tcp_echo_server.cpp b/3rdparty/asio/src/examples/cpp03/echo/async_tcp_echo_server.cpp deleted file mode 100644 index c26136e89b5..00000000000 --- a/3rdparty/asio/src/examples/cpp03/echo/async_tcp_echo_server.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// -// async_tcp_echo_server.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <iostream> -#include <boost/bind.hpp> -#include "asio.hpp" - -using asio::ip::tcp; - -class session -{ -public: - session(asio::io_context& io_context) - : socket_(io_context) - { - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - socket_.async_read_some(asio::buffer(data_, max_length), - boost::bind(&session::handle_read, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - -private: - void handle_read(const asio::error_code& error, - size_t bytes_transferred) - { - if (!error) - { - asio::async_write(socket_, - asio::buffer(data_, bytes_transferred), - boost::bind(&session::handle_write, this, - asio::placeholders::error)); - } - else - { - delete this; - } - } - - void handle_write(const asio::error_code& error) - { - if (!error) - { - socket_.async_read_some(asio::buffer(data_, max_length), - boost::bind(&session::handle_read, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - delete this; - } - } - - tcp::socket socket_; - enum { max_length = 1024 }; - char data_[max_length]; -}; - -class server -{ -public: - server(asio::io_context& io_context, short port) - : io_context_(io_context), - acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) - { - start_accept(); - } - -private: - void start_accept() - { - session* new_session = new session(io_context_); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - - void handle_accept(session* new_session, - const asio::error_code& error) - { - if (!error) - { - new_session->start(); - } - else - { - delete new_session; - } - - start_accept(); - } - - asio::io_context& io_context_; - tcp::acceptor acceptor_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: async_tcp_echo_server <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/echo/async_udp_echo_server.cpp b/3rdparty/asio/src/examples/cpp03/echo/async_udp_echo_server.cpp deleted file mode 100644 index 851c46b0803..00000000000 --- a/3rdparty/asio/src/examples/cpp03/echo/async_udp_echo_server.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// -// async_udp_echo_server.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <iostream> -#include <boost/bind.hpp> -#include "asio.hpp" - -using asio::ip::udp; - -class server -{ -public: - server(asio::io_context& io_context, short port) - : socket_(io_context, udp::endpoint(udp::v4(), port)) - { - socket_.async_receive_from( - asio::buffer(data_, max_length), sender_endpoint_, - boost::bind(&server::handle_receive_from, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - - void handle_receive_from(const asio::error_code& error, - size_t bytes_recvd) - { - if (!error && bytes_recvd > 0) - { - socket_.async_send_to( - asio::buffer(data_, bytes_recvd), sender_endpoint_, - boost::bind(&server::handle_send_to, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - socket_.async_receive_from( - asio::buffer(data_, max_length), sender_endpoint_, - boost::bind(&server::handle_receive_from, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - } - - void handle_send_to(const asio::error_code& /*error*/, - size_t /*bytes_sent*/) - { - socket_.async_receive_from( - asio::buffer(data_, max_length), sender_endpoint_, - boost::bind(&server::handle_receive_from, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - -private: - udp::socket socket_; - udp::endpoint sender_endpoint_; - enum { max_length = 1024 }; - char data_[max_length]; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: async_udp_echo_server <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/echo/blocking_tcp_echo_client.cpp b/3rdparty/asio/src/examples/cpp03/echo/blocking_tcp_echo_client.cpp deleted file mode 100644 index 224b9dbb1b2..00000000000 --- a/3rdparty/asio/src/examples/cpp03/echo/blocking_tcp_echo_client.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// blocking_tcp_echo_client.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <cstring> -#include <iostream> -#include "asio.hpp" - -using asio::ip::tcp; - -enum { max_length = 1024 }; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: blocking_tcp_echo_client <host> <port>\n"; - return 1; - } - - asio::io_context io_context; - - tcp::resolver resolver(io_context); - tcp::resolver::results_type endpoints = - resolver.resolve(tcp::v4(), argv[1], argv[2]); - - tcp::socket s(io_context); - asio::connect(s, endpoints); - - using namespace std; // For strlen. - std::cout << "Enter message: "; - char request[max_length]; - std::cin.getline(request, max_length); - size_t request_length = strlen(request); - asio::write(s, asio::buffer(request, request_length)); - - char reply[max_length]; - size_t reply_length = asio::read(s, - asio::buffer(reply, request_length)); - std::cout << "Reply is: "; - std::cout.write(reply, reply_length); - std::cout << "\n"; - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp b/3rdparty/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp deleted file mode 100644 index 163dc2a392c..00000000000 --- a/3rdparty/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp +++ /dev/null @@ -1,79 +0,0 @@ -// -// blocking_tcp_echo_server.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <iostream> -#include <boost/bind.hpp> -#include <boost/smart_ptr.hpp> -#include "asio.hpp" - -using asio::ip::tcp; - -const int max_length = 1024; - -typedef boost::shared_ptr<tcp::socket> socket_ptr; - -void session(socket_ptr sock) -{ - try - { - for (;;) - { - char data[max_length]; - - asio::error_code error; - size_t length = sock->read_some(asio::buffer(data), error); - if (error == asio::error::eof) - break; // Connection closed cleanly by peer. - else if (error) - throw asio::system_error(error); // Some other error. - - asio::write(*sock, asio::buffer(data, length)); - } - } - catch (std::exception& e) - { - std::cerr << "Exception in thread: " << e.what() << "\n"; - } -} - -void server(asio::io_context& io_context, unsigned short port) -{ - tcp::acceptor a(io_context, tcp::endpoint(tcp::v4(), port)); - for (;;) - { - socket_ptr sock(new tcp::socket(io_context)); - a.accept(*sock); - asio::thread t(boost::bind(session, sock)); - } -} - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: blocking_tcp_echo_server <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server(io_context, atoi(argv[1])); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/echo/blocking_udp_echo_client.cpp b/3rdparty/asio/src/examples/cpp03/echo/blocking_udp_echo_client.cpp deleted file mode 100644 index ee90081b7ea..00000000000 --- a/3rdparty/asio/src/examples/cpp03/echo/blocking_udp_echo_client.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// blocking_udp_echo_client.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <cstring> -#include <iostream> -#include "asio.hpp" - -using asio::ip::udp; - -enum { max_length = 1024 }; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: blocking_udp_echo_client <host> <port>\n"; - return 1; - } - - asio::io_context io_context; - - udp::socket s(io_context, udp::endpoint(udp::v4(), 0)); - - udp::resolver resolver(io_context); - udp::resolver::results_type endpoints = - resolver.resolve(udp::v4(), argv[1], argv[2]); - - using namespace std; // For strlen. - std::cout << "Enter message: "; - char request[max_length]; - std::cin.getline(request, max_length); - size_t request_length = strlen(request); - s.send_to(asio::buffer(request, request_length), *endpoints.begin()); - - char reply[max_length]; - udp::endpoint sender_endpoint; - size_t reply_length = s.receive_from( - asio::buffer(reply, max_length), sender_endpoint); - std::cout << "Reply is: "; - std::cout.write(reply, reply_length); - std::cout << "\n"; - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp b/3rdparty/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp deleted file mode 100644 index 3cc364c20b5..00000000000 --- a/3rdparty/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// -// blocking_udp_echo_server.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <iostream> -#include "asio.hpp" - -using asio::ip::udp; - -enum { max_length = 1024 }; - -void server(asio::io_context& io_context, unsigned short port) -{ - udp::socket sock(io_context, udp::endpoint(udp::v4(), port)); - for (;;) - { - char data[max_length]; - udp::endpoint sender_endpoint; - size_t length = sock.receive_from( - asio::buffer(data, max_length), sender_endpoint); - sock.send_to(asio::buffer(data, length), sender_endpoint); - } -} - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: blocking_udp_echo_server <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server(io_context, atoi(argv[1])); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/fork/.gitignore b/3rdparty/asio/src/examples/cpp03/fork/.gitignore deleted file mode 100644 index 6b565fe313a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/fork/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds -daemon -process_per_connection diff --git a/3rdparty/asio/src/examples/cpp03/fork/daemon.cpp b/3rdparty/asio/src/examples/cpp03/fork/daemon.cpp deleted file mode 100644 index 06eef3d6b49..00000000000 --- a/3rdparty/asio/src/examples/cpp03/fork/daemon.cpp +++ /dev/null @@ -1,189 +0,0 @@ -// -// daemon.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio/io_context.hpp> -#include <asio/ip/udp.hpp> -#include <asio/signal_set.hpp> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include <ctime> -#include <iostream> -#include <syslog.h> -#include <unistd.h> - -using asio::ip::udp; - -class udp_daytime_server -{ -public: - udp_daytime_server(asio::io_context& io_context) - : socket_(io_context, udp::endpoint(udp::v4(), 13)) - { - start_receive(); - } - -private: - void start_receive() - { - socket_.async_receive_from( - asio::buffer(recv_buffer_), remote_endpoint_, - boost::bind(&udp_daytime_server::handle_receive, this, _1)); - } - - void handle_receive(const asio::error_code& ec) - { - if (!ec || ec == asio::error::message_size) - { - using namespace std; // For time_t, time and ctime; - time_t now = time(0); - std::string message = ctime(&now); - - asio::error_code ignored_ec; - socket_.send_to(asio::buffer(message), - remote_endpoint_, 0, ignored_ec); - } - - start_receive(); - } - - udp::socket socket_; - udp::endpoint remote_endpoint_; - boost::array<char, 1> recv_buffer_; -}; - -int main() -{ - try - { - asio::io_context io_context; - - // Initialise the server before becoming a daemon. If the process is - // started from a shell, this means any errors will be reported back to the - // user. - udp_daytime_server server(io_context); - - // Register signal handlers so that the daemon may be shut down. You may - // also want to register for other signals, such as SIGHUP to trigger a - // re-read of a configuration file. - asio::signal_set signals(io_context, SIGINT, SIGTERM); - signals.async_wait( - boost::bind(&asio::io_context::stop, &io_context)); - - // Inform the io_context that we are about to become a daemon. The - // io_context cleans up any internal resources, such as threads, that may - // interfere with forking. - io_context.notify_fork(asio::io_context::fork_prepare); - - // Fork the process and have the parent exit. If the process was started - // from a shell, this returns control to the user. Forking a new process is - // also a prerequisite for the subsequent call to setsid(). - if (pid_t pid = fork()) - { - if (pid > 0) - { - // We're in the parent process and need to exit. - // - // When the exit() function is used, the program terminates without - // invoking local variables' destructors. Only global variables are - // destroyed. As the io_context object is a local variable, this means - // we do not have to call: - // - // io_context.notify_fork(asio::io_context::fork_parent); - // - // However, this line should be added before each call to exit() if - // using a global io_context object. An additional call: - // - // io_context.notify_fork(asio::io_context::fork_prepare); - // - // should also precede the second fork(). - exit(0); - } - else - { - syslog(LOG_ERR | LOG_USER, "First fork failed: %m"); - return 1; - } - } - - // Make the process a new session leader. This detaches it from the - // terminal. - setsid(); - - // A process inherits its working directory from its parent. This could be - // on a mounted filesystem, which means that the running daemon would - // prevent this filesystem from being unmounted. Changing to the root - // directory avoids this problem. - chdir("/"); - - // The file mode creation mask is also inherited from the parent process. - // We don't want to restrict the permissions on files created by the - // daemon, so the mask is cleared. - umask(0); - - // A second fork ensures the process cannot acquire a controlling terminal. - if (pid_t pid = fork()) - { - if (pid > 0) - { - exit(0); - } - else - { - syslog(LOG_ERR | LOG_USER, "Second fork failed: %m"); - return 1; - } - } - - // Close the standard streams. This decouples the daemon from the terminal - // that started it. - close(0); - close(1); - close(2); - - // We don't want the daemon to have any standard input. - if (open("/dev/null", O_RDONLY) < 0) - { - syslog(LOG_ERR | LOG_USER, "Unable to open /dev/null: %m"); - return 1; - } - - // Send standard output to a log file. - const char* output = "/tmp/asio.daemon.out"; - const int flags = O_WRONLY | O_CREAT | O_APPEND; - const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; - if (open(output, flags, mode) < 0) - { - syslog(LOG_ERR | LOG_USER, "Unable to open output file %s: %m", output); - return 1; - } - - // Also send standard error to the same log file. - if (dup(1) < 0) - { - syslog(LOG_ERR | LOG_USER, "Unable to dup output descriptor: %m"); - return 1; - } - - // Inform the io_context that we have finished becoming a daemon. The - // io_context uses this opportunity to create any internal file descriptors - // that need to be private to the new process. - io_context.notify_fork(asio::io_context::fork_child); - - // The io_context can now be used normally. - syslog(LOG_INFO | LOG_USER, "Daemon started"); - io_context.run(); - syslog(LOG_INFO | LOG_USER, "Daemon stopped"); - } - catch (std::exception& e) - { - syslog(LOG_ERR | LOG_USER, "Exception: %s", e.what()); - std::cerr << "Exception: " << e.what() << std::endl; - } -} diff --git a/3rdparty/asio/src/examples/cpp03/fork/process_per_connection.cpp b/3rdparty/asio/src/examples/cpp03/fork/process_per_connection.cpp deleted file mode 100644 index 483147e9552..00000000000 --- a/3rdparty/asio/src/examples/cpp03/fork/process_per_connection.cpp +++ /dev/null @@ -1,160 +0,0 @@ -// -// process_per_connection.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio/io_context.hpp> -#include <asio/ip/tcp.hpp> -#include <asio/signal_set.hpp> -#include <asio/write.hpp> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include <cstdlib> -#include <iostream> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -using asio::ip::tcp; - -class server -{ -public: - server(asio::io_context& io_context, unsigned short port) - : io_context_(io_context), - signal_(io_context, SIGCHLD), - acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), - socket_(io_context) - { - start_signal_wait(); - start_accept(); - } - -private: - void start_signal_wait() - { - signal_.async_wait(boost::bind(&server::handle_signal_wait, this)); - } - - void handle_signal_wait() - { - // Only the parent process should check for this signal. We can determine - // whether we are in the parent by checking if the acceptor is still open. - if (acceptor_.is_open()) - { - // Reap completed child processes so that we don't end up with zombies. - int status = 0; - while (waitpid(-1, &status, WNOHANG) > 0) {} - - start_signal_wait(); - } - } - - void start_accept() - { - acceptor_.async_accept(socket_, - boost::bind(&server::handle_accept, this, _1)); - } - - void handle_accept(const asio::error_code& ec) - { - if (!ec) - { - // Inform the io_context that we are about to fork. The io_context cleans - // up any internal resources, such as threads, that may interfere with - // forking. - io_context_.notify_fork(asio::io_context::fork_prepare); - - if (fork() == 0) - { - // Inform the io_context that the fork is finished and that this is the - // child process. The io_context uses this opportunity to create any - // internal file descriptors that must be private to the new process. - io_context_.notify_fork(asio::io_context::fork_child); - - // The child won't be accepting new connections, so we can close the - // acceptor. It remains open in the parent. - acceptor_.close(); - - // The child process is not interested in processing the SIGCHLD signal. - signal_.cancel(); - - start_read(); - } - else - { - // Inform the io_context that the fork is finished (or failed) and that - // this is the parent process. The io_context uses this opportunity to - // recreate any internal resources that were cleaned up during - // preparation for the fork. - io_context_.notify_fork(asio::io_context::fork_parent); - - socket_.close(); - start_accept(); - } - } - else - { - std::cerr << "Accept error: " << ec.message() << std::endl; - start_accept(); - } - } - - void start_read() - { - socket_.async_read_some(asio::buffer(data_), - boost::bind(&server::handle_read, this, _1, _2)); - } - - void handle_read(const asio::error_code& ec, std::size_t length) - { - if (!ec) - start_write(length); - } - - void start_write(std::size_t length) - { - asio::async_write(socket_, asio::buffer(data_, length), - boost::bind(&server::handle_write, this, _1)); - } - - void handle_write(const asio::error_code& ec) - { - if (!ec) - start_read(); - } - - asio::io_context& io_context_; - asio::signal_set signal_; - tcp::acceptor acceptor_; - tcp::socket socket_; - boost::array<char, 1024> data_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: process_per_connection <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << std::endl; - } -} diff --git a/3rdparty/asio/src/examples/cpp03/http/client/.gitignore b/3rdparty/asio/src/examples/cpp03/http/client/.gitignore deleted file mode 100644 index e80f510d76c..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/client/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_client -*.ilk -*.manifest -*.pdb -*.tds 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 83dcc36d53a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/client/async_client.cpp +++ /dev/null @@ -1,204 +0,0 @@ -// -// async_client.cpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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.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; -} diff --git a/3rdparty/asio/src/examples/cpp03/http/client/sync_client.cpp b/3rdparty/asio/src/examples/cpp03/http/client/sync_client.cpp deleted file mode 100644 index a11b5c7c76a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/client/sync_client.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// -// sync_client.cpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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> - -using asio::ip::tcp; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cout << "Usage: sync_client <server> <path>\n"; - std::cout << "Example:\n"; - std::cout << " sync_client www.boost.org /LICENSE_1_0.txt\n"; - return 1; - } - - asio::io_context io_context; - - // Get a list of endpoints corresponding to the server name. - tcp::resolver resolver(io_context); - tcp::resolver::results_type endpoints = resolver.resolve(argv[1], "http"); - - // Try each endpoint until we successfully establish a connection. - tcp::socket socket(io_context); - asio::connect(socket, endpoints); - - // 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. - asio::streambuf request; - std::ostream request_stream(&request); - request_stream << "GET " << argv[2] << " HTTP/1.0\r\n"; - request_stream << "Host: " << argv[1] << "\r\n"; - request_stream << "Accept: */*\r\n"; - request_stream << "Connection: close\r\n\r\n"; - - // Send the request. - asio::write(socket, request); - - // 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::streambuf response; - asio::read_until(socket, response, "\r\n"); - - // 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 1; - } - if (status_code != 200) - { - std::cout << "Response returned with status code " << status_code << "\n"; - return 1; - } - - // Read the response headers, which are terminated by a blank line. - asio::read_until(socket, response, "\r\n\r\n"); - - // Process the response headers. - 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; - - // Read until EOF, writing data to output as we go. - asio::error_code error; - while (asio::read(socket, response, - asio::transfer_at_least(1), error)) - std::cout << &response; - if (error != asio::error::eof) - throw asio::system_error(error); - } - catch (std::exception& e) - { - std::cout << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_1K.html b/3rdparty/asio/src/examples/cpp03/http/doc_root/data_1K.html deleted file mode 100644 index 1372c4dd177..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_1K.html +++ /dev/null @@ -1,28 +0,0 @@ -<!-- -Copyright (c) 2003-2016 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) ---> - -<html> -<body> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the<br/> -</body> -</html> - -<!-- boostinspect:nounlinked --> diff --git a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_2K.html b/3rdparty/asio/src/examples/cpp03/http/doc_root/data_2K.html deleted file mode 100644 index 686ce52b0a0..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_2K.html +++ /dev/null @@ -1,49 +0,0 @@ -<!-- -Copyright (c) 2003-2016 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) ---> - -<html> -<body> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps ove<br/> -</body> -</html> - -<!-- boostinspect:nounlinked --> diff --git a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_4K.html b/3rdparty/asio/src/examples/cpp03/http/doc_root/data_4K.html deleted file mode 100644 index f5db0a2bc00..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_4K.html +++ /dev/null @@ -1,91 +0,0 @@ -<!-- -Copyright (c) 2003-2016 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) ---> - -<html> -<body> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox<br/> -</body> -</html> - -<!-- boostinspect:nounlinked --> diff --git a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_8K.html b/3rdparty/asio/src/examples/cpp03/http/doc_root/data_8K.html deleted file mode 100644 index 0d42f72886b..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/doc_root/data_8K.html +++ /dev/null @@ -1,175 +0,0 @@ -<!-- -Copyright (c) 2003-2016 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) ---> - -<html> -<body> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -The quick brown fox jumps over the lazy dog<br/> -.... -</body> -</html> - -<!-- boostinspect:nounlinked --> diff --git a/3rdparty/asio/src/examples/cpp03/http/server/.gitignore b/3rdparty/asio/src/examples/cpp03/http/server/.gitignore deleted file mode 100644 index 0882fa6ced3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_server -*_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/http/server/connection.cpp b/3rdparty/asio/src/examples/cpp03/http/server/connection.cpp deleted file mode 100644 index acbf637b453..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/connection.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// connection.cpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "connection.hpp" -#include <vector> -#include <boost/bind.hpp> -#include "connection_manager.hpp" -#include "request_handler.hpp" - -namespace http { -namespace server { - -connection::connection(asio::io_context& io_context, - connection_manager& manager, request_handler& handler) - : socket_(io_context), - connection_manager_(manager), - request_handler_(handler) -{ -} - -asio::ip::tcp::socket& connection::socket() -{ - return socket_; -} - -void connection::start() -{ - socket_.async_read_some(asio::buffer(buffer_), - boost::bind(&connection::handle_read, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); -} - -void connection::stop() -{ - socket_.close(); -} - -void connection::handle_read(const asio::error_code& e, - std::size_t bytes_transferred) -{ - if (!e) - { - boost::tribool result; - boost::tie(result, boost::tuples::ignore) = request_parser_.parse( - request_, buffer_.data(), buffer_.data() + bytes_transferred); - - if (result) - { - request_handler_.handle_request(request_, reply_); - asio::async_write(socket_, reply_.to_buffers(), - boost::bind(&connection::handle_write, shared_from_this(), - asio::placeholders::error)); - } - else if (!result) - { - reply_ = reply::stock_reply(reply::bad_request); - asio::async_write(socket_, reply_.to_buffers(), - boost::bind(&connection::handle_write, shared_from_this(), - asio::placeholders::error)); - } - else - { - socket_.async_read_some(asio::buffer(buffer_), - boost::bind(&connection::handle_read, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - } - else if (e != asio::error::operation_aborted) - { - connection_manager_.stop(shared_from_this()); - } -} - -void connection::handle_write(const asio::error_code& e) -{ - if (!e) - { - // Initiate graceful connection closure. - asio::error_code ignored_ec; - socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec); - } - - if (e != asio::error::operation_aborted) - { - connection_manager_.stop(shared_from_this()); - } -} - -} // namespace server -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server/connection.hpp b/3rdparty/asio/src/examples/cpp03/http/server/connection.hpp deleted file mode 100644 index 6193b486443..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/connection.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// -// connection.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/array.hpp> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include "reply.hpp" -#include "request.hpp" -#include "request_handler.hpp" -#include "request_parser.hpp" - -namespace http { -namespace server { - -class connection_manager; - -/// Represents a single connection from a client. -class connection - : public boost::enable_shared_from_this<connection>, - private boost::noncopyable -{ -public: - /// Construct a connection with the given io_context. - explicit connection(asio::io_context& io_context, - connection_manager& manager, request_handler& handler); - - /// Get the socket associated with the connection. - asio::ip::tcp::socket& socket(); - - /// Start the first asynchronous operation for the connection. - void start(); - - /// Stop all asynchronous operations associated with the connection. - void stop(); - -private: - /// Handle completion of a read operation. - void handle_read(const asio::error_code& e, - std::size_t bytes_transferred); - - /// Handle completion of a write operation. - void handle_write(const asio::error_code& e); - - /// Socket for the connection. - asio::ip::tcp::socket socket_; - - /// 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. - boost::array<char, 8192> 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_; -}; - -typedef boost::shared_ptr<connection> connection_ptr; - -} // namespace server -} // namespace http - -#endif // HTTP_CONNECTION_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/connection_manager.cpp b/3rdparty/asio/src/examples/cpp03/http/server/connection_manager.cpp deleted file mode 100644 index 8fc9d8f285b..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/connection_manager.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// connection_manager.cpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "connection_manager.hpp" -#include <algorithm> -#include <boost/bind.hpp> - -namespace http { -namespace server { - -void connection_manager::start(connection_ptr c) -{ - connections_.insert(c); - c->start(); -} - -void connection_manager::stop(connection_ptr c) -{ - connections_.erase(c); - c->stop(); -} - -void connection_manager::stop_all() -{ - std::for_each(connections_.begin(), connections_.end(), - boost::bind(&connection::stop, _1)); - connections_.clear(); -} - -} // namespace server -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server/connection_manager.hpp b/3rdparty/asio/src/examples/cpp03/http/server/connection_manager.hpp deleted file mode 100644 index e67653f6a26..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/connection_manager.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// connection_manager.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_MANAGER_HPP -#define HTTP_CONNECTION_MANAGER_HPP - -#include <set> -#include <boost/noncopyable.hpp> -#include "connection.hpp" - -namespace http { -namespace server { - -/// Manages open connections so that they may be cleanly stopped when the server -/// needs to shut down. -class connection_manager - : private boost::noncopyable -{ -public: - /// Add the specified connection to the manager and start it. - void start(connection_ptr c); - - /// Stop the specified connection. - void stop(connection_ptr c); - - /// Stop all connections. - void stop_all(); - -private: - /// The managed connections. - std::set<connection_ptr> connections_; -}; - -} // namespace server -} // namespace http - -#endif // HTTP_CONNECTION_MANAGER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/header.hpp b/3rdparty/asio/src/examples/cpp03/http/server/header.hpp deleted file mode 100644 index 22e3c4a7a10..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/header.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// header.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_HEADER_HPP -#define HTTP_HEADER_HPP - -#include <string> - -namespace http { -namespace server { - -struct header -{ - std::string name; - std::string value; -}; - -} // namespace server -} // namespace http - -#endif // HTTP_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/main.cpp b/3rdparty/asio/src/examples/cpp03/http/server/main.cpp deleted file mode 100644 index 32d6f54dcb5..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// main.cpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <string> -#include <asio.hpp> -#include <boost/bind.hpp> -#include "server.hpp" - -int main(int argc, char* argv[]) -{ - try - { - // Check command line arguments. - if (argc != 4) - { - std::cerr << "Usage: http_server <address> <port> <doc_root>\n"; - std::cerr << " For IPv4, try:\n"; - std::cerr << " receiver 0.0.0.0 80 .\n"; - std::cerr << " For IPv6, try:\n"; - std::cerr << " receiver 0::0 80 .\n"; - return 1; - } - - // Initialise the server. - http::server::server s(argv[1], argv[2], argv[3]); - - // Run the server until stopped. - s.run(); - } - catch (std::exception& e) - { - std::cerr << "exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/http/server/mime_types.cpp b/3rdparty/asio/src/examples/cpp03/http/server/mime_types.cpp deleted file mode 100644 index 80fdfe30e64..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/mime_types.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// mime_types.cpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "mime_types.hpp" - -namespace http { -namespace server { -namespace mime_types { - -struct mapping -{ - const char* extension; - const char* mime_type; -} mappings[] = -{ - { "gif", "image/gif" }, - { "htm", "text/html" }, - { "html", "text/html" }, - { "jpg", "image/jpeg" }, - { "png", "image/png" }, - { 0, 0 } // Marks end of list. -}; - -std::string extension_to_type(const std::string& extension) -{ - for (mapping* m = mappings; m->extension; ++m) - { - if (m->extension == extension) - { - return m->mime_type; - } - } - - return "text/plain"; -} - -} // namespace mime_types -} // namespace server -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server/mime_types.hpp b/3rdparty/asio/src/examples/cpp03/http/server/mime_types.hpp deleted file mode 100644 index 2fc0332791f..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/mime_types.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// mime_types.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_MIME_TYPES_HPP -#define HTTP_MIME_TYPES_HPP - -#include <string> - -namespace http { -namespace server { -namespace mime_types { - -/// Convert a file extension into a MIME type. -std::string extension_to_type(const std::string& extension); - -} // namespace mime_types -} // namespace server -} // namespace http - -#endif // HTTP_MIME_TYPES_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/reply.cpp b/3rdparty/asio/src/examples/cpp03/http/server/reply.cpp deleted file mode 100644 index f3730d3d94d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/reply.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// -// reply.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "reply.hpp" -#include <string> -#include <boost/lexical_cast.hpp> - -namespace http { -namespace server { - -namespace status_strings { - -const std::string ok = - "HTTP/1.0 200 OK\r\n"; -const std::string created = - "HTTP/1.0 201 Created\r\n"; -const std::string accepted = - "HTTP/1.0 202 Accepted\r\n"; -const std::string no_content = - "HTTP/1.0 204 No Content\r\n"; -const std::string multiple_choices = - "HTTP/1.0 300 Multiple Choices\r\n"; -const std::string moved_permanently = - "HTTP/1.0 301 Moved Permanently\r\n"; -const std::string moved_temporarily = - "HTTP/1.0 302 Moved Temporarily\r\n"; -const std::string not_modified = - "HTTP/1.0 304 Not Modified\r\n"; -const std::string bad_request = - "HTTP/1.0 400 Bad Request\r\n"; -const std::string unauthorized = - "HTTP/1.0 401 Unauthorized\r\n"; -const std::string forbidden = - "HTTP/1.0 403 Forbidden\r\n"; -const std::string not_found = - "HTTP/1.0 404 Not Found\r\n"; -const std::string internal_server_error = - "HTTP/1.0 500 Internal Server Error\r\n"; -const std::string not_implemented = - "HTTP/1.0 501 Not Implemented\r\n"; -const std::string bad_gateway = - "HTTP/1.0 502 Bad Gateway\r\n"; -const std::string service_unavailable = - "HTTP/1.0 503 Service Unavailable\r\n"; - -asio::const_buffer to_buffer(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return asio::buffer(ok); - case reply::created: - return asio::buffer(created); - case reply::accepted: - return asio::buffer(accepted); - case reply::no_content: - return asio::buffer(no_content); - case reply::multiple_choices: - return asio::buffer(multiple_choices); - case reply::moved_permanently: - return asio::buffer(moved_permanently); - case reply::moved_temporarily: - return asio::buffer(moved_temporarily); - case reply::not_modified: - return asio::buffer(not_modified); - case reply::bad_request: - return asio::buffer(bad_request); - case reply::unauthorized: - return asio::buffer(unauthorized); - case reply::forbidden: - return asio::buffer(forbidden); - case reply::not_found: - return asio::buffer(not_found); - case reply::internal_server_error: - return asio::buffer(internal_server_error); - case reply::not_implemented: - return asio::buffer(not_implemented); - case reply::bad_gateway: - return asio::buffer(bad_gateway); - case reply::service_unavailable: - return asio::buffer(service_unavailable); - default: - return asio::buffer(internal_server_error); - } -} - -} // namespace status_strings - -namespace misc_strings { - -const char name_value_separator[] = { ':', ' ' }; -const char crlf[] = { '\r', '\n' }; - -} // namespace misc_strings - -std::vector<asio::const_buffer> reply::to_buffers() -{ - std::vector<asio::const_buffer> buffers; - buffers.push_back(status_strings::to_buffer(status)); - for (std::size_t i = 0; i < headers.size(); ++i) - { - header& h = headers[i]; - buffers.push_back(asio::buffer(h.name)); - buffers.push_back(asio::buffer(misc_strings::name_value_separator)); - buffers.push_back(asio::buffer(h.value)); - buffers.push_back(asio::buffer(misc_strings::crlf)); - } - buffers.push_back(asio::buffer(misc_strings::crlf)); - buffers.push_back(asio::buffer(content)); - return buffers; -} - -namespace stock_replies { - -const char ok[] = ""; -const char created[] = - "<html>" - "<head><title>Created</title></head>" - "<body><h1>201 Created</h1></body>" - "</html>"; -const char accepted[] = - "<html>" - "<head><title>Accepted</title></head>" - "<body><h1>202 Accepted</h1></body>" - "</html>"; -const char no_content[] = - "<html>" - "<head><title>No Content</title></head>" - "<body><h1>204 Content</h1></body>" - "</html>"; -const char multiple_choices[] = - "<html>" - "<head><title>Multiple Choices</title></head>" - "<body><h1>300 Multiple Choices</h1></body>" - "</html>"; -const char moved_permanently[] = - "<html>" - "<head><title>Moved Permanently</title></head>" - "<body><h1>301 Moved Permanently</h1></body>" - "</html>"; -const char moved_temporarily[] = - "<html>" - "<head><title>Moved Temporarily</title></head>" - "<body><h1>302 Moved Temporarily</h1></body>" - "</html>"; -const char not_modified[] = - "<html>" - "<head><title>Not Modified</title></head>" - "<body><h1>304 Not Modified</h1></body>" - "</html>"; -const char bad_request[] = - "<html>" - "<head><title>Bad Request</title></head>" - "<body><h1>400 Bad Request</h1></body>" - "</html>"; -const char unauthorized[] = - "<html>" - "<head><title>Unauthorized</title></head>" - "<body><h1>401 Unauthorized</h1></body>" - "</html>"; -const char forbidden[] = - "<html>" - "<head><title>Forbidden</title></head>" - "<body><h1>403 Forbidden</h1></body>" - "</html>"; -const char not_found[] = - "<html>" - "<head><title>Not Found</title></head>" - "<body><h1>404 Not Found</h1></body>" - "</html>"; -const char internal_server_error[] = - "<html>" - "<head><title>Internal Server Error</title></head>" - "<body><h1>500 Internal Server Error</h1></body>" - "</html>"; -const char not_implemented[] = - "<html>" - "<head><title>Not Implemented</title></head>" - "<body><h1>501 Not Implemented</h1></body>" - "</html>"; -const char bad_gateway[] = - "<html>" - "<head><title>Bad Gateway</title></head>" - "<body><h1>502 Bad Gateway</h1></body>" - "</html>"; -const char service_unavailable[] = - "<html>" - "<head><title>Service Unavailable</title></head>" - "<body><h1>503 Service Unavailable</h1></body>" - "</html>"; - -std::string to_string(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return ok; - case reply::created: - return created; - case reply::accepted: - return accepted; - case reply::no_content: - return no_content; - case reply::multiple_choices: - return multiple_choices; - case reply::moved_permanently: - return moved_permanently; - case reply::moved_temporarily: - return moved_temporarily; - case reply::not_modified: - return not_modified; - case reply::bad_request: - return bad_request; - case reply::unauthorized: - return unauthorized; - case reply::forbidden: - return forbidden; - case reply::not_found: - return not_found; - case reply::internal_server_error: - return internal_server_error; - case reply::not_implemented: - return not_implemented; - case reply::bad_gateway: - return bad_gateway; - case reply::service_unavailable: - return service_unavailable; - default: - return internal_server_error; - } -} - -} // namespace stock_replies - -reply reply::stock_reply(reply::status_type status) -{ - reply rep; - rep.status = status; - rep.content = stock_replies::to_string(status); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = "text/html"; - return rep; -} - -} // namespace server -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server/reply.hpp b/3rdparty/asio/src/examples/cpp03/http/server/reply.hpp deleted file mode 100644 index 5189ac4363e..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/reply.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// reply.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_REPLY_HPP -#define HTTP_REPLY_HPP - -#include <string> -#include <vector> -#include <asio.hpp> -#include "header.hpp" - -namespace http { -namespace server { - -/// A reply to be sent to a client. -struct reply -{ - /// The status of the reply. - enum status_type - { - ok = 200, - created = 201, - accepted = 202, - no_content = 204, - multiple_choices = 300, - moved_permanently = 301, - moved_temporarily = 302, - not_modified = 304, - bad_request = 400, - unauthorized = 401, - forbidden = 403, - not_found = 404, - internal_server_error = 500, - not_implemented = 501, - bad_gateway = 502, - service_unavailable = 503 - } status; - - /// The headers to be included in the reply. - std::vector<header> headers; - - /// The content to be sent in the reply. - std::string content; - - /// Convert the reply into a vector of buffers. The buffers do not own the - /// underlying memory blocks, therefore the reply object must remain valid and - /// not be changed until the write operation has completed. - std::vector<asio::const_buffer> to_buffers(); - - /// Get a stock reply. - static reply stock_reply(status_type status); -}; - -} // namespace server -} // namespace http - -#endif // HTTP_REPLY_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/request.hpp b/3rdparty/asio/src/examples/cpp03/http/server/request.hpp deleted file mode 100644 index 129a3990b3d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/request.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// request.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_REQUEST_HPP -#define HTTP_REQUEST_HPP - -#include <string> -#include <vector> -#include "header.hpp" - -namespace http { -namespace server { - -/// A request received from a client. -struct request -{ - std::string method; - std::string uri; - int http_version_major; - int http_version_minor; - std::vector<header> headers; -}; - -} // namespace server -} // namespace http - -#endif // HTTP_REQUEST_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/request_handler.cpp b/3rdparty/asio/src/examples/cpp03/http/server/request_handler.cpp deleted file mode 100644 index 1201ef109d2..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/request_handler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// request_handler.cpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "request_handler.hpp" -#include <fstream> -#include <sstream> -#include <string> -#include <boost/lexical_cast.hpp> -#include "mime_types.hpp" -#include "reply.hpp" -#include "request.hpp" - -namespace http { -namespace server { - -request_handler::request_handler(const std::string& doc_root) - : doc_root_(doc_root) -{ -} - -void request_handler::handle_request(const request& req, reply& rep) -{ - // Decode url to path. - std::string request_path; - if (!url_decode(req.uri, request_path)) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // Request path must be absolute and not contain "..". - if (request_path.empty() || request_path[0] != '/' - || request_path.find("..") != std::string::npos) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // If path ends in slash (i.e. is a directory) then add "index.html". - if (request_path[request_path.size() - 1] == '/') - { - request_path += "index.html"; - } - - // Determine the file extension. - std::size_t last_slash_pos = request_path.find_last_of("/"); - std::size_t last_dot_pos = request_path.find_last_of("."); - std::string extension; - if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) - { - extension = request_path.substr(last_dot_pos + 1); - } - - // Open the file to send back. - std::string full_path = doc_root_ + request_path; - std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); - if (!is) - { - rep = reply::stock_reply(reply::not_found); - return; - } - - // Fill out the reply to be sent to the client. - rep.status = reply::ok; - char buf[512]; - while (is.read(buf, sizeof(buf)).gcount() > 0) - rep.content.append(buf, is.gcount()); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = mime_types::extension_to_type(extension); -} - -bool request_handler::url_decode(const std::string& in, std::string& out) -{ - out.clear(); - out.reserve(in.size()); - for (std::size_t i = 0; i < in.size(); ++i) - { - if (in[i] == '%') - { - if (i + 3 <= in.size()) - { - int value = 0; - std::istringstream is(in.substr(i + 1, 2)); - if (is >> std::hex >> value) - { - out += static_cast<char>(value); - i += 2; - } - else - { - return false; - } - } - else - { - return false; - } - } - else if (in[i] == '+') - { - out += ' '; - } - else - { - out += in[i]; - } - } - return true; -} - -} // namespace server -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server/request_handler.hpp b/3rdparty/asio/src/examples/cpp03/http/server/request_handler.hpp deleted file mode 100644 index 56a16dd395a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/request_handler.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// request_handler.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_REQUEST_HANDLER_HPP -#define HTTP_REQUEST_HANDLER_HPP - -#include <string> -#include <boost/noncopyable.hpp> - -namespace http { -namespace server { - -struct reply; -struct request; - -/// The common handler for all incoming requests. -class request_handler - : private boost::noncopyable -{ -public: - /// Construct with a directory containing files to be served. - explicit request_handler(const std::string& doc_root); - - /// Handle a request and produce a reply. - void handle_request(const request& req, reply& rep); - -private: - /// The directory containing the files to be served. - std::string doc_root_; - - /// Perform URL-decoding on a string. Returns false if the encoding was - /// invalid. - static bool url_decode(const std::string& in, std::string& out); -}; - -} // namespace server -} // namespace http - -#endif // HTTP_REQUEST_HANDLER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/request_parser.cpp b/3rdparty/asio/src/examples/cpp03/http/server/request_parser.cpp deleted file mode 100644 index 80644eea529..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/request_parser.cpp +++ /dev/null @@ -1,315 +0,0 @@ -// -// request_parser.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "request_parser.hpp" -#include "request.hpp" - -namespace http { -namespace server { - -request_parser::request_parser() - : state_(method_start) -{ -} - -void request_parser::reset() -{ - state_ = method_start; -} - -boost::tribool request_parser::consume(request& req, char input) -{ - switch (state_) - { - case method_start: - if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - state_ = method; - req.method.push_back(input); - return boost::indeterminate; - } - case method: - if (input == ' ') - { - state_ = uri; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.method.push_back(input); - return boost::indeterminate; - } - case uri: - if (input == ' ') - { - state_ = http_version_h; - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - req.uri.push_back(input); - return boost::indeterminate; - } - case http_version_h: - if (input == 'H') - { - state_ = http_version_t_1; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_t_1: - if (input == 'T') - { - state_ = http_version_t_2; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_t_2: - if (input == 'T') - { - state_ = http_version_p; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_p: - if (input == 'P') - { - state_ = http_version_slash; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_slash: - if (input == '/') - { - req.http_version_major = 0; - req.http_version_minor = 0; - state_ = http_version_major_start; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_major_start: - if (is_digit(input)) - { - req.http_version_major = req.http_version_major * 10 + input - '0'; - state_ = http_version_major; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_major: - if (input == '.') - { - state_ = http_version_minor_start; - return boost::indeterminate; - } - else if (is_digit(input)) - { - req.http_version_major = req.http_version_major * 10 + input - '0'; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_minor_start: - if (is_digit(input)) - { - req.http_version_minor = req.http_version_minor * 10 + input - '0'; - state_ = http_version_minor; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_minor: - if (input == '\r') - { - state_ = expecting_newline_1; - return boost::indeterminate; - } - else if (is_digit(input)) - { - req.http_version_minor = req.http_version_minor * 10 + input - '0'; - return boost::indeterminate; - } - else - { - return false; - } - case expecting_newline_1: - if (input == '\n') - { - state_ = header_line_start; - return boost::indeterminate; - } - else - { - return false; - } - case header_line_start: - if (input == '\r') - { - state_ = expecting_newline_3; - return boost::indeterminate; - } - else if (!req.headers.empty() && (input == ' ' || input == '\t')) - { - state_ = header_lws; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.headers.push_back(header()); - req.headers.back().name.push_back(input); - state_ = header_name; - return boost::indeterminate; - } - case header_lws: - if (input == '\r') - { - state_ = expecting_newline_2; - return boost::indeterminate; - } - else if (input == ' ' || input == '\t') - { - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - state_ = header_value; - req.headers.back().value.push_back(input); - return boost::indeterminate; - } - case header_name: - if (input == ':') - { - state_ = space_before_header_value; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.headers.back().name.push_back(input); - return boost::indeterminate; - } - case space_before_header_value: - if (input == ' ') - { - state_ = header_value; - return boost::indeterminate; - } - else - { - return false; - } - case header_value: - if (input == '\r') - { - state_ = expecting_newline_2; - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - req.headers.back().value.push_back(input); - return boost::indeterminate; - } - case expecting_newline_2: - if (input == '\n') - { - state_ = header_line_start; - return boost::indeterminate; - } - else - { - return false; - } - case expecting_newline_3: - return (input == '\n'); - default: - return false; - } -} - -bool request_parser::is_char(int c) -{ - return c >= 0 && c <= 127; -} - -bool request_parser::is_ctl(int c) -{ - return (c >= 0 && c <= 31) || (c == 127); -} - -bool request_parser::is_tspecial(int c) -{ - switch (c) - { - case '(': case ')': case '<': case '>': case '@': - case ',': case ';': case ':': case '\\': case '"': - case '/': case '[': case ']': case '?': case '=': - case '{': case '}': case ' ': case '\t': - return true; - default: - return false; - } -} - -bool request_parser::is_digit(int c) -{ - return c >= '0' && c <= '9'; -} - -} // namespace server -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server/request_parser.hpp b/3rdparty/asio/src/examples/cpp03/http/server/request_parser.hpp deleted file mode 100644 index d7da53cf030..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/request_parser.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// -// request_parser.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_REQUEST_PARSER_HPP -#define HTTP_REQUEST_PARSER_HPP - -#include <boost/logic/tribool.hpp> -#include <boost/tuple/tuple.hpp> - -namespace http { -namespace server { - -struct request; - -/// Parser for incoming requests. -class request_parser -{ -public: - /// Construct ready to parse the request method. - request_parser(); - - /// Reset to initial parser state. - void reset(); - - /// Parse some data. The tribool return value is true when a complete request - /// has been parsed, false if the data is invalid, indeterminate when more - /// data is required. The InputIterator return value indicates how much of the - /// input has been consumed. - template <typename InputIterator> - boost::tuple<boost::tribool, InputIterator> parse(request& req, - InputIterator begin, InputIterator end) - { - while (begin != end) - { - boost::tribool result = consume(req, *begin++); - if (result || !result) - return boost::make_tuple(result, begin); - } - boost::tribool result = boost::indeterminate; - return boost::make_tuple(result, begin); - } - -private: - /// Handle the next character of input. - boost::tribool consume(request& req, char input); - - /// Check if a byte is an HTTP character. - static bool is_char(int c); - - /// Check if a byte is an HTTP control character. - static bool is_ctl(int c); - - /// Check if a byte is defined as an HTTP tspecial character. - static bool is_tspecial(int c); - - /// Check if a byte is a digit. - static bool is_digit(int c); - - /// The current state of the parser. - enum state - { - method_start, - method, - uri, - http_version_h, - http_version_t_1, - http_version_t_2, - http_version_p, - http_version_slash, - http_version_major_start, - http_version_major, - http_version_minor_start, - http_version_minor, - expecting_newline_1, - header_line_start, - header_lws, - header_name, - space_before_header_value, - header_value, - expecting_newline_2, - expecting_newline_3 - } state_; -}; - -} // namespace server -} // namespace http - -#endif // HTTP_REQUEST_PARSER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server/server.cpp b/3rdparty/asio/src/examples/cpp03/http/server/server.cpp deleted file mode 100644 index 89e19d08d42..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/server.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "server.hpp" -#include <boost/bind.hpp> -#include <signal.h> - -namespace http { -namespace server { - -server::server(const std::string& address, const std::string& port, - const std::string& doc_root) - : io_context_(), - signals_(io_context_), - acceptor_(io_context_), - connection_manager_(), - new_connection_(), - request_handler_(doc_root) -{ - // Register to handle the signals that indicate when the server should exit. - // It is safe to register for the same signal multiple times in a program, - // provided all registration for the specified signal is made through Asio. - signals_.add(SIGINT); - signals_.add(SIGTERM); -#if defined(SIGQUIT) - signals_.add(SIGQUIT); -#endif // defined(SIGQUIT) - signals_.async_wait(boost::bind(&server::handle_stop, this)); - - // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). - asio::ip::tcp::resolver resolver(io_context_); - asio::ip::tcp::endpoint endpoint = - *resolver.resolve(address, port).begin(); - acceptor_.open(endpoint.protocol()); - acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true)); - acceptor_.bind(endpoint); - acceptor_.listen(); - - start_accept(); -} - -void server::run() -{ - // The io_context::run() call will block until all asynchronous operations - // have finished. While the server is running, there is always at least one - // asynchronous operation outstanding: the asynchronous accept call waiting - // for new incoming connections. - io_context_.run(); -} - -void server::start_accept() -{ - new_connection_.reset(new connection(io_context_, - connection_manager_, request_handler_)); - acceptor_.async_accept(new_connection_->socket(), - boost::bind(&server::handle_accept, this, - asio::placeholders::error)); -} - -void server::handle_accept(const asio::error_code& e) -{ - // Check whether the server was stopped by a signal before this completion - // handler had a chance to run. - if (!acceptor_.is_open()) - { - return; - } - - if (!e) - { - connection_manager_.start(new_connection_); - } - - start_accept(); -} - -void server::handle_stop() -{ - // The server is stopped by cancelling all outstanding asynchronous - // operations. Once all operations have finished the io_context::run() call - // will exit. - acceptor_.close(); - connection_manager_.stop_all(); -} - -} // namespace server -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server/server.hpp b/3rdparty/asio/src/examples/cpp03/http/server/server.hpp deleted file mode 100644 index 8b0b1a23296..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server/server.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// -// server.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER_HPP -#define HTTP_SERVER_HPP - -#include <asio.hpp> -#include <string> -#include <boost/noncopyable.hpp> -#include "connection.hpp" -#include "connection_manager.hpp" -#include "request_handler.hpp" - -namespace http { -namespace server { - -/// The top-level class of the HTTP server. -class server - : private boost::noncopyable -{ -public: - /// Construct the server to listen on the specified TCP address and port, and - /// serve up files from the given directory. - explicit server(const std::string& address, const std::string& port, - const std::string& doc_root); - - /// Run the server's io_context loop. - void run(); - -private: - /// Initiate an asynchronous accept operation. - void start_accept(); - - /// Handle completion of an asynchronous accept operation. - void handle_accept(const asio::error_code& e); - - /// Handle a request to stop the server. - void handle_stop(); - - /// The io_context used to perform asynchronous operations. - asio::io_context io_context_; - - /// The signal_set is used to register for process termination notifications. - asio::signal_set signals_; - - /// Acceptor used to listen for incoming connections. - asio::ip::tcp::acceptor acceptor_; - - /// The connection manager which owns all live connections. - connection_manager connection_manager_; - - /// The next connection to be accepted. - connection_ptr new_connection_; - - /// The handler for all incoming requests. - request_handler request_handler_; -}; - -} // namespace server -} // namespace http - -#endif // HTTP_SERVER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/.gitignore b/3rdparty/asio/src/examples/cpp03/http/server2/.gitignore deleted file mode 100644 index 0882fa6ced3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_server -*_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/connection.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/connection.cpp deleted file mode 100644 index 81f4a102217..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/connection.cpp +++ /dev/null @@ -1,93 +0,0 @@ -// -// connection.cpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "connection.hpp" -#include <vector> -#include <boost/bind.hpp> -#include "request_handler.hpp" - -namespace http { -namespace server2 { - -connection::connection(asio::io_context& io_context, - request_handler& handler) - : socket_(io_context), - request_handler_(handler) -{ -} - -asio::ip::tcp::socket& connection::socket() -{ - return socket_; -} - -void connection::start() -{ - socket_.async_read_some(asio::buffer(buffer_), - boost::bind(&connection::handle_read, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); -} - -void connection::handle_read(const asio::error_code& e, - std::size_t bytes_transferred) -{ - if (!e) - { - boost::tribool result; - boost::tie(result, boost::tuples::ignore) = request_parser_.parse( - request_, buffer_.data(), buffer_.data() + bytes_transferred); - - if (result) - { - request_handler_.handle_request(request_, reply_); - asio::async_write(socket_, reply_.to_buffers(), - boost::bind(&connection::handle_write, shared_from_this(), - asio::placeholders::error)); - } - else if (!result) - { - reply_ = reply::stock_reply(reply::bad_request); - asio::async_write(socket_, reply_.to_buffers(), - boost::bind(&connection::handle_write, shared_from_this(), - asio::placeholders::error)); - } - else - { - socket_.async_read_some(asio::buffer(buffer_), - boost::bind(&connection::handle_read, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - } - - // If an error occurs then no new asynchronous operations are started. This - // means that all shared_ptr references to the connection object will - // disappear and the object will be destroyed automatically after this - // handler returns. The connection class's destructor closes the socket. -} - -void connection::handle_write(const asio::error_code& e) -{ - if (!e) - { - // Initiate graceful connection closure. - asio::error_code ignored_ec; - socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec); - } - - // No new asynchronous operations are started. This means that all shared_ptr - // references to the connection object will disappear and the object will be - // destroyed automatically after this handler returns. The connection class's - // destructor closes the socket. -} - -} // namespace server2 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/connection.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/connection.hpp deleted file mode 100644 index 9c624a8a172..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/connection.hpp +++ /dev/null @@ -1,75 +0,0 @@ -// -// connection.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_CONNECTION_HPP -#define HTTP_SERVER2_CONNECTION_HPP - -#include <asio.hpp> -#include <boost/array.hpp> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include "reply.hpp" -#include "request.hpp" -#include "request_handler.hpp" -#include "request_parser.hpp" - -namespace http { -namespace server2 { - -/// Represents a single connection from a client. -class connection - : public boost::enable_shared_from_this<connection>, - private boost::noncopyable -{ -public: - /// Construct a connection with the given io_context. - explicit connection(asio::io_context& io_context, - request_handler& handler); - - /// Get the socket associated with the connection. - asio::ip::tcp::socket& socket(); - - /// Start the first asynchronous operation for the connection. - void start(); - -private: - /// Handle completion of a read operation. - void handle_read(const asio::error_code& e, - std::size_t bytes_transferred); - - /// Handle completion of a write operation. - void handle_write(const asio::error_code& e); - - /// Socket for the connection. - asio::ip::tcp::socket socket_; - - /// The handler used to process the incoming request. - request_handler& request_handler_; - - /// Buffer for incoming data. - boost::array<char, 8192> 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_; -}; - -typedef boost::shared_ptr<connection> connection_ptr; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_CONNECTION_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/header.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/header.hpp deleted file mode 100644 index 0e44c551409..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/header.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// header.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_HEADER_HPP -#define HTTP_SERVER2_HEADER_HPP - -#include <string> - -namespace http { -namespace server2 { - -struct header -{ - std::string name; - std::string value; -}; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/io_context_pool.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/io_context_pool.cpp deleted file mode 100644 index 049ac988615..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/io_context_pool.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// -// io_context_pool.cpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "server.hpp" -#include <stdexcept> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> - -namespace http { -namespace server2 { - -io_context_pool::io_context_pool(std::size_t pool_size) - : next_io_context_(0) -{ - if (pool_size == 0) - throw std::runtime_error("io_context_pool size is 0"); - - // Give all the io_contexts work to do so that their run() functions will not - // exit until they are explicitly stopped. - for (std::size_t i = 0; i < pool_size; ++i) - { - io_context_ptr io_context(new asio::io_context); - io_contexts_.push_back(io_context); - work_.push_back(asio::make_work_guard(*io_context)); - } -} - -void io_context_pool::run() -{ - // Create a pool of threads to run all of the io_contexts. - std::vector<boost::shared_ptr<asio::thread> > threads; - for (std::size_t i = 0; i < io_contexts_.size(); ++i) - { - boost::shared_ptr<asio::thread> thread(new asio::thread( - boost::bind(&asio::io_context::run, io_contexts_[i]))); - threads.push_back(thread); - } - - // Wait for all threads in the pool to exit. - for (std::size_t i = 0; i < threads.size(); ++i) - threads[i]->join(); -} - -void io_context_pool::stop() -{ - // Explicitly stop all io_contexts. - for (std::size_t i = 0; i < io_contexts_.size(); ++i) - io_contexts_[i]->stop(); -} - -asio::io_context& io_context_pool::get_io_context() -{ - // Use a round-robin scheme to choose the next io_context to use. - asio::io_context& io_context = *io_contexts_[next_io_context_]; - ++next_io_context_; - if (next_io_context_ == io_contexts_.size()) - next_io_context_ = 0; - return io_context; -} - -} // namespace server2 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/io_context_pool.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/io_context_pool.hpp deleted file mode 100644 index 6a573c539f6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/io_context_pool.hpp +++ /dev/null @@ -1,57 +0,0 @@ -// -// io_context_pool.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_IO_SERVICE_POOL_HPP -#define HTTP_SERVER2_IO_SERVICE_POOL_HPP - -#include <asio.hpp> -#include <vector> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> - -namespace http { -namespace server2 { - -/// A pool of io_context objects. -class io_context_pool - : private boost::noncopyable -{ -public: - /// Construct the io_context pool. - explicit io_context_pool(std::size_t pool_size); - - /// Run all io_context objects in the pool. - void run(); - - /// Stop all io_context objects in the pool. - void stop(); - - /// Get an io_context to use. - asio::io_context& get_io_context(); - -private: - typedef boost::shared_ptr<asio::io_context> io_context_ptr; - typedef asio::executor_work_guard< - asio::io_context::executor_type> io_context_work; - - /// The pool of io_contexts. - std::vector<io_context_ptr> io_contexts_; - - /// The work that keeps the io_contexts running. - std::vector<io_context_work> work_; - - /// The next io_context to use for a connection. - std::size_t next_io_context_; -}; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_IO_SERVICE_POOL_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/main.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/main.cpp deleted file mode 100644 index 2d224c5bac1..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/main.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// main.cpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <string> -#include <asio.hpp> -#include <boost/bind.hpp> -#include <boost/lexical_cast.hpp> -#include "server.hpp" - -int main(int argc, char* argv[]) -{ - try - { - // Check command line arguments. - if (argc != 5) - { - std::cerr << "Usage: http_server <address> <port> <threads> <doc_root>\n"; - std::cerr << " For IPv4, try:\n"; - std::cerr << " receiver 0.0.0.0 80 1 .\n"; - std::cerr << " For IPv6, try:\n"; - std::cerr << " receiver 0::0 80 1 .\n"; - return 1; - } - - // Initialise the server. - std::size_t num_threads = boost::lexical_cast<std::size_t>(argv[3]); - http::server2::server s(argv[1], argv[2], argv[4], num_threads); - - // Run the server until stopped. - s.run(); - } - catch (std::exception& e) - { - std::cerr << "exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/mime_types.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/mime_types.cpp deleted file mode 100644 index 640f3aedc44..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/mime_types.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// mime_types.cpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "mime_types.hpp" - -namespace http { -namespace server2 { -namespace mime_types { - -struct mapping -{ - const char* extension; - const char* mime_type; -} mappings[] = -{ - { "gif", "image/gif" }, - { "htm", "text/html" }, - { "html", "text/html" }, - { "jpg", "image/jpeg" }, - { "png", "image/png" }, - { 0, 0 } // Marks end of list. -}; - -std::string extension_to_type(const std::string& extension) -{ - for (mapping* m = mappings; m->extension; ++m) - { - if (m->extension == extension) - { - return m->mime_type; - } - } - - return "text/plain"; -} - -} // namespace mime_types -} // namespace server2 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/mime_types.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/mime_types.hpp deleted file mode 100644 index 57d1412b7b1..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/mime_types.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// mime_types.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_MIME_TYPES_HPP -#define HTTP_SERVER2_MIME_TYPES_HPP - -#include <string> - -namespace http { -namespace server2 { -namespace mime_types { - -/// Convert a file extension into a MIME type. -std::string extension_to_type(const std::string& extension); - -} // namespace mime_types -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_MIME_TYPES_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/reply.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/reply.cpp deleted file mode 100644 index 958577b2ce4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/reply.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// -// reply.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "reply.hpp" -#include <string> -#include <boost/lexical_cast.hpp> - -namespace http { -namespace server2 { - -namespace status_strings { - -const std::string ok = - "HTTP/1.0 200 OK\r\n"; -const std::string created = - "HTTP/1.0 201 Created\r\n"; -const std::string accepted = - "HTTP/1.0 202 Accepted\r\n"; -const std::string no_content = - "HTTP/1.0 204 No Content\r\n"; -const std::string multiple_choices = - "HTTP/1.0 300 Multiple Choices\r\n"; -const std::string moved_permanently = - "HTTP/1.0 301 Moved Permanently\r\n"; -const std::string moved_temporarily = - "HTTP/1.0 302 Moved Temporarily\r\n"; -const std::string not_modified = - "HTTP/1.0 304 Not Modified\r\n"; -const std::string bad_request = - "HTTP/1.0 400 Bad Request\r\n"; -const std::string unauthorized = - "HTTP/1.0 401 Unauthorized\r\n"; -const std::string forbidden = - "HTTP/1.0 403 Forbidden\r\n"; -const std::string not_found = - "HTTP/1.0 404 Not Found\r\n"; -const std::string internal_server_error = - "HTTP/1.0 500 Internal Server Error\r\n"; -const std::string not_implemented = - "HTTP/1.0 501 Not Implemented\r\n"; -const std::string bad_gateway = - "HTTP/1.0 502 Bad Gateway\r\n"; -const std::string service_unavailable = - "HTTP/1.0 503 Service Unavailable\r\n"; - -asio::const_buffer to_buffer(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return asio::buffer(ok); - case reply::created: - return asio::buffer(created); - case reply::accepted: - return asio::buffer(accepted); - case reply::no_content: - return asio::buffer(no_content); - case reply::multiple_choices: - return asio::buffer(multiple_choices); - case reply::moved_permanently: - return asio::buffer(moved_permanently); - case reply::moved_temporarily: - return asio::buffer(moved_temporarily); - case reply::not_modified: - return asio::buffer(not_modified); - case reply::bad_request: - return asio::buffer(bad_request); - case reply::unauthorized: - return asio::buffer(unauthorized); - case reply::forbidden: - return asio::buffer(forbidden); - case reply::not_found: - return asio::buffer(not_found); - case reply::internal_server_error: - return asio::buffer(internal_server_error); - case reply::not_implemented: - return asio::buffer(not_implemented); - case reply::bad_gateway: - return asio::buffer(bad_gateway); - case reply::service_unavailable: - return asio::buffer(service_unavailable); - default: - return asio::buffer(internal_server_error); - } -} - -} // namespace status_strings - -namespace misc_strings { - -const char name_value_separator[] = { ':', ' ' }; -const char crlf[] = { '\r', '\n' }; - -} // namespace misc_strings - -std::vector<asio::const_buffer> reply::to_buffers() -{ - std::vector<asio::const_buffer> buffers; - buffers.push_back(status_strings::to_buffer(status)); - for (std::size_t i = 0; i < headers.size(); ++i) - { - header& h = headers[i]; - buffers.push_back(asio::buffer(h.name)); - buffers.push_back(asio::buffer(misc_strings::name_value_separator)); - buffers.push_back(asio::buffer(h.value)); - buffers.push_back(asio::buffer(misc_strings::crlf)); - } - buffers.push_back(asio::buffer(misc_strings::crlf)); - buffers.push_back(asio::buffer(content)); - return buffers; -} - -namespace stock_replies { - -const char ok[] = ""; -const char created[] = - "<html>" - "<head><title>Created</title></head>" - "<body><h1>201 Created</h1></body>" - "</html>"; -const char accepted[] = - "<html>" - "<head><title>Accepted</title></head>" - "<body><h1>202 Accepted</h1></body>" - "</html>"; -const char no_content[] = - "<html>" - "<head><title>No Content</title></head>" - "<body><h1>204 Content</h1></body>" - "</html>"; -const char multiple_choices[] = - "<html>" - "<head><title>Multiple Choices</title></head>" - "<body><h1>300 Multiple Choices</h1></body>" - "</html>"; -const char moved_permanently[] = - "<html>" - "<head><title>Moved Permanently</title></head>" - "<body><h1>301 Moved Permanently</h1></body>" - "</html>"; -const char moved_temporarily[] = - "<html>" - "<head><title>Moved Temporarily</title></head>" - "<body><h1>302 Moved Temporarily</h1></body>" - "</html>"; -const char not_modified[] = - "<html>" - "<head><title>Not Modified</title></head>" - "<body><h1>304 Not Modified</h1></body>" - "</html>"; -const char bad_request[] = - "<html>" - "<head><title>Bad Request</title></head>" - "<body><h1>400 Bad Request</h1></body>" - "</html>"; -const char unauthorized[] = - "<html>" - "<head><title>Unauthorized</title></head>" - "<body><h1>401 Unauthorized</h1></body>" - "</html>"; -const char forbidden[] = - "<html>" - "<head><title>Forbidden</title></head>" - "<body><h1>403 Forbidden</h1></body>" - "</html>"; -const char not_found[] = - "<html>" - "<head><title>Not Found</title></head>" - "<body><h1>404 Not Found</h1></body>" - "</html>"; -const char internal_server_error[] = - "<html>" - "<head><title>Internal Server Error</title></head>" - "<body><h1>500 Internal Server Error</h1></body>" - "</html>"; -const char not_implemented[] = - "<html>" - "<head><title>Not Implemented</title></head>" - "<body><h1>501 Not Implemented</h1></body>" - "</html>"; -const char bad_gateway[] = - "<html>" - "<head><title>Bad Gateway</title></head>" - "<body><h1>502 Bad Gateway</h1></body>" - "</html>"; -const char service_unavailable[] = - "<html>" - "<head><title>Service Unavailable</title></head>" - "<body><h1>503 Service Unavailable</h1></body>" - "</html>"; - -std::string to_string(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return ok; - case reply::created: - return created; - case reply::accepted: - return accepted; - case reply::no_content: - return no_content; - case reply::multiple_choices: - return multiple_choices; - case reply::moved_permanently: - return moved_permanently; - case reply::moved_temporarily: - return moved_temporarily; - case reply::not_modified: - return not_modified; - case reply::bad_request: - return bad_request; - case reply::unauthorized: - return unauthorized; - case reply::forbidden: - return forbidden; - case reply::not_found: - return not_found; - case reply::internal_server_error: - return internal_server_error; - case reply::not_implemented: - return not_implemented; - case reply::bad_gateway: - return bad_gateway; - case reply::service_unavailable: - return service_unavailable; - default: - return internal_server_error; - } -} - -} // namespace stock_replies - -reply reply::stock_reply(reply::status_type status) -{ - reply rep; - rep.status = status; - rep.content = stock_replies::to_string(status); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = "text/html"; - return rep; -} - -} // namespace server2 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/reply.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/reply.hpp deleted file mode 100644 index 17f11e7dde3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/reply.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// reply.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_REPLY_HPP -#define HTTP_SERVER2_REPLY_HPP - -#include <string> -#include <vector> -#include <asio.hpp> -#include "header.hpp" - -namespace http { -namespace server2 { - -/// A reply to be sent to a client. -struct reply -{ - /// The status of the reply. - enum status_type - { - ok = 200, - created = 201, - accepted = 202, - no_content = 204, - multiple_choices = 300, - moved_permanently = 301, - moved_temporarily = 302, - not_modified = 304, - bad_request = 400, - unauthorized = 401, - forbidden = 403, - not_found = 404, - internal_server_error = 500, - not_implemented = 501, - bad_gateway = 502, - service_unavailable = 503 - } status; - - /// The headers to be included in the reply. - std::vector<header> headers; - - /// The content to be sent in the reply. - std::string content; - - /// Convert the reply into a vector of buffers. The buffers do not own the - /// underlying memory blocks, therefore the reply object must remain valid and - /// not be changed until the write operation has completed. - std::vector<asio::const_buffer> to_buffers(); - - /// Get a stock reply. - static reply stock_reply(status_type status); -}; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_REPLY_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/request.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/request.hpp deleted file mode 100644 index 39070ee2f84..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/request.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// request.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_REQUEST_HPP -#define HTTP_SERVER2_REQUEST_HPP - -#include <string> -#include <vector> -#include "header.hpp" - -namespace http { -namespace server2 { - -/// A request received from a client. -struct request -{ - std::string method; - std::string uri; - int http_version_major; - int http_version_minor; - std::vector<header> headers; -}; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_REQUEST_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/request_handler.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/request_handler.cpp deleted file mode 100644 index 9369c107166..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/request_handler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// request_handler.cpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "request_handler.hpp" -#include <fstream> -#include <sstream> -#include <string> -#include <boost/lexical_cast.hpp> -#include "mime_types.hpp" -#include "reply.hpp" -#include "request.hpp" - -namespace http { -namespace server2 { - -request_handler::request_handler(const std::string& doc_root) - : doc_root_(doc_root) -{ -} - -void request_handler::handle_request(const request& req, reply& rep) -{ - // Decode url to path. - std::string request_path; - if (!url_decode(req.uri, request_path)) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // Request path must be absolute and not contain "..". - if (request_path.empty() || request_path[0] != '/' - || request_path.find("..") != std::string::npos) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // If path ends in slash (i.e. is a directory) then add "index.html". - if (request_path[request_path.size() - 1] == '/') - { - request_path += "index.html"; - } - - // Determine the file extension. - std::size_t last_slash_pos = request_path.find_last_of("/"); - std::size_t last_dot_pos = request_path.find_last_of("."); - std::string extension; - if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) - { - extension = request_path.substr(last_dot_pos + 1); - } - - // Open the file to send back. - std::string full_path = doc_root_ + request_path; - std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); - if (!is) - { - rep = reply::stock_reply(reply::not_found); - return; - } - - // Fill out the reply to be sent to the client. - rep.status = reply::ok; - char buf[512]; - while (is.read(buf, sizeof(buf)).gcount() > 0) - rep.content.append(buf, is.gcount()); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = mime_types::extension_to_type(extension); -} - -bool request_handler::url_decode(const std::string& in, std::string& out) -{ - out.clear(); - out.reserve(in.size()); - for (std::size_t i = 0; i < in.size(); ++i) - { - if (in[i] == '%') - { - if (i + 3 <= in.size()) - { - int value = 0; - std::istringstream is(in.substr(i + 1, 2)); - if (is >> std::hex >> value) - { - out += static_cast<char>(value); - i += 2; - } - else - { - return false; - } - } - else - { - return false; - } - } - else if (in[i] == '+') - { - out += ' '; - } - else - { - out += in[i]; - } - } - return true; -} - -} // namespace server2 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/request_handler.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/request_handler.hpp deleted file mode 100644 index 8d24686fa54..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/request_handler.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// request_handler.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_REQUEST_HANDLER_HPP -#define HTTP_SERVER2_REQUEST_HANDLER_HPP - -#include <string> -#include <boost/noncopyable.hpp> - -namespace http { -namespace server2 { - -struct reply; -struct request; - -/// The common handler for all incoming requests. -class request_handler - : private boost::noncopyable -{ -public: - /// Construct with a directory containing files to be served. - explicit request_handler(const std::string& doc_root); - - /// Handle a request and produce a reply. - void handle_request(const request& req, reply& rep); - -private: - /// The directory containing the files to be served. - std::string doc_root_; - - /// Perform URL-decoding on a string. Returns false if the encoding was - /// invalid. - static bool url_decode(const std::string& in, std::string& out); -}; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_REQUEST_HANDLER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/request_parser.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/request_parser.cpp deleted file mode 100644 index ae80b20f784..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/request_parser.cpp +++ /dev/null @@ -1,315 +0,0 @@ -// -// request_parser.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "request_parser.hpp" -#include "request.hpp" - -namespace http { -namespace server2 { - -request_parser::request_parser() - : state_(method_start) -{ -} - -void request_parser::reset() -{ - state_ = method_start; -} - -boost::tribool request_parser::consume(request& req, char input) -{ - switch (state_) - { - case method_start: - if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - state_ = method; - req.method.push_back(input); - return boost::indeterminate; - } - case method: - if (input == ' ') - { - state_ = uri; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.method.push_back(input); - return boost::indeterminate; - } - case uri: - if (input == ' ') - { - state_ = http_version_h; - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - req.uri.push_back(input); - return boost::indeterminate; - } - case http_version_h: - if (input == 'H') - { - state_ = http_version_t_1; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_t_1: - if (input == 'T') - { - state_ = http_version_t_2; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_t_2: - if (input == 'T') - { - state_ = http_version_p; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_p: - if (input == 'P') - { - state_ = http_version_slash; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_slash: - if (input == '/') - { - req.http_version_major = 0; - req.http_version_minor = 0; - state_ = http_version_major_start; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_major_start: - if (is_digit(input)) - { - req.http_version_major = req.http_version_major * 10 + input - '0'; - state_ = http_version_major; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_major: - if (input == '.') - { - state_ = http_version_minor_start; - return boost::indeterminate; - } - else if (is_digit(input)) - { - req.http_version_major = req.http_version_major * 10 + input - '0'; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_minor_start: - if (is_digit(input)) - { - req.http_version_minor = req.http_version_minor * 10 + input - '0'; - state_ = http_version_minor; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_minor: - if (input == '\r') - { - state_ = expecting_newline_1; - return boost::indeterminate; - } - else if (is_digit(input)) - { - req.http_version_minor = req.http_version_minor * 10 + input - '0'; - return boost::indeterminate; - } - else - { - return false; - } - case expecting_newline_1: - if (input == '\n') - { - state_ = header_line_start; - return boost::indeterminate; - } - else - { - return false; - } - case header_line_start: - if (input == '\r') - { - state_ = expecting_newline_3; - return boost::indeterminate; - } - else if (!req.headers.empty() && (input == ' ' || input == '\t')) - { - state_ = header_lws; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.headers.push_back(header()); - req.headers.back().name.push_back(input); - state_ = header_name; - return boost::indeterminate; - } - case header_lws: - if (input == '\r') - { - state_ = expecting_newline_2; - return boost::indeterminate; - } - else if (input == ' ' || input == '\t') - { - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - state_ = header_value; - req.headers.back().value.push_back(input); - return boost::indeterminate; - } - case header_name: - if (input == ':') - { - state_ = space_before_header_value; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.headers.back().name.push_back(input); - return boost::indeterminate; - } - case space_before_header_value: - if (input == ' ') - { - state_ = header_value; - return boost::indeterminate; - } - else - { - return false; - } - case header_value: - if (input == '\r') - { - state_ = expecting_newline_2; - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - req.headers.back().value.push_back(input); - return boost::indeterminate; - } - case expecting_newline_2: - if (input == '\n') - { - state_ = header_line_start; - return boost::indeterminate; - } - else - { - return false; - } - case expecting_newline_3: - return (input == '\n'); - default: - return false; - } -} - -bool request_parser::is_char(int c) -{ - return c >= 0 && c <= 127; -} - -bool request_parser::is_ctl(int c) -{ - return (c >= 0 && c <= 31) || (c == 127); -} - -bool request_parser::is_tspecial(int c) -{ - switch (c) - { - case '(': case ')': case '<': case '>': case '@': - case ',': case ';': case ':': case '\\': case '"': - case '/': case '[': case ']': case '?': case '=': - case '{': case '}': case ' ': case '\t': - return true; - default: - return false; - } -} - -bool request_parser::is_digit(int c) -{ - return c >= '0' && c <= '9'; -} - -} // namespace server2 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/request_parser.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/request_parser.hpp deleted file mode 100644 index 133a6492058..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/request_parser.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// -// request_parser.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_REQUEST_PARSER_HPP -#define HTTP_SERVER2_REQUEST_PARSER_HPP - -#include <boost/logic/tribool.hpp> -#include <boost/tuple/tuple.hpp> - -namespace http { -namespace server2 { - -struct request; - -/// Parser for incoming requests. -class request_parser -{ -public: - /// Construct ready to parse the request method. - request_parser(); - - /// Reset to initial parser state. - void reset(); - - /// Parse some data. The tribool return value is true when a complete request - /// has been parsed, false if the data is invalid, indeterminate when more - /// data is required. The InputIterator return value indicates how much of the - /// input has been consumed. - template <typename InputIterator> - boost::tuple<boost::tribool, InputIterator> parse(request& req, - InputIterator begin, InputIterator end) - { - while (begin != end) - { - boost::tribool result = consume(req, *begin++); - if (result || !result) - return boost::make_tuple(result, begin); - } - boost::tribool result = boost::indeterminate; - return boost::make_tuple(result, begin); - } - -private: - /// Handle the next character of input. - boost::tribool consume(request& req, char input); - - /// Check if a byte is an HTTP character. - static bool is_char(int c); - - /// Check if a byte is an HTTP control character. - static bool is_ctl(int c); - - /// Check if a byte is defined as an HTTP tspecial character. - static bool is_tspecial(int c); - - /// Check if a byte is a digit. - static bool is_digit(int c); - - /// The current state of the parser. - enum state - { - method_start, - method, - uri, - http_version_h, - http_version_t_1, - http_version_t_2, - http_version_p, - http_version_slash, - http_version_major_start, - http_version_major, - http_version_minor_start, - http_version_minor, - expecting_newline_1, - header_line_start, - header_lws, - header_name, - space_before_header_value, - header_value, - expecting_newline_2, - expecting_newline_3 - } state_; -}; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_REQUEST_PARSER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/server.cpp b/3rdparty/asio/src/examples/cpp03/http/server2/server.cpp deleted file mode 100644 index 75d3a48aa84..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/server.cpp +++ /dev/null @@ -1,77 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "server.hpp" -#include <boost/bind.hpp> - -namespace http { -namespace server2 { - -server::server(const std::string& address, const std::string& port, - const std::string& doc_root, std::size_t io_context_pool_size) - : io_context_pool_(io_context_pool_size), - signals_(io_context_pool_.get_io_context()), - acceptor_(io_context_pool_.get_io_context()), - new_connection_(), - request_handler_(doc_root) -{ - // Register to handle the signals that indicate when the server should exit. - // It is safe to register for the same signal multiple times in a program, - // provided all registration for the specified signal is made through Asio. - signals_.add(SIGINT); - signals_.add(SIGTERM); -#if defined(SIGQUIT) - signals_.add(SIGQUIT); -#endif // defined(SIGQUIT) - signals_.async_wait(boost::bind(&server::handle_stop, this)); - - // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). - asio::ip::tcp::resolver resolver(acceptor_.get_executor().context()); - asio::ip::tcp::endpoint endpoint = - *resolver.resolve(address, port).begin(); - acceptor_.open(endpoint.protocol()); - acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true)); - acceptor_.bind(endpoint); - acceptor_.listen(); - - start_accept(); -} - -void server::run() -{ - io_context_pool_.run(); -} - -void server::start_accept() -{ - new_connection_.reset(new connection( - io_context_pool_.get_io_context(), request_handler_)); - acceptor_.async_accept(new_connection_->socket(), - boost::bind(&server::handle_accept, this, - asio::placeholders::error)); -} - -void server::handle_accept(const asio::error_code& e) -{ - if (!e) - { - new_connection_->start(); - } - - start_accept(); -} - -void server::handle_stop() -{ - io_context_pool_.stop(); -} - -} // namespace server2 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server2/server.hpp b/3rdparty/asio/src/examples/cpp03/http/server2/server.hpp deleted file mode 100644 index 6a742a8220a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server2/server.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// server.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER2_SERVER_HPP -#define HTTP_SERVER2_SERVER_HPP - -#include <asio.hpp> -#include <string> -#include <vector> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> -#include "connection.hpp" -#include "io_context_pool.hpp" -#include "request_handler.hpp" - -namespace http { -namespace server2 { - -/// The top-level class of the HTTP server. -class server - : private boost::noncopyable -{ -public: - /// Construct the server to listen on the specified TCP address and port, and - /// serve up files from the given directory. - explicit server(const std::string& address, const std::string& port, - const std::string& doc_root, std::size_t io_context_pool_size); - - /// Run the server's io_context loop. - void run(); - -private: - /// Initiate an asynchronous accept operation. - void start_accept(); - - /// Handle completion of an asynchronous accept operation. - void handle_accept(const asio::error_code& e); - - /// Handle a request to stop the server. - void handle_stop(); - - /// The pool of io_context objects used to perform asynchronous operations. - io_context_pool io_context_pool_; - - /// The signal_set is used to register for process termination notifications. - asio::signal_set signals_; - - /// Acceptor used to listen for incoming connections. - asio::ip::tcp::acceptor acceptor_; - - /// The next connection to be accepted. - connection_ptr new_connection_; - - /// The handler for all incoming requests. - request_handler request_handler_; -}; - -} // namespace server2 -} // namespace http - -#endif // HTTP_SERVER2_SERVER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/.gitignore b/3rdparty/asio/src/examples/cpp03/http/server3/.gitignore deleted file mode 100644 index 0882fa6ced3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_server -*_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/connection.cpp b/3rdparty/asio/src/examples/cpp03/http/server3/connection.cpp deleted file mode 100644 index 5db960a9109..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/connection.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// -// connection.cpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "connection.hpp" -#include <vector> -#include <boost/bind.hpp> -#include "request_handler.hpp" - -namespace http { -namespace server3 { - -connection::connection(asio::io_context& io_context, - request_handler& handler) - : strand_(io_context), - socket_(io_context), - request_handler_(handler) -{ -} - -asio::ip::tcp::socket& connection::socket() -{ - return socket_; -} - -void connection::start() -{ - socket_.async_read_some(asio::buffer(buffer_), - asio::bind_executor(strand_, - boost::bind(&connection::handle_read, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred))); -} - -void connection::handle_read(const asio::error_code& e, - std::size_t bytes_transferred) -{ - if (!e) - { - boost::tribool result; - boost::tie(result, boost::tuples::ignore) = request_parser_.parse( - request_, buffer_.data(), buffer_.data() + bytes_transferred); - - if (result) - { - request_handler_.handle_request(request_, reply_); - asio::async_write(socket_, reply_.to_buffers(), - asio::bind_executor(strand_, - boost::bind(&connection::handle_write, shared_from_this(), - asio::placeholders::error))); - } - else if (!result) - { - reply_ = reply::stock_reply(reply::bad_request); - asio::async_write(socket_, reply_.to_buffers(), - asio::bind_executor(strand_, - boost::bind(&connection::handle_write, shared_from_this(), - asio::placeholders::error))); - } - else - { - socket_.async_read_some(asio::buffer(buffer_), - asio::bind_executor(strand_, - boost::bind(&connection::handle_read, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred))); - } - } - - // If an error occurs then no new asynchronous operations are started. This - // means that all shared_ptr references to the connection object will - // disappear and the object will be destroyed automatically after this - // handler returns. The connection class's destructor closes the socket. -} - -void connection::handle_write(const asio::error_code& e) -{ - if (!e) - { - // Initiate graceful connection closure. - asio::error_code ignored_ec; - socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec); - } - - // No new asynchronous operations are started. This means that all shared_ptr - // references to the connection object will disappear and the object will be - // destroyed automatically after this handler returns. The connection class's - // destructor closes the socket. -} - -} // namespace server3 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/connection.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/connection.hpp deleted file mode 100644 index 2aac1a5c7ae..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/connection.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// connection.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_CONNECTION_HPP -#define HTTP_SERVER3_CONNECTION_HPP - -#include <asio.hpp> -#include <boost/array.hpp> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include "reply.hpp" -#include "request.hpp" -#include "request_handler.hpp" -#include "request_parser.hpp" - -namespace http { -namespace server3 { - -/// Represents a single connection from a client. -class connection - : public boost::enable_shared_from_this<connection>, - private boost::noncopyable -{ -public: - /// Construct a connection with the given io_context. - explicit connection(asio::io_context& io_context, - request_handler& handler); - - /// Get the socket associated with the connection. - asio::ip::tcp::socket& socket(); - - /// Start the first asynchronous operation for the connection. - void start(); - -private: - /// Handle completion of a read operation. - void handle_read(const asio::error_code& e, - std::size_t bytes_transferred); - - /// Handle completion of a write operation. - void handle_write(const asio::error_code& e); - - /// Strand to ensure the connection's handlers are not called concurrently. - asio::io_context::strand strand_; - - /// Socket for the connection. - asio::ip::tcp::socket socket_; - - /// The handler used to process the incoming request. - request_handler& request_handler_; - - /// Buffer for incoming data. - boost::array<char, 8192> 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_; -}; - -typedef boost::shared_ptr<connection> connection_ptr; - -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_CONNECTION_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/header.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/header.hpp deleted file mode 100644 index 207c6290784..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/header.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// header.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_HEADER_HPP -#define HTTP_SERVER3_HEADER_HPP - -#include <string> - -namespace http { -namespace server3 { - -struct header -{ - std::string name; - std::string value; -}; - -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/main.cpp b/3rdparty/asio/src/examples/cpp03/http/server3/main.cpp deleted file mode 100644 index 367efad729f..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/main.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// main.cpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <string> -#include <asio.hpp> -#include <boost/bind.hpp> -#include <boost/lexical_cast.hpp> -#include "server.hpp" - -int main(int argc, char* argv[]) -{ - try - { - // Check command line arguments. - if (argc != 5) - { - std::cerr << "Usage: http_server <address> <port> <threads> <doc_root>\n"; - std::cerr << " For IPv4, try:\n"; - std::cerr << " receiver 0.0.0.0 80 1 .\n"; - std::cerr << " For IPv6, try:\n"; - std::cerr << " receiver 0::0 80 1 .\n"; - return 1; - } - - // Initialise the server. - std::size_t num_threads = boost::lexical_cast<std::size_t>(argv[3]); - http::server3::server s(argv[1], argv[2], argv[4], num_threads); - - // Run the server until stopped. - s.run(); - } - catch (std::exception& e) - { - std::cerr << "exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/mime_types.cpp b/3rdparty/asio/src/examples/cpp03/http/server3/mime_types.cpp deleted file mode 100644 index 0b0c66e3ce4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/mime_types.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// mime_types.cpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "mime_types.hpp" - -namespace http { -namespace server3 { -namespace mime_types { - -struct mapping -{ - const char* extension; - const char* mime_type; -} mappings[] = -{ - { "gif", "image/gif" }, - { "htm", "text/html" }, - { "html", "text/html" }, - { "jpg", "image/jpeg" }, - { "png", "image/png" }, - { 0, 0 } // Marks end of list. -}; - -std::string extension_to_type(const std::string& extension) -{ - for (mapping* m = mappings; m->extension; ++m) - { - if (m->extension == extension) - { - return m->mime_type; - } - } - - return "text/plain"; -} - -} // namespace mime_types -} // namespace server3 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/mime_types.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/mime_types.hpp deleted file mode 100644 index 502766aa5ab..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/mime_types.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// mime_types.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_MIME_TYPES_HPP -#define HTTP_SERVER3_MIME_TYPES_HPP - -#include <string> - -namespace http { -namespace server3 { -namespace mime_types { - -/// Convert a file extension into a MIME type. -std::string extension_to_type(const std::string& extension); - -} // namespace mime_types -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_MIME_TYPES_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/reply.cpp b/3rdparty/asio/src/examples/cpp03/http/server3/reply.cpp deleted file mode 100644 index 79790a1df77..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/reply.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// -// reply.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "reply.hpp" -#include <string> -#include <boost/lexical_cast.hpp> - -namespace http { -namespace server3 { - -namespace status_strings { - -const std::string ok = - "HTTP/1.0 200 OK\r\n"; -const std::string created = - "HTTP/1.0 201 Created\r\n"; -const std::string accepted = - "HTTP/1.0 202 Accepted\r\n"; -const std::string no_content = - "HTTP/1.0 204 No Content\r\n"; -const std::string multiple_choices = - "HTTP/1.0 300 Multiple Choices\r\n"; -const std::string moved_permanently = - "HTTP/1.0 301 Moved Permanently\r\n"; -const std::string moved_temporarily = - "HTTP/1.0 302 Moved Temporarily\r\n"; -const std::string not_modified = - "HTTP/1.0 304 Not Modified\r\n"; -const std::string bad_request = - "HTTP/1.0 400 Bad Request\r\n"; -const std::string unauthorized = - "HTTP/1.0 401 Unauthorized\r\n"; -const std::string forbidden = - "HTTP/1.0 403 Forbidden\r\n"; -const std::string not_found = - "HTTP/1.0 404 Not Found\r\n"; -const std::string internal_server_error = - "HTTP/1.0 500 Internal Server Error\r\n"; -const std::string not_implemented = - "HTTP/1.0 501 Not Implemented\r\n"; -const std::string bad_gateway = - "HTTP/1.0 502 Bad Gateway\r\n"; -const std::string service_unavailable = - "HTTP/1.0 503 Service Unavailable\r\n"; - -asio::const_buffer to_buffer(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return asio::buffer(ok); - case reply::created: - return asio::buffer(created); - case reply::accepted: - return asio::buffer(accepted); - case reply::no_content: - return asio::buffer(no_content); - case reply::multiple_choices: - return asio::buffer(multiple_choices); - case reply::moved_permanently: - return asio::buffer(moved_permanently); - case reply::moved_temporarily: - return asio::buffer(moved_temporarily); - case reply::not_modified: - return asio::buffer(not_modified); - case reply::bad_request: - return asio::buffer(bad_request); - case reply::unauthorized: - return asio::buffer(unauthorized); - case reply::forbidden: - return asio::buffer(forbidden); - case reply::not_found: - return asio::buffer(not_found); - case reply::internal_server_error: - return asio::buffer(internal_server_error); - case reply::not_implemented: - return asio::buffer(not_implemented); - case reply::bad_gateway: - return asio::buffer(bad_gateway); - case reply::service_unavailable: - return asio::buffer(service_unavailable); - default: - return asio::buffer(internal_server_error); - } -} - -} // namespace status_strings - -namespace misc_strings { - -const char name_value_separator[] = { ':', ' ' }; -const char crlf[] = { '\r', '\n' }; - -} // namespace misc_strings - -std::vector<asio::const_buffer> reply::to_buffers() -{ - std::vector<asio::const_buffer> buffers; - buffers.push_back(status_strings::to_buffer(status)); - for (std::size_t i = 0; i < headers.size(); ++i) - { - header& h = headers[i]; - buffers.push_back(asio::buffer(h.name)); - buffers.push_back(asio::buffer(misc_strings::name_value_separator)); - buffers.push_back(asio::buffer(h.value)); - buffers.push_back(asio::buffer(misc_strings::crlf)); - } - buffers.push_back(asio::buffer(misc_strings::crlf)); - buffers.push_back(asio::buffer(content)); - return buffers; -} - -namespace stock_replies { - -const char ok[] = ""; -const char created[] = - "<html>" - "<head><title>Created</title></head>" - "<body><h1>201 Created</h1></body>" - "</html>"; -const char accepted[] = - "<html>" - "<head><title>Accepted</title></head>" - "<body><h1>202 Accepted</h1></body>" - "</html>"; -const char no_content[] = - "<html>" - "<head><title>No Content</title></head>" - "<body><h1>204 Content</h1></body>" - "</html>"; -const char multiple_choices[] = - "<html>" - "<head><title>Multiple Choices</title></head>" - "<body><h1>300 Multiple Choices</h1></body>" - "</html>"; -const char moved_permanently[] = - "<html>" - "<head><title>Moved Permanently</title></head>" - "<body><h1>301 Moved Permanently</h1></body>" - "</html>"; -const char moved_temporarily[] = - "<html>" - "<head><title>Moved Temporarily</title></head>" - "<body><h1>302 Moved Temporarily</h1></body>" - "</html>"; -const char not_modified[] = - "<html>" - "<head><title>Not Modified</title></head>" - "<body><h1>304 Not Modified</h1></body>" - "</html>"; -const char bad_request[] = - "<html>" - "<head><title>Bad Request</title></head>" - "<body><h1>400 Bad Request</h1></body>" - "</html>"; -const char unauthorized[] = - "<html>" - "<head><title>Unauthorized</title></head>" - "<body><h1>401 Unauthorized</h1></body>" - "</html>"; -const char forbidden[] = - "<html>" - "<head><title>Forbidden</title></head>" - "<body><h1>403 Forbidden</h1></body>" - "</html>"; -const char not_found[] = - "<html>" - "<head><title>Not Found</title></head>" - "<body><h1>404 Not Found</h1></body>" - "</html>"; -const char internal_server_error[] = - "<html>" - "<head><title>Internal Server Error</title></head>" - "<body><h1>500 Internal Server Error</h1></body>" - "</html>"; -const char not_implemented[] = - "<html>" - "<head><title>Not Implemented</title></head>" - "<body><h1>501 Not Implemented</h1></body>" - "</html>"; -const char bad_gateway[] = - "<html>" - "<head><title>Bad Gateway</title></head>" - "<body><h1>502 Bad Gateway</h1></body>" - "</html>"; -const char service_unavailable[] = - "<html>" - "<head><title>Service Unavailable</title></head>" - "<body><h1>503 Service Unavailable</h1></body>" - "</html>"; - -std::string to_string(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return ok; - case reply::created: - return created; - case reply::accepted: - return accepted; - case reply::no_content: - return no_content; - case reply::multiple_choices: - return multiple_choices; - case reply::moved_permanently: - return moved_permanently; - case reply::moved_temporarily: - return moved_temporarily; - case reply::not_modified: - return not_modified; - case reply::bad_request: - return bad_request; - case reply::unauthorized: - return unauthorized; - case reply::forbidden: - return forbidden; - case reply::not_found: - return not_found; - case reply::internal_server_error: - return internal_server_error; - case reply::not_implemented: - return not_implemented; - case reply::bad_gateway: - return bad_gateway; - case reply::service_unavailable: - return service_unavailable; - default: - return internal_server_error; - } -} - -} // namespace stock_replies - -reply reply::stock_reply(reply::status_type status) -{ - reply rep; - rep.status = status; - rep.content = stock_replies::to_string(status); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = "text/html"; - return rep; -} - -} // namespace server3 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/reply.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/reply.hpp deleted file mode 100644 index 9b057ca351d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/reply.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// reply.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_REPLY_HPP -#define HTTP_SERVER3_REPLY_HPP - -#include <string> -#include <vector> -#include <asio.hpp> -#include "header.hpp" - -namespace http { -namespace server3 { - -/// A reply to be sent to a client. -struct reply -{ - /// The status of the reply. - enum status_type - { - ok = 200, - created = 201, - accepted = 202, - no_content = 204, - multiple_choices = 300, - moved_permanently = 301, - moved_temporarily = 302, - not_modified = 304, - bad_request = 400, - unauthorized = 401, - forbidden = 403, - not_found = 404, - internal_server_error = 500, - not_implemented = 501, - bad_gateway = 502, - service_unavailable = 503 - } status; - - /// The headers to be included in the reply. - std::vector<header> headers; - - /// The content to be sent in the reply. - std::string content; - - /// Convert the reply into a vector of buffers. The buffers do not own the - /// underlying memory blocks, therefore the reply object must remain valid and - /// not be changed until the write operation has completed. - std::vector<asio::const_buffer> to_buffers(); - - /// Get a stock reply. - static reply stock_reply(status_type status); -}; - -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_REPLY_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/request.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/request.hpp deleted file mode 100644 index a5b34e03f8a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/request.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// request.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_REQUEST_HPP -#define HTTP_SERVER3_REQUEST_HPP - -#include <string> -#include <vector> -#include "header.hpp" - -namespace http { -namespace server3 { - -/// A request received from a client. -struct request -{ - std::string method; - std::string uri; - int http_version_major; - int http_version_minor; - std::vector<header> headers; -}; - -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_REQUEST_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/request_handler.cpp b/3rdparty/asio/src/examples/cpp03/http/server3/request_handler.cpp deleted file mode 100644 index 9feb1cf1e3c..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/request_handler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// request_handler.cpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "request_handler.hpp" -#include <fstream> -#include <sstream> -#include <string> -#include <boost/lexical_cast.hpp> -#include "mime_types.hpp" -#include "reply.hpp" -#include "request.hpp" - -namespace http { -namespace server3 { - -request_handler::request_handler(const std::string& doc_root) - : doc_root_(doc_root) -{ -} - -void request_handler::handle_request(const request& req, reply& rep) -{ - // Decode url to path. - std::string request_path; - if (!url_decode(req.uri, request_path)) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // Request path must be absolute and not contain "..". - if (request_path.empty() || request_path[0] != '/' - || request_path.find("..") != std::string::npos) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // If path ends in slash (i.e. is a directory) then add "index.html". - if (request_path[request_path.size() - 1] == '/') - { - request_path += "index.html"; - } - - // Determine the file extension. - std::size_t last_slash_pos = request_path.find_last_of("/"); - std::size_t last_dot_pos = request_path.find_last_of("."); - std::string extension; - if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) - { - extension = request_path.substr(last_dot_pos + 1); - } - - // Open the file to send back. - std::string full_path = doc_root_ + request_path; - std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); - if (!is) - { - rep = reply::stock_reply(reply::not_found); - return; - } - - // Fill out the reply to be sent to the client. - rep.status = reply::ok; - char buf[512]; - while (is.read(buf, sizeof(buf)).gcount() > 0) - rep.content.append(buf, is.gcount()); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = mime_types::extension_to_type(extension); -} - -bool request_handler::url_decode(const std::string& in, std::string& out) -{ - out.clear(); - out.reserve(in.size()); - for (std::size_t i = 0; i < in.size(); ++i) - { - if (in[i] == '%') - { - if (i + 3 <= in.size()) - { - int value = 0; - std::istringstream is(in.substr(i + 1, 2)); - if (is >> std::hex >> value) - { - out += static_cast<char>(value); - i += 2; - } - else - { - return false; - } - } - else - { - return false; - } - } - else if (in[i] == '+') - { - out += ' '; - } - else - { - out += in[i]; - } - } - return true; -} - -} // namespace server3 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/request_handler.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/request_handler.hpp deleted file mode 100644 index bb94cad0d1d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/request_handler.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// request_handler.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_REQUEST_HANDLER_HPP -#define HTTP_SERVER3_REQUEST_HANDLER_HPP - -#include <string> -#include <boost/noncopyable.hpp> - -namespace http { -namespace server3 { - -struct reply; -struct request; - -/// The common handler for all incoming requests. -class request_handler - : private boost::noncopyable -{ -public: - /// Construct with a directory containing files to be served. - explicit request_handler(const std::string& doc_root); - - /// Handle a request and produce a reply. - void handle_request(const request& req, reply& rep); - -private: - /// The directory containing the files to be served. - std::string doc_root_; - - /// Perform URL-decoding on a string. Returns false if the encoding was - /// invalid. - static bool url_decode(const std::string& in, std::string& out); -}; - -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_REQUEST_HANDLER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/request_parser.cpp b/3rdparty/asio/src/examples/cpp03/http/server3/request_parser.cpp deleted file mode 100644 index 98f91286fe8..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/request_parser.cpp +++ /dev/null @@ -1,315 +0,0 @@ -// -// request_parser.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "request_parser.hpp" -#include "request.hpp" - -namespace http { -namespace server3 { - -request_parser::request_parser() - : state_(method_start) -{ -} - -void request_parser::reset() -{ - state_ = method_start; -} - -boost::tribool request_parser::consume(request& req, char input) -{ - switch (state_) - { - case method_start: - if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - state_ = method; - req.method.push_back(input); - return boost::indeterminate; - } - case method: - if (input == ' ') - { - state_ = uri; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.method.push_back(input); - return boost::indeterminate; - } - case uri: - if (input == ' ') - { - state_ = http_version_h; - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - req.uri.push_back(input); - return boost::indeterminate; - } - case http_version_h: - if (input == 'H') - { - state_ = http_version_t_1; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_t_1: - if (input == 'T') - { - state_ = http_version_t_2; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_t_2: - if (input == 'T') - { - state_ = http_version_p; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_p: - if (input == 'P') - { - state_ = http_version_slash; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_slash: - if (input == '/') - { - req.http_version_major = 0; - req.http_version_minor = 0; - state_ = http_version_major_start; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_major_start: - if (is_digit(input)) - { - req.http_version_major = req.http_version_major * 10 + input - '0'; - state_ = http_version_major; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_major: - if (input == '.') - { - state_ = http_version_minor_start; - return boost::indeterminate; - } - else if (is_digit(input)) - { - req.http_version_major = req.http_version_major * 10 + input - '0'; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_minor_start: - if (is_digit(input)) - { - req.http_version_minor = req.http_version_minor * 10 + input - '0'; - state_ = http_version_minor; - return boost::indeterminate; - } - else - { - return false; - } - case http_version_minor: - if (input == '\r') - { - state_ = expecting_newline_1; - return boost::indeterminate; - } - else if (is_digit(input)) - { - req.http_version_minor = req.http_version_minor * 10 + input - '0'; - return boost::indeterminate; - } - else - { - return false; - } - case expecting_newline_1: - if (input == '\n') - { - state_ = header_line_start; - return boost::indeterminate; - } - else - { - return false; - } - case header_line_start: - if (input == '\r') - { - state_ = expecting_newline_3; - return boost::indeterminate; - } - else if (!req.headers.empty() && (input == ' ' || input == '\t')) - { - state_ = header_lws; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.headers.push_back(header()); - req.headers.back().name.push_back(input); - state_ = header_name; - return boost::indeterminate; - } - case header_lws: - if (input == '\r') - { - state_ = expecting_newline_2; - return boost::indeterminate; - } - else if (input == ' ' || input == '\t') - { - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - state_ = header_value; - req.headers.back().value.push_back(input); - return boost::indeterminate; - } - case header_name: - if (input == ':') - { - state_ = space_before_header_value; - return boost::indeterminate; - } - else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) - { - return false; - } - else - { - req.headers.back().name.push_back(input); - return boost::indeterminate; - } - case space_before_header_value: - if (input == ' ') - { - state_ = header_value; - return boost::indeterminate; - } - else - { - return false; - } - case header_value: - if (input == '\r') - { - state_ = expecting_newline_2; - return boost::indeterminate; - } - else if (is_ctl(input)) - { - return false; - } - else - { - req.headers.back().value.push_back(input); - return boost::indeterminate; - } - case expecting_newline_2: - if (input == '\n') - { - state_ = header_line_start; - return boost::indeterminate; - } - else - { - return false; - } - case expecting_newline_3: - return (input == '\n'); - default: - return false; - } -} - -bool request_parser::is_char(int c) -{ - return c >= 0 && c <= 127; -} - -bool request_parser::is_ctl(int c) -{ - return (c >= 0 && c <= 31) || (c == 127); -} - -bool request_parser::is_tspecial(int c) -{ - switch (c) - { - case '(': case ')': case '<': case '>': case '@': - case ',': case ';': case ':': case '\\': case '"': - case '/': case '[': case ']': case '?': case '=': - case '{': case '}': case ' ': case '\t': - return true; - default: - return false; - } -} - -bool request_parser::is_digit(int c) -{ - return c >= '0' && c <= '9'; -} - -} // namespace server3 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/request_parser.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/request_parser.hpp deleted file mode 100644 index b680eee037b..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/request_parser.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// -// request_parser.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_REQUEST_PARSER_HPP -#define HTTP_SERVER3_REQUEST_PARSER_HPP - -#include <boost/logic/tribool.hpp> -#include <boost/tuple/tuple.hpp> - -namespace http { -namespace server3 { - -struct request; - -/// Parser for incoming requests. -class request_parser -{ -public: - /// Construct ready to parse the request method. - request_parser(); - - /// Reset to initial parser state. - void reset(); - - /// Parse some data. The tribool return value is true when a complete request - /// has been parsed, false if the data is invalid, indeterminate when more - /// data is required. The InputIterator return value indicates how much of the - /// input has been consumed. - template <typename InputIterator> - boost::tuple<boost::tribool, InputIterator> parse(request& req, - InputIterator begin, InputIterator end) - { - while (begin != end) - { - boost::tribool result = consume(req, *begin++); - if (result || !result) - return boost::make_tuple(result, begin); - } - boost::tribool result = boost::indeterminate; - return boost::make_tuple(result, begin); - } - -private: - /// Handle the next character of input. - boost::tribool consume(request& req, char input); - - /// Check if a byte is an HTTP character. - static bool is_char(int c); - - /// Check if a byte is an HTTP control character. - static bool is_ctl(int c); - - /// Check if a byte is defined as an HTTP tspecial character. - static bool is_tspecial(int c); - - /// Check if a byte is a digit. - static bool is_digit(int c); - - /// The current state of the parser. - enum state - { - method_start, - method, - uri, - http_version_h, - http_version_t_1, - http_version_t_2, - http_version_p, - http_version_slash, - http_version_major_start, - http_version_major, - http_version_minor_start, - http_version_minor, - expecting_newline_1, - header_line_start, - header_lws, - header_name, - space_before_header_value, - header_value, - expecting_newline_2, - expecting_newline_3 - } state_; -}; - -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_REQUEST_PARSER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/server.cpp b/3rdparty/asio/src/examples/cpp03/http/server3/server.cpp deleted file mode 100644 index 2a78bc9719e..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/server.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "server.hpp" -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <vector> - -namespace http { -namespace server3 { - -server::server(const std::string& address, const std::string& port, - const std::string& doc_root, std::size_t thread_pool_size) - : thread_pool_size_(thread_pool_size), - signals_(io_context_), - acceptor_(io_context_), - new_connection_(), - request_handler_(doc_root) -{ - // Register to handle the signals that indicate when the server should exit. - // It is safe to register for the same signal multiple times in a program, - // provided all registration for the specified signal is made through Asio. - signals_.add(SIGINT); - signals_.add(SIGTERM); -#if defined(SIGQUIT) - signals_.add(SIGQUIT); -#endif // defined(SIGQUIT) - signals_.async_wait(boost::bind(&server::handle_stop, this)); - - // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). - asio::ip::tcp::resolver resolver(io_context_); - asio::ip::tcp::endpoint endpoint = - *resolver.resolve(address, port).begin(); - acceptor_.open(endpoint.protocol()); - acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true)); - acceptor_.bind(endpoint); - acceptor_.listen(); - - start_accept(); -} - -void server::run() -{ - // Create a pool of threads to run all of the io_contexts. - std::vector<boost::shared_ptr<asio::thread> > threads; - for (std::size_t i = 0; i < thread_pool_size_; ++i) - { - boost::shared_ptr<asio::thread> thread(new asio::thread( - boost::bind(&asio::io_context::run, &io_context_))); - threads.push_back(thread); - } - - // Wait for all threads in the pool to exit. - for (std::size_t i = 0; i < threads.size(); ++i) - threads[i]->join(); -} - -void server::start_accept() -{ - new_connection_.reset(new connection(io_context_, request_handler_)); - acceptor_.async_accept(new_connection_->socket(), - boost::bind(&server::handle_accept, this, - asio::placeholders::error)); -} - -void server::handle_accept(const asio::error_code& e) -{ - if (!e) - { - new_connection_->start(); - } - - start_accept(); -} - -void server::handle_stop() -{ - io_context_.stop(); -} - -} // namespace server3 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server3/server.hpp b/3rdparty/asio/src/examples/cpp03/http/server3/server.hpp deleted file mode 100644 index c58c2433f65..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server3/server.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// server.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_SERVER3_SERVER_HPP -#define HTTP_SERVER3_SERVER_HPP - -#include <asio.hpp> -#include <string> -#include <vector> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> -#include "connection.hpp" -#include "request_handler.hpp" - -namespace http { -namespace server3 { - -/// The top-level class of the HTTP server. -class server - : private boost::noncopyable -{ -public: - /// Construct the server to listen on the specified TCP address and port, and - /// serve up files from the given directory. - explicit server(const std::string& address, const std::string& port, - const std::string& doc_root, std::size_t thread_pool_size); - - /// Run the server's io_context loop. - void run(); - -private: - /// Initiate an asynchronous accept operation. - void start_accept(); - - /// Handle completion of an asynchronous accept operation. - void handle_accept(const asio::error_code& e); - - /// Handle a request to stop the server. - void handle_stop(); - - /// The number of threads that will call io_context::run(). - std::size_t thread_pool_size_; - - /// The io_context used to perform asynchronous operations. - asio::io_context io_context_; - - /// The signal_set is used to register for process termination notifications. - asio::signal_set signals_; - - /// Acceptor used to listen for incoming connections. - asio::ip::tcp::acceptor acceptor_; - - /// The next connection to be accepted. - connection_ptr new_connection_; - - /// The handler for all incoming requests. - request_handler request_handler_; -}; - -} // namespace server3 -} // namespace http - -#endif // HTTP_SERVER3_SERVER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/.gitignore b/3rdparty/asio/src/examples/cpp03/http/server4/.gitignore deleted file mode 100644 index 0882fa6ced3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_server -*_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/file_handler.cpp b/3rdparty/asio/src/examples/cpp03/http/server4/file_handler.cpp deleted file mode 100644 index a4ac912b155..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/file_handler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// file_handler.cpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "file_handler.hpp" -#include <fstream> -#include <sstream> -#include <string> -#include <boost/lexical_cast.hpp> -#include "mime_types.hpp" -#include "reply.hpp" -#include "request.hpp" - -namespace http { -namespace server4 { - -file_handler::file_handler(const std::string& doc_root) - : doc_root_(doc_root) -{ -} - -void file_handler::operator()(const request& req, reply& rep) -{ - // Decode url to path. - std::string request_path; - if (!url_decode(req.uri, request_path)) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // Request path must be absolute and not contain "..". - if (request_path.empty() || request_path[0] != '/' - || request_path.find("..") != std::string::npos) - { - rep = reply::stock_reply(reply::bad_request); - return; - } - - // If path ends in slash (i.e. is a directory) then add "index.html". - if (request_path[request_path.size() - 1] == '/') - { - request_path += "index.html"; - } - - // Determine the file extension. - std::size_t last_slash_pos = request_path.find_last_of("/"); - std::size_t last_dot_pos = request_path.find_last_of("."); - std::string extension; - if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) - { - extension = request_path.substr(last_dot_pos + 1); - } - - // Open the file to send back. - std::string full_path = doc_root_ + request_path; - std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); - if (!is) - { - rep = reply::stock_reply(reply::not_found); - return; - } - - // Fill out the reply to be sent to the client. - rep.status = reply::ok; - char buf[512]; - while (is.read(buf, sizeof(buf)).gcount() > 0) - rep.content.append(buf, is.gcount()); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = mime_types::extension_to_type(extension); -} - -bool file_handler::url_decode(const std::string& in, std::string& out) -{ - out.clear(); - out.reserve(in.size()); - for (std::size_t i = 0; i < in.size(); ++i) - { - if (in[i] == '%') - { - if (i + 3 <= in.size()) - { - int value = 0; - std::istringstream is(in.substr(i + 1, 2)); - if (is >> std::hex >> value) - { - out += static_cast<char>(value); - i += 2; - } - else - { - return false; - } - } - else - { - return false; - } - } - else if (in[i] == '+') - { - out += ' '; - } - else - { - out += in[i]; - } - } - return true; -} - -} // namespace server4 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/file_handler.hpp b/3rdparty/asio/src/examples/cpp03/http/server4/file_handler.hpp deleted file mode 100644 index 22055dbcb1b..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/file_handler.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// file_handler.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_FILE_HANDLER_HPP -#define HTTP_SERVER4_FILE_HANDLER_HPP - -#include <string> - -namespace http { -namespace server4 { - -struct reply; -struct request; - -/// The common handler for all incoming requests. -class file_handler -{ -public: - /// Construct with a directory containing files to be served. - explicit file_handler(const std::string& doc_root); - - /// Handle a request and produce a reply. - void operator()(const request& req, reply& rep); - -private: - /// The directory containing the files to be served. - std::string doc_root_; - - /// Perform URL-decoding on a string. Returns false if the encoding was - /// invalid. - static bool url_decode(const std::string& in, std::string& out); -}; - -} // namespace server4 -} // namespace http - -#endif // HTTP_SERVER4_FILE_HANDLER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/header.hpp b/3rdparty/asio/src/examples/cpp03/http/server4/header.hpp deleted file mode 100644 index 9c9b89cca06..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/header.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// header.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_HEADER_HPP -#define HTTP_SERVER4_HEADER_HPP - -#include <string> - -namespace http { -namespace server4 { - -struct header -{ - std::string name; - std::string value; -}; - -} // namespace server4 -} // namespace http - -#endif // HTTP_SERVER4_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/main.cpp b/3rdparty/asio/src/examples/cpp03/http/server4/main.cpp deleted file mode 100644 index 0ebe535ad17..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/main.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// -// main.cpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <signal.h> -#include "server.hpp" -#include "file_handler.hpp" - -int main(int argc, char* argv[]) -{ - try - { - // Check command line arguments. - if (argc != 4) - { - std::cerr << "Usage: http_server <address> <port> <doc_root>\n"; - std::cerr << " For IPv4, try:\n"; - std::cerr << " receiver 0.0.0.0 80 .\n"; - std::cerr << " For IPv6, try:\n"; - std::cerr << " receiver 0::0 80 .\n"; - return 1; - } - - asio::io_context io_context; - - // Launch the initial server coroutine. - http::server4::server(io_context, argv[1], argv[2], - http::server4::file_handler(argv[3]))(); - - // Wait for signals indicating time to shut down. - asio::signal_set signals(io_context); - signals.add(SIGINT); - signals.add(SIGTERM); -#if defined(SIGQUIT) - signals.add(SIGQUIT); -#endif // defined(SIGQUIT) - signals.async_wait(boost::bind( - &asio::io_context::stop, &io_context)); - - // Run the server. - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/mime_types.cpp b/3rdparty/asio/src/examples/cpp03/http/server4/mime_types.cpp deleted file mode 100644 index 903dffca59e..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/mime_types.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// mime_types.cpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "mime_types.hpp" - -namespace http { -namespace server4 { -namespace mime_types { - -struct mapping -{ - const char* extension; - const char* mime_type; -} mappings[] = -{ - { "gif", "image/gif" }, - { "htm", "text/html" }, - { "html", "text/html" }, - { "jpg", "image/jpeg" }, - { "png", "image/png" }, - { 0, 0 } // Marks end of list. -}; - -std::string extension_to_type(const std::string& extension) -{ - for (mapping* m = mappings; m->extension; ++m) - { - if (m->extension == extension) - { - return m->mime_type; - } - } - - return "text/plain"; -} - -} // namespace mime_types -} // namespace server4 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/mime_types.hpp b/3rdparty/asio/src/examples/cpp03/http/server4/mime_types.hpp deleted file mode 100644 index f702c6f859b..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/mime_types.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// mime_types.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_MIME_TYPES_HPP -#define HTTP_SERVER4_MIME_TYPES_HPP - -#include <string> - -namespace http { -namespace server4 { -namespace mime_types { - -/// Convert a file extension into a MIME type. -std::string extension_to_type(const std::string& extension); - -} // namespace mime_types -} // namespace server4 -} // namespace http - -#endif // HTTP_SERVER4_MIME_TYPES_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/reply.cpp b/3rdparty/asio/src/examples/cpp03/http/server4/reply.cpp deleted file mode 100644 index f508a46765f..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/reply.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// -// reply.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "reply.hpp" -#include <string> -#include <boost/lexical_cast.hpp> - -namespace http { -namespace server4 { - -namespace status_strings { - -const std::string ok = - "HTTP/1.0 200 OK\r\n"; -const std::string created = - "HTTP/1.0 201 Created\r\n"; -const std::string accepted = - "HTTP/1.0 202 Accepted\r\n"; -const std::string no_content = - "HTTP/1.0 204 No Content\r\n"; -const std::string multiple_choices = - "HTTP/1.0 300 Multiple Choices\r\n"; -const std::string moved_permanently = - "HTTP/1.0 301 Moved Permanently\r\n"; -const std::string moved_temporarily = - "HTTP/1.0 302 Moved Temporarily\r\n"; -const std::string not_modified = - "HTTP/1.0 304 Not Modified\r\n"; -const std::string bad_request = - "HTTP/1.0 400 Bad Request\r\n"; -const std::string unauthorized = - "HTTP/1.0 401 Unauthorized\r\n"; -const std::string forbidden = - "HTTP/1.0 403 Forbidden\r\n"; -const std::string not_found = - "HTTP/1.0 404 Not Found\r\n"; -const std::string internal_server_error = - "HTTP/1.0 500 Internal Server Error\r\n"; -const std::string not_implemented = - "HTTP/1.0 501 Not Implemented\r\n"; -const std::string bad_gateway = - "HTTP/1.0 502 Bad Gateway\r\n"; -const std::string service_unavailable = - "HTTP/1.0 503 Service Unavailable\r\n"; - -asio::const_buffer to_buffer(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return asio::buffer(ok); - case reply::created: - return asio::buffer(created); - case reply::accepted: - return asio::buffer(accepted); - case reply::no_content: - return asio::buffer(no_content); - case reply::multiple_choices: - return asio::buffer(multiple_choices); - case reply::moved_permanently: - return asio::buffer(moved_permanently); - case reply::moved_temporarily: - return asio::buffer(moved_temporarily); - case reply::not_modified: - return asio::buffer(not_modified); - case reply::bad_request: - return asio::buffer(bad_request); - case reply::unauthorized: - return asio::buffer(unauthorized); - case reply::forbidden: - return asio::buffer(forbidden); - case reply::not_found: - return asio::buffer(not_found); - case reply::internal_server_error: - return asio::buffer(internal_server_error); - case reply::not_implemented: - return asio::buffer(not_implemented); - case reply::bad_gateway: - return asio::buffer(bad_gateway); - case reply::service_unavailable: - return asio::buffer(service_unavailable); - default: - return asio::buffer(internal_server_error); - } -} - -} // namespace status_strings - -namespace misc_strings { - -const char name_value_separator[] = { ':', ' ' }; -const char crlf[] = { '\r', '\n' }; - -} // namespace misc_strings - -std::vector<asio::const_buffer> reply::to_buffers() -{ - std::vector<asio::const_buffer> buffers; - buffers.push_back(status_strings::to_buffer(status)); - for (std::size_t i = 0; i < headers.size(); ++i) - { - header& h = headers[i]; - buffers.push_back(asio::buffer(h.name)); - buffers.push_back(asio::buffer(misc_strings::name_value_separator)); - buffers.push_back(asio::buffer(h.value)); - buffers.push_back(asio::buffer(misc_strings::crlf)); - } - buffers.push_back(asio::buffer(misc_strings::crlf)); - buffers.push_back(asio::buffer(content)); - return buffers; -} - -namespace stock_replies { - -const char ok[] = ""; -const char created[] = - "<html>" - "<head><title>Created</title></head>" - "<body><h1>201 Created</h1></body>" - "</html>"; -const char accepted[] = - "<html>" - "<head><title>Accepted</title></head>" - "<body><h1>202 Accepted</h1></body>" - "</html>"; -const char no_content[] = - "<html>" - "<head><title>No Content</title></head>" - "<body><h1>204 Content</h1></body>" - "</html>"; -const char multiple_choices[] = - "<html>" - "<head><title>Multiple Choices</title></head>" - "<body><h1>300 Multiple Choices</h1></body>" - "</html>"; -const char moved_permanently[] = - "<html>" - "<head><title>Moved Permanently</title></head>" - "<body><h1>301 Moved Permanently</h1></body>" - "</html>"; -const char moved_temporarily[] = - "<html>" - "<head><title>Moved Temporarily</title></head>" - "<body><h1>302 Moved Temporarily</h1></body>" - "</html>"; -const char not_modified[] = - "<html>" - "<head><title>Not Modified</title></head>" - "<body><h1>304 Not Modified</h1></body>" - "</html>"; -const char bad_request[] = - "<html>" - "<head><title>Bad Request</title></head>" - "<body><h1>400 Bad Request</h1></body>" - "</html>"; -const char unauthorized[] = - "<html>" - "<head><title>Unauthorized</title></head>" - "<body><h1>401 Unauthorized</h1></body>" - "</html>"; -const char forbidden[] = - "<html>" - "<head><title>Forbidden</title></head>" - "<body><h1>403 Forbidden</h1></body>" - "</html>"; -const char not_found[] = - "<html>" - "<head><title>Not Found</title></head>" - "<body><h1>404 Not Found</h1></body>" - "</html>"; -const char internal_server_error[] = - "<html>" - "<head><title>Internal Server Error</title></head>" - "<body><h1>500 Internal Server Error</h1></body>" - "</html>"; -const char not_implemented[] = - "<html>" - "<head><title>Not Implemented</title></head>" - "<body><h1>501 Not Implemented</h1></body>" - "</html>"; -const char bad_gateway[] = - "<html>" - "<head><title>Bad Gateway</title></head>" - "<body><h1>502 Bad Gateway</h1></body>" - "</html>"; -const char service_unavailable[] = - "<html>" - "<head><title>Service Unavailable</title></head>" - "<body><h1>503 Service Unavailable</h1></body>" - "</html>"; - -std::string to_string(reply::status_type status) -{ - switch (status) - { - case reply::ok: - return ok; - case reply::created: - return created; - case reply::accepted: - return accepted; - case reply::no_content: - return no_content; - case reply::multiple_choices: - return multiple_choices; - case reply::moved_permanently: - return moved_permanently; - case reply::moved_temporarily: - return moved_temporarily; - case reply::not_modified: - return not_modified; - case reply::bad_request: - return bad_request; - case reply::unauthorized: - return unauthorized; - case reply::forbidden: - return forbidden; - case reply::not_found: - return not_found; - case reply::internal_server_error: - return internal_server_error; - case reply::not_implemented: - return not_implemented; - case reply::bad_gateway: - return bad_gateway; - case reply::service_unavailable: - return service_unavailable; - default: - return internal_server_error; - } -} - -} // namespace stock_replies - -reply reply::stock_reply(reply::status_type status) -{ - reply rep; - rep.status = status; - rep.content = stock_replies::to_string(status); - rep.headers.resize(2); - rep.headers[0].name = "Content-Length"; - rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size()); - rep.headers[1].name = "Content-Type"; - rep.headers[1].value = "text/html"; - return rep; -} - -} // namespace server4 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/reply.hpp b/3rdparty/asio/src/examples/cpp03/http/server4/reply.hpp deleted file mode 100644 index 02743a549be..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/reply.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// reply.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_REPLY_HPP -#define HTTP_SERVER4_REPLY_HPP - -#include <string> -#include <vector> -#include <asio.hpp> -#include "header.hpp" - -namespace http { -namespace server4 { - -/// A reply to be sent to a client. -struct reply -{ - /// The status of the reply. - enum status_type - { - ok = 200, - created = 201, - accepted = 202, - no_content = 204, - multiple_choices = 300, - moved_permanently = 301, - moved_temporarily = 302, - not_modified = 304, - bad_request = 400, - unauthorized = 401, - forbidden = 403, - not_found = 404, - internal_server_error = 500, - not_implemented = 501, - bad_gateway = 502, - service_unavailable = 503 - } status; - - /// The headers to be included in the reply. - std::vector<header> headers; - - /// The content to be sent in the reply. - std::string content; - - /// Convert the reply into a vector of buffers. The buffers do not own the - /// underlying memory blocks, therefore the reply object must remain valid and - /// not be changed until the write operation has completed. - std::vector<asio::const_buffer> to_buffers(); - - /// Get a stock reply. - static reply stock_reply(status_type status); -}; - -} // namespace server4 -} // namespace http - -#endif // HTTP_SERVER4_REPLY_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/request.hpp b/3rdparty/asio/src/examples/cpp03/http/server4/request.hpp deleted file mode 100644 index 43947d7f09e..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/request.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// request.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_REQUEST_HPP -#define HTTP_SERVER4_REQUEST_HPP - -#include <string> -#include <vector> -#include "header.hpp" - -namespace http { -namespace server4 { - -/// A request received from a client. -struct request -{ - /// The request method, e.g. "GET", "POST". - std::string method; - - /// The requested URI, such as a path to a file. - std::string uri; - - /// Major version number, usually 1. - int http_version_major; - - /// Minor version number, usually 0 or 1. - int http_version_minor; - - /// The headers included with the request. - std::vector<header> headers; - - /// The optional content sent with the request. - std::string content; -}; - -} // namespace server4 -} // namespace http - -#endif // HTTP_SERVER4_REQUEST_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/request_parser.cpp b/3rdparty/asio/src/examples/cpp03/http/server4/request_parser.cpp deleted file mode 100644 index 0ec31ad3939..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/request_parser.cpp +++ /dev/null @@ -1,226 +0,0 @@ -// -// request_parser.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "request_parser.hpp" -#include <algorithm> -#include <cctype> -#include <boost/lexical_cast.hpp> -#include "request.hpp" - -namespace http { -namespace server4 { - -// Enable the pseudo-keywords reenter, yield and fork. -#include <asio/yield.hpp> - -std::string request_parser::content_length_name_ = "Content-Length"; - -boost::tribool request_parser::consume(request& req, char c) -{ - reenter (this) - { - req.method.clear(); - req.uri.clear(); - req.http_version_major = 0; - req.http_version_minor = 0; - req.headers.clear(); - req.content.clear(); - content_length_ = 0; - - // Request method. - while (is_char(c) && !is_ctl(c) && !is_tspecial(c) && c != ' ') - { - req.method.push_back(c); - yield return boost::indeterminate; - } - if (req.method.empty()) - return false; - - // Space. - if (c != ' ') return false; - yield return boost::indeterminate; - - // URI. - while (!is_ctl(c) && c != ' ') - { - req.uri.push_back(c); - yield return boost::indeterminate; - } - if (req.uri.empty()) return false; - - // Space. - if (c != ' ') return false; - yield return boost::indeterminate; - - // HTTP protocol identifier. - if (c != 'H') return false; - yield return boost::indeterminate; - if (c != 'T') return false; - yield return boost::indeterminate; - if (c != 'T') return false; - yield return boost::indeterminate; - if (c != 'P') return false; - yield return boost::indeterminate; - - // Slash. - if (c != '/') return false; - yield return boost::indeterminate; - - // Major version number. - if (!is_digit(c)) return false; - while (is_digit(c)) - { - req.http_version_major = req.http_version_major * 10 + c - '0'; - yield return boost::indeterminate; - } - - // Dot. - if (c != '.') return false; - yield return boost::indeterminate; - - // Minor version number. - if (!is_digit(c)) return false; - while (is_digit(c)) - { - req.http_version_minor = req.http_version_minor * 10 + c - '0'; - yield return boost::indeterminate; - } - - // CRLF. - if (c != '\r') return false; - yield return boost::indeterminate; - if (c != '\n') return false; - yield return boost::indeterminate; - - // Headers. - while ((is_char(c) && !is_ctl(c) && !is_tspecial(c) && c != '\r') - || (c == ' ' || c == '\t')) - { - if (c == ' ' || c == '\t') - { - // Leading whitespace. Must be continuation of previous header's value. - if (req.headers.empty()) return false; - while (c == ' ' || c == '\t') - yield return boost::indeterminate; - } - else - { - // Start the next header. - req.headers.push_back(header()); - - // Header name. - while (is_char(c) && !is_ctl(c) && !is_tspecial(c) && c != ':') - { - req.headers.back().name.push_back(c); - yield return boost::indeterminate; - } - - // Colon and space separates the header name from the header value. - if (c != ':') return false; - yield return boost::indeterminate; - if (c != ' ') return false; - yield return boost::indeterminate; - } - - // Header value. - while (is_char(c) && !is_ctl(c) && c != '\r') - { - req.headers.back().value.push_back(c); - yield return boost::indeterminate; - } - - // CRLF. - if (c != '\r') return false; - yield return boost::indeterminate; - if (c != '\n') return false; - yield return boost::indeterminate; - } - - // CRLF. - if (c != '\r') return false; - yield return boost::indeterminate; - if (c != '\n') return false; - - // Check for optional Content-Length header. - for (std::size_t i = 0; i < req.headers.size(); ++i) - { - if (headers_equal(req.headers[i].name, content_length_name_)) - { - try - { - content_length_ = - boost::lexical_cast<std::size_t>(req.headers[i].value); - } - catch (boost::bad_lexical_cast&) - { - return false; - } - } - } - - // Content. - while (req.content.size() < content_length_) - { - yield return boost::indeterminate; - req.content.push_back(c); - } - } - - return true; -} - -// Disable the pseudo-keywords reenter, yield and fork. -#include <asio/unyield.hpp> - -bool request_parser::is_char(int c) -{ - return c >= 0 && c <= 127; -} - -bool request_parser::is_ctl(int c) -{ - return (c >= 0 && c <= 31) || (c == 127); -} - -bool request_parser::is_tspecial(int c) -{ - switch (c) - { - case '(': case ')': case '<': case '>': case '@': - case ',': case ';': case ':': case '\\': case '"': - case '/': case '[': case ']': case '?': case '=': - case '{': case '}': case ' ': case '\t': - return true; - default: - return false; - } -} - -bool request_parser::is_digit(int c) -{ - return c >= '0' && c <= '9'; -} - -bool request_parser::tolower_compare(char a, char b) -{ - return std::tolower(a) == std::tolower(b); -} - -bool request_parser::headers_equal(const std::string& a, const std::string& b) -{ - if (a.length() != b.length()) - return false; - - return std::equal(a.begin(), a.end(), b.begin(), - &request_parser::tolower_compare); -} - -} // namespace server4 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/request_parser.hpp b/3rdparty/asio/src/examples/cpp03/http/server4/request_parser.hpp deleted file mode 100644 index a61356e36a6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/request_parser.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// request_parser.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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_REQUEST_PARSER_HPP -#define HTTP_SERVER4_REQUEST_PARSER_HPP - -#include <string> -#include <boost/logic/tribool.hpp> -#include <boost/tuple/tuple.hpp> -#include <asio/coroutine.hpp> - -namespace http { -namespace server4 { - -struct request; - -/// Parser for incoming requests. -class request_parser : asio::coroutine -{ -public: - /// Parse some data. The tribool return value is true when a complete request - /// has been parsed, false if the data is invalid, indeterminate when more - /// data is required. The InputIterator return value indicates how much of the - /// input has been consumed. - template <typename InputIterator> - boost::tuple<boost::tribool, InputIterator> parse(request& req, - InputIterator begin, InputIterator end) - { - while (begin != end) - { - boost::tribool result = consume(req, *begin++); - if (result || !result) - return boost::make_tuple(result, begin); - } - boost::tribool result = boost::indeterminate; - return boost::make_tuple(result, begin); - } - -private: - /// The name of the content length header. - static std::string content_length_name_; - - /// Content length as decoded from headers. Defaults to 0. - std::size_t content_length_; - - /// Handle the next character of input. - boost::tribool consume(request& req, char input); - - /// Check if a byte is an HTTP character. - static bool is_char(int c); - - /// Check if a byte is an HTTP control character. - static bool is_ctl(int c); - - /// Check if a byte is defined as an HTTP tspecial character. - static bool is_tspecial(int c); - - /// Check if a byte is a digit. - static bool is_digit(int c); - - /// Check if two characters are equal, without regard to case. - static bool tolower_compare(char a, char b); - - /// Check whether the two request header names match. - bool headers_equal(const std::string& a, const std::string& b); -}; - -} // namespace server4 -} // namespace http - -#endif // HTTP_SERVER4_REQUEST_PARSER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/server.cpp b/3rdparty/asio/src/examples/cpp03/http/server4/server.cpp deleted file mode 100644 index 04d81a984b6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/server.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "server.hpp" -#include "request.hpp" -#include "reply.hpp" - -namespace http { -namespace server4 { - -server::server(asio::io_context& io_context, - const std::string& address, const std::string& port, - boost::function<void(const request&, reply&)> request_handler) - : request_handler_(request_handler) -{ - tcp::resolver resolver(io_context); - asio::ip::tcp::endpoint endpoint = - *resolver.resolve(address, port).begin(); - acceptor_.reset(new tcp::acceptor(io_context, endpoint)); -} - -// Enable the pseudo-keywords reenter, yield and fork. -#include <asio/yield.hpp> - -void server::operator()(asio::error_code ec, std::size_t length) -{ - // In this example we keep the error handling code in one place by - // hoisting it outside the coroutine. An alternative approach would be to - // check the value of ec after each yield for an asynchronous operation. - if (!ec) - { - // On reentering a coroutine, control jumps to the location of the last - // yield or fork. The argument to the "reenter" pseudo-keyword can be a - // pointer or reference to an object of type coroutine. - reenter (this) - { - // Loop to accept incoming connections. - do - { - // Create a new socket for the next incoming connection. - socket_.reset(new tcp::socket(acceptor_->get_executor().context())); - - // Accept a new connection. The "yield" pseudo-keyword saves the current - // line number and exits the coroutine's "reenter" block. We use the - // server coroutine as the completion handler for the async_accept - // operation. When the asynchronous operation completes, the io_context - // invokes the function call operator, we "reenter" the coroutine, and - // then control resumes at the following line. - yield acceptor_->async_accept(*socket_, *this); - - // We "fork" by cloning a new server coroutine to handle the connection. - // After forking we have a parent coroutine and a child coroutine. Both - // parent and child continue execution at the following line. They can - // be distinguished using the functions coroutine::is_parent() and - // coroutine::is_child(). - fork server(*this)(); - - // The parent continues looping to accept the next incoming connection. - // The child exits the loop and processes the connection. - } while (is_parent()); - - // Create the objects needed to receive a request on the connection. - buffer_.reset(new boost::array<char, 8192>); - request_.reset(new request); - - // Loop until a complete request (or an invalid one) has been received. - do - { - // Receive some more data. When control resumes at the following line, - // the ec and length parameters reflect the result of the asynchronous - // operation. - yield socket_->async_read_some(asio::buffer(*buffer_), *this); - - // Parse the data we just received. - boost::tie(valid_request_, boost::tuples::ignore) - = request_parser_.parse(*request_, - buffer_->data(), buffer_->data() + length); - - // An indeterminate result means we need more data, so keep looping. - } while (boost::indeterminate(valid_request_)); - - // Create the reply object that will be sent back to the client. - reply_.reset(new reply); - - if (valid_request_) - { - // A valid request was received. Call the user-supplied function object - // to process the request and compose a reply. - request_handler_(*request_, *reply_); - } - else - { - // The request was invalid. - *reply_ = reply::stock_reply(reply::bad_request); - } - - // Send the reply back to the client. - yield asio::async_write(*socket_, reply_->to_buffers(), *this); - - // Initiate graceful connection closure. - socket_->shutdown(tcp::socket::shutdown_both, ec); - } - } - - // If an error occurs then the coroutine is not reentered. Consequently, no - // new asynchronous operations are started. This means that all shared_ptr - // references will disappear and the resources associated with the coroutine - // will be destroyed automatically after this function call returns. -} - -// Disable the pseudo-keywords reenter, yield and fork. -#include <asio/unyield.hpp> - -} // namespace server4 -} // namespace http diff --git a/3rdparty/asio/src/examples/cpp03/http/server4/server.hpp b/3rdparty/asio/src/examples/cpp03/http/server4/server.hpp deleted file mode 100644 index 580ece5e097..00000000000 --- a/3rdparty/asio/src/examples/cpp03/http/server4/server.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// -// server.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <string> -#include <boost/array.hpp> -#include <boost/function.hpp> -#include <boost/shared_ptr.hpp> -#include "request_parser.hpp" - -namespace http { -namespace server4 { - -struct request; -struct reply; - -/// The top-level coroutine of the HTTP server. -class server : 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(asio::io_context& io_context, - const std::string& address, const std::string& port, - boost::function<void(const request&, reply&)> request_handler); - - /// Perform work associated with the server. - void operator()( - asio::error_code ec = asio::error_code(), - std::size_t length = 0); - -private: - typedef asio::ip::tcp tcp; - - /// The user-supplied handler for all incoming requests. - boost::function<void(const request&, reply&)> request_handler_; - - /// Acceptor used to listen for incoming connections. - boost::shared_ptr<tcp::acceptor> acceptor_; - - /// The current connection from a client. - boost::shared_ptr<tcp::socket> socket_; - - /// Buffer for incoming data. - boost::shared_ptr<boost::array<char, 8192> > buffer_; - - /// The incoming request. - boost::shared_ptr<request> 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> reply_; -}; - -} // namespace server4 -} // namespace http - -#endif // HTTP_SERVER4_SERVER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/icmp/.gitignore b/3rdparty/asio/src/examples/cpp03/icmp/.gitignore deleted file mode 100644 index 62ea912e2e4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -ping -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/icmp/icmp_header.hpp b/3rdparty/asio/src/examples/cpp03/icmp/icmp_header.hpp deleted file mode 100644 index 3b7b4bf5032..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/icmp_header.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// icmp_header.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 ICMP_HEADER_HPP -#define ICMP_HEADER_HPP - -#include <istream> -#include <ostream> -#include <algorithm> - -// ICMP header for both IPv4 and IPv6. -// -// The wire format of an ICMP header is: -// -// 0 8 16 31 -// +---------------+---------------+------------------------------+ --- -// | | | | ^ -// | type | code | checksum | | -// | | | | | -// +---------------+---------------+------------------------------+ 8 bytes -// | | | | -// | identifier | sequence number | | -// | | | v -// +-------------------------------+------------------------------+ --- - -class icmp_header -{ -public: - enum { echo_reply = 0, destination_unreachable = 3, source_quench = 4, - redirect = 5, echo_request = 8, time_exceeded = 11, parameter_problem = 12, - timestamp_request = 13, timestamp_reply = 14, info_request = 15, - info_reply = 16, address_request = 17, address_reply = 18 }; - - icmp_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); } - - unsigned char type() const { return rep_[0]; } - unsigned char code() const { return rep_[1]; } - unsigned short checksum() const { return decode(2, 3); } - unsigned short identifier() const { return decode(4, 5); } - unsigned short sequence_number() const { return decode(6, 7); } - - void type(unsigned char n) { rep_[0] = n; } - void code(unsigned char n) { rep_[1] = n; } - void checksum(unsigned short n) { encode(2, 3, n); } - void identifier(unsigned short n) { encode(4, 5, n); } - void sequence_number(unsigned short n) { encode(6, 7, n); } - - friend std::istream& operator>>(std::istream& is, icmp_header& header) - { return is.read(reinterpret_cast<char*>(header.rep_), 8); } - - friend std::ostream& operator<<(std::ostream& os, const icmp_header& header) - { return os.write(reinterpret_cast<const char*>(header.rep_), 8); } - -private: - unsigned short decode(int a, int b) const - { return (rep_[a] << 8) + rep_[b]; } - - void encode(int a, int b, unsigned short n) - { - rep_[a] = static_cast<unsigned char>(n >> 8); - rep_[b] = static_cast<unsigned char>(n & 0xFF); - } - - unsigned char rep_[8]; -}; - -template <typename Iterator> -void compute_checksum(icmp_header& header, - Iterator body_begin, Iterator body_end) -{ - unsigned int sum = (header.type() << 8) + header.code() - + header.identifier() + header.sequence_number(); - - Iterator body_iter = body_begin; - while (body_iter != body_end) - { - sum += (static_cast<unsigned char>(*body_iter++) << 8); - if (body_iter != body_end) - sum += static_cast<unsigned char>(*body_iter++); - } - - sum = (sum >> 16) + (sum & 0xFFFF); - sum += (sum >> 16); - header.checksum(static_cast<unsigned short>(~sum)); -} - -#endif // ICMP_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/icmp/ipv4_header.hpp b/3rdparty/asio/src/examples/cpp03/icmp/ipv4_header.hpp deleted file mode 100644 index 6785fd74d6c..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/ipv4_header.hpp +++ /dev/null @@ -1,102 +0,0 @@ -// -// ipv4_header.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 IPV4_HEADER_HPP -#define IPV4_HEADER_HPP - -#include <algorithm> -#include <asio/ip/address_v4.hpp> - -// Packet header for IPv4. -// -// The wire format of an IPv4 header is: -// -// 0 8 16 31 -// +-------+-------+---------------+------------------------------+ --- -// | | | | | ^ -// |version|header | type of | total length in bytes | | -// | (4) | length| service | | | -// +-------+-------+---------------+-+-+-+------------------------+ | -// | | | | | | | -// | identification |0|D|M| fragment offset | | -// | | |F|F| | | -// +---------------+---------------+-+-+-+------------------------+ | -// | | | | | -// | time to live | protocol | header checksum | 20 bytes -// | | | | | -// +---------------+---------------+------------------------------+ | -// | | | -// | source IPv4 address | | -// | | | -// +--------------------------------------------------------------+ | -// | | | -// | destination IPv4 address | | -// | | v -// +--------------------------------------------------------------+ --- -// | | ^ -// | | | -// / options (if any) / 0 - 40 -// / / bytes -// | | | -// | | v -// +--------------------------------------------------------------+ --- - -class ipv4_header -{ -public: - ipv4_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); } - - unsigned char version() const { return (rep_[0] >> 4) & 0xF; } - unsigned short header_length() const { return (rep_[0] & 0xF) * 4; } - unsigned char type_of_service() const { return rep_[1]; } - unsigned short total_length() const { return decode(2, 3); } - unsigned short identification() const { return decode(4, 5); } - bool dont_fragment() const { return (rep_[6] & 0x40) != 0; } - bool more_fragments() const { return (rep_[6] & 0x20) != 0; } - unsigned short fragment_offset() const { return decode(6, 7) & 0x1FFF; } - unsigned int time_to_live() const { return rep_[8]; } - unsigned char protocol() const { return rep_[9]; } - unsigned short header_checksum() const { return decode(10, 11); } - - asio::ip::address_v4 source_address() const - { - asio::ip::address_v4::bytes_type bytes - = { { rep_[12], rep_[13], rep_[14], rep_[15] } }; - return asio::ip::address_v4(bytes); - } - - asio::ip::address_v4 destination_address() const - { - asio::ip::address_v4::bytes_type bytes - = { { rep_[16], rep_[17], rep_[18], rep_[19] } }; - return asio::ip::address_v4(bytes); - } - - friend std::istream& operator>>(std::istream& is, ipv4_header& header) - { - is.read(reinterpret_cast<char*>(header.rep_), 20); - if (header.version() != 4) - is.setstate(std::ios::failbit); - std::streamsize options_length = header.header_length() - 20; - if (options_length < 0 || options_length > 40) - is.setstate(std::ios::failbit); - else - is.read(reinterpret_cast<char*>(header.rep_) + 20, options_length); - return is; - } - -private: - unsigned short decode(int a, int b) const - { return (rep_[a] << 8) + rep_[b]; } - - unsigned char rep_[60]; -}; - -#endif // IPV4_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/icmp/ping.cpp b/3rdparty/asio/src/examples/cpp03/icmp/ping.cpp deleted file mode 100644 index 3a1d278415d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/ping.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// -// ping.cpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <istream> -#include <iostream> -#include <ostream> - -#include "icmp_header.hpp" -#include "ipv4_header.hpp" - -using asio::ip::icmp; -using asio::deadline_timer; -namespace posix_time = boost::posix_time; - -class pinger -{ -public: - pinger(asio::io_context& io_context, const char* destination) - : resolver_(io_context), socket_(io_context, icmp::v4()), - timer_(io_context), sequence_number_(0), num_replies_(0) - { - destination_ = *resolver_.resolve(icmp::v4(), destination, "").begin(); - - start_send(); - start_receive(); - } - -private: - void start_send() - { - std::string body("\"Hello!\" from Asio ping."); - - // Create an ICMP header for an echo request. - icmp_header echo_request; - echo_request.type(icmp_header::echo_request); - echo_request.code(0); - echo_request.identifier(get_identifier()); - echo_request.sequence_number(++sequence_number_); - compute_checksum(echo_request, body.begin(), body.end()); - - // Encode the request packet. - asio::streambuf request_buffer; - std::ostream os(&request_buffer); - os << echo_request << body; - - // Send the request. - time_sent_ = posix_time::microsec_clock::universal_time(); - socket_.send_to(request_buffer.data(), destination_); - - // Wait up to five seconds for a reply. - num_replies_ = 0; - timer_.expires_at(time_sent_ + posix_time::seconds(5)); - timer_.async_wait(boost::bind(&pinger::handle_timeout, this)); - } - - void handle_timeout() - { - if (num_replies_ == 0) - std::cout << "Request timed out" << std::endl; - - // Requests must be sent no less than one second apart. - timer_.expires_at(time_sent_ + posix_time::seconds(1)); - timer_.async_wait(boost::bind(&pinger::start_send, this)); - } - - void start_receive() - { - // Discard any data already in the buffer. - reply_buffer_.consume(reply_buffer_.size()); - - // Wait for a reply. We prepare the buffer to receive up to 64KB. - socket_.async_receive(reply_buffer_.prepare(65536), - boost::bind(&pinger::handle_receive, this, _2)); - } - - void handle_receive(std::size_t length) - { - // The actual number of bytes received is committed to the buffer so that we - // can extract it using a std::istream object. - reply_buffer_.commit(length); - - // Decode the reply packet. - std::istream is(&reply_buffer_); - ipv4_header ipv4_hdr; - icmp_header icmp_hdr; - is >> ipv4_hdr >> icmp_hdr; - - // We can receive all ICMP packets received by the host, so we need to - // filter out only the echo replies that match the our identifier and - // expected sequence number. - if (is && icmp_hdr.type() == icmp_header::echo_reply - && icmp_hdr.identifier() == get_identifier() - && icmp_hdr.sequence_number() == sequence_number_) - { - // If this is the first reply, interrupt the five second timeout. - if (num_replies_++ == 0) - timer_.cancel(); - - // Print out some information about the reply packet. - posix_time::ptime now = posix_time::microsec_clock::universal_time(); - std::cout << length - ipv4_hdr.header_length() - << " bytes from " << ipv4_hdr.source_address() - << ": icmp_seq=" << icmp_hdr.sequence_number() - << ", ttl=" << ipv4_hdr.time_to_live() - << ", time=" << (now - time_sent_).total_milliseconds() << " ms" - << std::endl; - } - - start_receive(); - } - - static unsigned short get_identifier() - { -#if defined(ASIO_WINDOWS) - return static_cast<unsigned short>(::GetCurrentProcessId()); -#else - return static_cast<unsigned short>(::getpid()); -#endif - } - - icmp::resolver resolver_; - icmp::endpoint destination_; - icmp::socket socket_; - deadline_timer timer_; - unsigned short sequence_number_; - posix_time::ptime time_sent_; - asio::streambuf reply_buffer_; - std::size_t num_replies_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: ping <host>" << std::endl; -#if !defined(ASIO_WINDOWS) - std::cerr << "(You may need to run this program as root.)" << std::endl; -#endif - return 1; - } - - asio::io_context io_context; - pinger p(io_context, argv[1]); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << std::endl; - } -} diff --git a/3rdparty/asio/src/examples/cpp03/invocation/.gitignore b/3rdparty/asio/src/examples/cpp03/invocation/.gitignore deleted file mode 100644 index e5876b7811a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/invocation/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -prioritised_handlers -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/invocation/prioritised_handlers.cpp b/3rdparty/asio/src/examples/cpp03/invocation/prioritised_handlers.cpp deleted file mode 100644 index 73897946966..00000000000 --- a/3rdparty/asio/src/examples/cpp03/invocation/prioritised_handlers.cpp +++ /dev/null @@ -1,162 +0,0 @@ -// -// prioritised_handlers.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "asio.hpp" -#include <boost/function.hpp> -#include <iostream> -#include <queue> - -using asio::ip::tcp; - -class handler_priority_queue -{ -public: - void add(int priority, boost::function<void()> function) - { - handlers_.push(queued_handler(priority, function)); - } - - void execute_all() - { - while (!handlers_.empty()) - { - queued_handler handler = handlers_.top(); - handler.execute(); - handlers_.pop(); - } - } - - // A generic wrapper class for handlers to allow the invocation to be hooked. - template <typename Handler> - class wrapped_handler - { - public: - wrapped_handler(handler_priority_queue& q, int p, Handler h) - : queue_(q), priority_(p), handler_(h) - { - } - - void operator()() - { - handler_(); - } - - template <typename Arg1> - void operator()(Arg1 arg1) - { - handler_(arg1); - } - - template <typename Arg1, typename Arg2> - void operator()(Arg1 arg1, Arg2 arg2) - { - handler_(arg1, arg2); - } - - //private: - handler_priority_queue& queue_; - int priority_; - Handler handler_; - }; - - template <typename Handler> - wrapped_handler<Handler> wrap(int priority, Handler handler) - { - return wrapped_handler<Handler>(*this, priority, handler); - } - -private: - class queued_handler - { - public: - queued_handler(int p, boost::function<void()> f) - : priority_(p), function_(f) - { - } - - void execute() - { - function_(); - } - - friend bool operator<(const queued_handler& a, - const queued_handler& b) - { - return a.priority_ < b.priority_; - } - - private: - int priority_; - boost::function<void()> function_; - }; - - std::priority_queue<queued_handler> handlers_; -}; - -// Custom invocation hook for wrapped handlers. -template <typename Function, typename Handler> -void asio_handler_invoke(Function f, - handler_priority_queue::wrapped_handler<Handler>* h) -{ - h->queue_.add(h->priority_, f); -} - -//---------------------------------------------------------------------- - -void high_priority_handler(const asio::error_code& /*ec*/) -{ - std::cout << "High priority handler\n"; -} - -void middle_priority_handler(const asio::error_code& /*ec*/) -{ - std::cout << "Middle priority handler\n"; -} - -void low_priority_handler() -{ - std::cout << "Low priority handler\n"; -} - -int main() -{ - asio::io_context io_context; - - handler_priority_queue pri_queue; - - // Post a completion handler to be run immediately. - asio::post(io_context, pri_queue.wrap(0, low_priority_handler)); - - // Start an asynchronous accept that will complete immediately. - tcp::endpoint endpoint(asio::ip::address_v4::loopback(), 0); - tcp::acceptor acceptor(io_context, endpoint); - tcp::socket server_socket(io_context); - acceptor.async_accept(server_socket, - pri_queue.wrap(100, high_priority_handler)); - tcp::socket client_socket(io_context); - client_socket.connect(acceptor.local_endpoint()); - - // Set a deadline timer to expire immediately. - asio::deadline_timer timer(io_context); - timer.expires_at(boost::posix_time::neg_infin); - timer.async_wait(pri_queue.wrap(42, middle_priority_handler)); - - while (io_context.run_one()) - { - // The custom invocation hook adds the handlers to the priority queue - // rather than executing them from within the poll_one() call. - while (io_context.poll_one()) - ; - - pri_queue.execute_all(); - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/iostreams/.gitignore b/3rdparty/asio/src/examples/cpp03/iostreams/.gitignore deleted file mode 100644 index bc2b4f8f7fe..00000000000 --- a/3rdparty/asio/src/examples/cpp03/iostreams/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_client -*_server -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/iostreams/daytime_client.cpp b/3rdparty/asio/src/examples/cpp03/iostreams/daytime_client.cpp deleted file mode 100644 index 4d0f68ca989..00000000000 --- a/3rdparty/asio/src/examples/cpp03/iostreams/daytime_client.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// daytime_client.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <string> -#include <asio.hpp> - -using asio::ip::tcp; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: daytime_client <host>" << std::endl; - return 1; - } - - tcp::iostream s(argv[1], "daytime"); - if (!s) - { - std::cout << "Unable to connect: " << s.error().message() << std::endl; - return 1; - } - - std::string line; - std::getline(s, line); - std::cout << line << std::endl; - } - catch (std::exception& e) - { - std::cout << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/iostreams/daytime_server.cpp b/3rdparty/asio/src/examples/cpp03/iostreams/daytime_server.cpp deleted file mode 100644 index ed3f94b0505..00000000000 --- a/3rdparty/asio/src/examples/cpp03/iostreams/daytime_server.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// -// daytime_server.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <ctime> -#include <iostream> -#include <string> -#include <asio.hpp> - -using asio::ip::tcp; - -std::string make_daytime_string() -{ - using namespace std; // For time_t, time and ctime; - time_t now = time(0); - return ctime(&now); -} - -int main() -{ - try - { - asio::io_context io_context; - - tcp::endpoint endpoint(tcp::v4(), 13); - tcp::acceptor acceptor(io_context, endpoint); - - for (;;) - { - tcp::iostream stream; - asio::error_code ec; - acceptor.accept(stream.socket(), ec); - if (!ec) - { - stream << make_daytime_string(); - } - } - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/iostreams/http_client.cpp b/3rdparty/asio/src/examples/cpp03/iostreams/http_client.cpp deleted file mode 100644 index 247df0f37e4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/iostreams/http_client.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// http_client.cpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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/ip/tcp.hpp> - -using asio::ip::tcp; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cout << "Usage: http_client <server> <path>\n"; - std::cout << "Example:\n"; - std::cout << " http_client www.boost.org /LICENSE_1_0.txt\n"; - return 1; - } - - asio::ip::tcp::iostream s; - - // The entire sequence of I/O operations must complete within 60 seconds. - // If an expiry occurs, the socket is automatically closed and the stream - // becomes bad. - s.expires_after(boost::posix_time::seconds(60)); - - // Establish a connection to the server. - s.connect(argv[1], "http"); - if (!s) - { - std::cout << "Unable to connect: " << s.error().message() << "\n"; - return 1; - } - - // Send 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. - s << "GET " << argv[2] << " HTTP/1.0\r\n"; - s << "Host: " << argv[1] << "\r\n"; - s << "Accept: */*\r\n"; - s << "Connection: close\r\n\r\n"; - - // By default, the stream is tied with itself. This means that the stream - // automatically flush the buffered output before attempting a read. It is - // not necessary not explicitly flush the stream at this point. - - // Check that response is OK. - std::string http_version; - s >> http_version; - unsigned int status_code; - s >> status_code; - std::string status_message; - std::getline(s, status_message); - if (!s || http_version.substr(0, 5) != "HTTP/") - { - std::cout << "Invalid response\n"; - return 1; - } - if (status_code != 200) - { - std::cout << "Response returned with status code " << status_code << "\n"; - return 1; - } - - // Process the response headers, which are terminated by a blank line. - std::string header; - while (std::getline(s, header) && header != "\r") - std::cout << header << "\n"; - std::cout << "\n"; - - // Write the remaining data to output. - std::cout << s.rdbuf(); - } - catch (std::exception& e) - { - std::cout << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/local/.gitignore b/3rdparty/asio/src/examples/cpp03/local/.gitignore deleted file mode 100644 index 688277b48d0..00000000000 --- a/3rdparty/asio/src/examples/cpp03/local/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -connect_pair -stream_server -stream_client -iostream_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/local/connect_pair.cpp b/3rdparty/asio/src/examples/cpp03/local/connect_pair.cpp deleted file mode 100644 index 92e0ae866d5..00000000000 --- a/3rdparty/asio/src/examples/cpp03/local/connect_pair.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// -// connect_pair.cpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <string> -#include <cctype> -#include <asio.hpp> -#include <boost/array.hpp> -#include <boost/bind.hpp> - -#if defined(ASIO_HAS_LOCAL_SOCKETS) - -using asio::local::stream_protocol; - -class uppercase_filter -{ -public: - uppercase_filter(asio::io_context& io_context) - : socket_(io_context) - { - } - - stream_protocol::socket& socket() - { - return socket_; - } - - void start() - { - // Wait for request. - socket_.async_read_some(asio::buffer(data_), - boost::bind(&uppercase_filter::handle_read, - this, asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - -private: - void handle_read(const asio::error_code& ec, std::size_t size) - { - if (!ec) - { - // Compute result. - for (std::size_t i = 0; i < size; ++i) - data_[i] = std::toupper(data_[i]); - - // Send result. - asio::async_write(socket_, asio::buffer(data_, size), - boost::bind(&uppercase_filter::handle_write, - this, asio::placeholders::error)); - } - else - { - throw asio::system_error(ec); - } - } - - void handle_write(const asio::error_code& ec) - { - if (!ec) - { - // Wait for request. - socket_.async_read_some(asio::buffer(data_), - boost::bind(&uppercase_filter::handle_read, - this, asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - throw asio::system_error(ec); - } - } - - stream_protocol::socket socket_; - boost::array<char, 512> data_; -}; - -void run(asio::io_context* io_context) -{ - try - { - io_context->run(); - } - catch (std::exception& e) - { - std::cerr << "Exception in thread: " << e.what() << "\n"; - std::exit(1); - } -} - -int main() -{ - try - { - asio::io_context io_context; - - // Create filter and establish a connection to it. - uppercase_filter filter(io_context); - stream_protocol::socket socket(io_context); - asio::local::connect_pair(socket, filter.socket()); - filter.start(); - - // The io_context runs in a background thread to perform filtering. - asio::thread thread(boost::bind(run, &io_context)); - - for (;;) - { - // Collect request from user. - std::cout << "Enter a string: "; - std::string request; - std::getline(std::cin, request); - - // Send request to filter. - asio::write(socket, asio::buffer(request)); - - // Wait for reply from filter. - std::vector<char> reply(request.size()); - asio::read(socket, asio::buffer(reply)); - - // Show reply to user. - std::cout << "Result: "; - std::cout.write(&reply[0], request.size()); - std::cout << std::endl; - } - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - std::exit(1); - } -} - -#else // defined(ASIO_HAS_LOCAL_SOCKETS) -# error Local sockets not available on this platform. -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) diff --git a/3rdparty/asio/src/examples/cpp03/local/iostream_client.cpp b/3rdparty/asio/src/examples/cpp03/local/iostream_client.cpp deleted file mode 100644 index d28d29e88c1..00000000000 --- a/3rdparty/asio/src/examples/cpp03/local/iostream_client.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// stream_client.cpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstring> -#include <iostream> -#include "asio.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) - -using asio::local::stream_protocol; - -enum { max_length = 1024 }; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: iostream_client <file>\n"; - return 1; - } - - stream_protocol::endpoint ep(argv[1]); - stream_protocol::iostream s(ep); - if (!s) - { - std::cerr << "Unable to connect: " << s.error().message() << std::endl; - return 1; - } - - using namespace std; // For strlen. - std::cout << "Enter message: "; - char request[max_length]; - std::cin.getline(request, max_length); - size_t length = strlen(request); - s << request; - - char reply[max_length]; - s.read(reply, length); - std::cout << "Reply is: "; - std::cout.write(reply, length); - std::cout << "\n"; - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} - -#else // defined(ASIO_HAS_LOCAL_SOCKETS) -# error Local sockets not available on this platform. -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) diff --git a/3rdparty/asio/src/examples/cpp03/local/stream_client.cpp b/3rdparty/asio/src/examples/cpp03/local/stream_client.cpp deleted file mode 100644 index 6374f8fb534..00000000000 --- a/3rdparty/asio/src/examples/cpp03/local/stream_client.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// -// stream_client.cpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <cstring> -#include <iostream> -#include "asio.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) - -using asio::local::stream_protocol; - -enum { max_length = 1024 }; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: stream_client <file>\n"; - return 1; - } - - asio::io_context io_context; - - stream_protocol::socket s(io_context); - s.connect(stream_protocol::endpoint(argv[1])); - - using namespace std; // For strlen. - std::cout << "Enter message: "; - char request[max_length]; - std::cin.getline(request, max_length); - size_t request_length = strlen(request); - asio::write(s, asio::buffer(request, request_length)); - - char reply[max_length]; - size_t reply_length = asio::read(s, - asio::buffer(reply, request_length)); - std::cout << "Reply is: "; - std::cout.write(reply, reply_length); - std::cout << "\n"; - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} - -#else // defined(ASIO_HAS_LOCAL_SOCKETS) -# error Local sockets not available on this platform. -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) diff --git a/3rdparty/asio/src/examples/cpp03/local/stream_server.cpp b/3rdparty/asio/src/examples/cpp03/local/stream_server.cpp deleted file mode 100644 index 0bfe2788cae..00000000000 --- a/3rdparty/asio/src/examples/cpp03/local/stream_server.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// -// stream_server.cpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdio> -#include <iostream> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <boost/shared_ptr.hpp> -#include "asio.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) - -using asio::local::stream_protocol; - -class session - : public boost::enable_shared_from_this<session> -{ -public: - session(asio::io_context& io_context) - : socket_(io_context) - { - } - - stream_protocol::socket& socket() - { - return socket_; - } - - void start() - { - socket_.async_read_some(asio::buffer(data_), - boost::bind(&session::handle_read, - shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - - void handle_read(const asio::error_code& error, - size_t bytes_transferred) - { - if (!error) - { - asio::async_write(socket_, - asio::buffer(data_, bytes_transferred), - boost::bind(&session::handle_write, - shared_from_this(), - asio::placeholders::error)); - } - } - - void handle_write(const asio::error_code& error) - { - if (!error) - { - socket_.async_read_some(asio::buffer(data_), - boost::bind(&session::handle_read, - shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - } - -private: - // The socket used to communicate with the client. - stream_protocol::socket socket_; - - // Buffer used to store data received from the client. - boost::array<char, 1024> data_; -}; - -typedef boost::shared_ptr<session> session_ptr; - -class server -{ -public: - server(asio::io_context& io_context, const std::string& file) - : io_context_(io_context), - acceptor_(io_context, stream_protocol::endpoint(file)) - { - session_ptr new_session(new session(io_context_)); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - - void handle_accept(session_ptr new_session, - const asio::error_code& error) - { - if (!error) - { - new_session->start(); - } - - new_session.reset(new session(io_context_)); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - -private: - asio::io_context& io_context_; - stream_protocol::acceptor acceptor_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: stream_server <file>\n"; - std::cerr << "*** WARNING: existing file is removed ***\n"; - return 1; - } - - asio::io_context io_context; - - std::remove(argv[1]); - server s(io_context, argv[1]); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} - -#else // defined(ASIO_HAS_LOCAL_SOCKETS) -# error Local sockets not available on this platform. -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) diff --git a/3rdparty/asio/src/examples/cpp03/multicast/.gitignore b/3rdparty/asio/src/examples/cpp03/multicast/.gitignore deleted file mode 100644 index 0c30ebdd7df..00000000000 --- a/3rdparty/asio/src/examples/cpp03/multicast/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -receiver -sender -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/multicast/receiver.cpp b/3rdparty/asio/src/examples/cpp03/multicast/receiver.cpp deleted file mode 100644 index 5937050b0a8..00000000000 --- a/3rdparty/asio/src/examples/cpp03/multicast/receiver.cpp +++ /dev/null @@ -1,93 +0,0 @@ -// -// receiver.cpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <string> -#include "asio.hpp" -#include "boost/bind.hpp" - -const short multicast_port = 30001; - -class receiver -{ -public: - receiver(asio::io_context& io_context, - const asio::ip::address& listen_address, - const asio::ip::address& multicast_address) - : socket_(io_context) - { - // Create the socket so that multiple may be bound to the same address. - asio::ip::udp::endpoint listen_endpoint( - listen_address, multicast_port); - socket_.open(listen_endpoint.protocol()); - socket_.set_option(asio::ip::udp::socket::reuse_address(true)); - socket_.bind(listen_endpoint); - - // Join the multicast group. - socket_.set_option( - asio::ip::multicast::join_group(multicast_address)); - - socket_.async_receive_from( - asio::buffer(data_, max_length), sender_endpoint_, - boost::bind(&receiver::handle_receive_from, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - - void handle_receive_from(const asio::error_code& error, - size_t bytes_recvd) - { - if (!error) - { - std::cout.write(data_, bytes_recvd); - std::cout << std::endl; - - socket_.async_receive_from( - asio::buffer(data_, max_length), sender_endpoint_, - boost::bind(&receiver::handle_receive_from, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - } - -private: - asio::ip::udp::socket socket_; - asio::ip::udp::endpoint sender_endpoint_; - enum { max_length = 1024 }; - char data_[max_length]; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: receiver <listen_address> <multicast_address>\n"; - std::cerr << " For IPv4, try:\n"; - std::cerr << " receiver 0.0.0.0 239.255.0.1\n"; - std::cerr << " For IPv6, try:\n"; - std::cerr << " receiver 0::0 ff31::8000:1234\n"; - return 1; - } - - asio::io_context io_context; - receiver r(io_context, - asio::ip::make_address(argv[1]), - asio::ip::make_address(argv[2])); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/multicast/sender.cpp b/3rdparty/asio/src/examples/cpp03/multicast/sender.cpp deleted file mode 100644 index 995f05aa48e..00000000000 --- a/3rdparty/asio/src/examples/cpp03/multicast/sender.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// sender.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <sstream> -#include <string> -#include "asio.hpp" -#include "boost/bind.hpp" -#include "boost/date_time/posix_time/posix_time_types.hpp" - -const short multicast_port = 30001; -const int max_message_count = 10; - -class sender -{ -public: - sender(asio::io_context& io_context, - const asio::ip::address& multicast_address) - : endpoint_(multicast_address, multicast_port), - socket_(io_context, endpoint_.protocol()), - timer_(io_context), - message_count_(0) - { - std::ostringstream os; - os << "Message " << message_count_++; - message_ = os.str(); - - socket_.async_send_to( - asio::buffer(message_), endpoint_, - boost::bind(&sender::handle_send_to, this, - asio::placeholders::error)); - } - - void handle_send_to(const asio::error_code& error) - { - if (!error && message_count_ < max_message_count) - { - timer_.expires_from_now(boost::posix_time::seconds(1)); - timer_.async_wait( - boost::bind(&sender::handle_timeout, this, - asio::placeholders::error)); - } - } - - void handle_timeout(const asio::error_code& error) - { - if (!error) - { - std::ostringstream os; - os << "Message " << message_count_++; - message_ = os.str(); - - socket_.async_send_to( - asio::buffer(message_), endpoint_, - boost::bind(&sender::handle_send_to, this, - asio::placeholders::error)); - } - } - -private: - asio::ip::udp::endpoint endpoint_; - asio::ip::udp::socket socket_; - asio::deadline_timer timer_; - int message_count_; - std::string message_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: sender <multicast_address>\n"; - std::cerr << " For IPv4, try:\n"; - std::cerr << " sender 239.255.0.1\n"; - std::cerr << " For IPv6, try:\n"; - std::cerr << " sender ff31::8000:1234\n"; - return 1; - } - - asio::io_context io_context; - sender s(io_context, asio::ip::make_address(argv[1])); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/nonblocking/.gitignore b/3rdparty/asio/src/examples/cpp03/nonblocking/.gitignore deleted file mode 100644 index 760e0dcebb4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/nonblocking/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -third_party_lib -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/nonblocking/third_party_lib.cpp b/3rdparty/asio/src/examples/cpp03/nonblocking/third_party_lib.cpp deleted file mode 100644 index 8ec06f6034d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/nonblocking/third_party_lib.cpp +++ /dev/null @@ -1,240 +0,0 @@ -// -// third_party_lib.cpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <iostream> - -using asio::ip::tcp; - -namespace third_party_lib { - -// Simulation of a third party library that wants to perform read and write -// operations directly on a socket. It needs to be polled to determine whether -// it requires a read or write operation, and notified when the socket is ready -// for reading or writing. -class session -{ -public: - session(tcp::socket& socket) - : socket_(socket), - state_(reading) - { - } - - // Returns true if the third party library wants to be notified when the - // socket is ready for reading. - bool want_read() const - { - return state_ == reading; - } - - // Notify that third party library that it should perform its read operation. - void do_read(asio::error_code& ec) - { - if (std::size_t len = socket_.read_some(asio::buffer(data_), ec)) - { - write_buffer_ = asio::buffer(data_, len); - state_ = writing; - } - } - - // Returns true if the third party library wants to be notified when the - // socket is ready for writing. - bool want_write() const - { - return state_ == writing; - } - - // Notify that third party library that it should perform its write operation. - void do_write(asio::error_code& ec) - { - if (std::size_t len = socket_.write_some( - asio::buffer(write_buffer_), ec)) - { - write_buffer_ = write_buffer_ + len; - state_ = asio::buffer_size(write_buffer_) > 0 ? writing : reading; - } - } - -private: - tcp::socket& socket_; - enum { reading, writing } state_; - boost::array<char, 128> data_; - asio::const_buffer write_buffer_; -}; - -} // namespace third_party_lib - -// The glue between asio's sockets and the third party library. -class connection - : public boost::enable_shared_from_this<connection> -{ -public: - typedef boost::shared_ptr<connection> pointer; - - static pointer create(asio::io_context& io_context) - { - return pointer(new connection(io_context)); - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - // Put the socket into non-blocking mode. - socket_.non_blocking(true); - - start_operations(); - } - -private: - connection(asio::io_context& io_context) - : socket_(io_context), - session_impl_(socket_), - read_in_progress_(false), - write_in_progress_(false) - { - } - - void start_operations() - { - // Start a read operation if the third party library wants one. - if (session_impl_.want_read() && !read_in_progress_) - { - read_in_progress_ = true; - socket_.async_wait(tcp::socket::wait_read, - boost::bind(&connection::handle_read, - shared_from_this(), - asio::placeholders::error)); - } - - // Start a write operation if the third party library wants one. - if (session_impl_.want_write() && !write_in_progress_) - { - write_in_progress_ = true; - socket_.async_wait(tcp::socket::wait_write, - boost::bind(&connection::handle_write, - shared_from_this(), - asio::placeholders::error)); - } - } - - void handle_read(asio::error_code ec) - { - read_in_progress_ = false; - - // Notify third party library that it can perform a read. - if (!ec) - session_impl_.do_read(ec); - - // The third party library successfully performed a read on the socket. - // Start new read or write operations based on what it now wants. - if (!ec || ec == asio::error::would_block) - start_operations(); - - // Otherwise, an error occurred. Closing the socket cancels any outstanding - // asynchronous read or write operations. The connection object will be - // destroyed automatically once those outstanding operations complete. - else - socket_.close(); - } - - void handle_write(asio::error_code ec) - { - write_in_progress_ = false; - - // Notify third party library that it can perform a write. - if (!ec) - session_impl_.do_write(ec); - - // The third party library successfully performed a write on the socket. - // Start new read or write operations based on what it now wants. - if (!ec || ec == asio::error::would_block) - start_operations(); - - // Otherwise, an error occurred. Closing the socket cancels any outstanding - // asynchronous read or write operations. The connection object will be - // destroyed automatically once those outstanding operations complete. - else - socket_.close(); - } - -private: - tcp::socket socket_; - third_party_lib::session session_impl_; - bool read_in_progress_; - bool write_in_progress_; -}; - -class server -{ -public: - server(asio::io_context& io_context, unsigned short port) - : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) - { - start_accept(); - } - -private: - void start_accept() - { - connection::pointer new_connection = - connection::create(acceptor_.get_executor().context()); - - acceptor_.async_accept(new_connection->socket(), - boost::bind(&server::handle_accept, this, new_connection, - asio::placeholders::error)); - } - - void handle_accept(connection::pointer new_connection, - const asio::error_code& error) - { - if (!error) - { - new_connection->start(); - } - - start_accept(); - } - - tcp::acceptor acceptor_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: third_party_lib <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/porthopper/.gitignore b/3rdparty/asio/src/examples/cpp03/porthopper/.gitignore deleted file mode 100644 index 692ea7e7e65..00000000000 --- a/3rdparty/asio/src/examples/cpp03/porthopper/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -client -server -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/porthopper/client.cpp b/3rdparty/asio/src/examples/cpp03/porthopper/client.cpp deleted file mode 100644 index 15d8e4803c1..00000000000 --- a/3rdparty/asio/src/examples/cpp03/porthopper/client.cpp +++ /dev/null @@ -1,192 +0,0 @@ -// -// client.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/lambda/lambda.hpp> -#include <boost/lambda/bind.hpp> -#include <boost/lambda/if.hpp> -#include <boost/shared_ptr.hpp> -#include <algorithm> -#include <cstdlib> -#include <exception> -#include <iostream> -#include <string> -#include "protocol.hpp" - -using namespace boost; -using asio::ip::tcp; -using asio::ip::udp; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: client <host> <port>\n"; - return 1; - } - using namespace std; // For atoi. - std::string host_name = argv[1]; - std::string port = argv[2]; - - asio::io_context io_context; - - // Determine the location of the server. - tcp::resolver resolver(io_context); - tcp::endpoint remote_endpoint = *resolver.resolve(host_name, port).begin(); - - // Establish the control connection to the server. - tcp::socket control_socket(io_context); - control_socket.connect(remote_endpoint); - - // Create a datagram socket to receive data from the server. - boost::shared_ptr<udp::socket> data_socket( - new udp::socket(io_context, udp::endpoint(udp::v4(), 0))); - - // Determine what port we will receive data on. - udp::endpoint data_endpoint = data_socket->local_endpoint(); - - // Ask the server to start sending us data. - control_request start = control_request::start(data_endpoint.port()); - asio::write(control_socket, start.to_buffers()); - - unsigned long last_frame_number = 0; - for (;;) - { - // Receive 50 messages on the current data socket. - for (int i = 0; i < 50; ++i) - { - // Receive a frame from the server. - frame f; - data_socket->receive(f.to_buffers(), 0); - if (f.number() > last_frame_number) - { - last_frame_number = f.number(); - std::cout << "\n" << f.payload(); - } - } - - // Time to switch to a new socket. To ensure seamless handover we will - // continue to receive packets using the old socket until data arrives on - // the new one. - std::cout << " Starting renegotiation"; - - // Create the new data socket. - boost::shared_ptr<udp::socket> new_data_socket( - new udp::socket(io_context, udp::endpoint(udp::v4(), 0))); - - // Determine the new port we will use to receive data. - udp::endpoint new_data_endpoint = new_data_socket->local_endpoint(); - - // Ask the server to switch over to the new port. - control_request change = control_request::change( - data_endpoint.port(), new_data_endpoint.port()); - asio::error_code control_result; - asio::async_write(control_socket, change.to_buffers(), - ( - lambda::var(control_result) = lambda::_1 - )); - - // Try to receive a frame from the server on the new data socket. If we - // successfully receive a frame on this new data socket we can consider - // the renegotation complete. In that case we will close the old data - // socket, which will cause any outstanding receive operation on it to be - // cancelled. - frame f1; - asio::error_code new_data_socket_result; - new_data_socket->async_receive(f1.to_buffers(), - ( - // Note: lambda::_1 is the first argument to the callback handler, - // which in this case is the error code for the operation. - lambda::var(new_data_socket_result) = lambda::_1, - lambda::if_(!lambda::_1) - [ - // We have successfully received a frame on the new data socket, - // so we can close the old data socket. This will cancel any - // outstanding receive operation on the old data socket. - lambda::var(data_socket) = boost::shared_ptr<udp::socket>() - ] - )); - - // This loop will continue until we have successfully completed the - // renegotiation (i.e. received a frame on the new data socket), or some - // unrecoverable error occurs. - bool done = false; - while (!done) - { - // Even though we're performing a renegotation, we want to continue - // receiving data as smoothly as possible. Therefore we will continue to - // try to receive a frame from the server on the old data socket. If we - // receive a frame on this socket we will interrupt the io_context, - // print the frame, and resume waiting for the other operations to - // complete. - frame f2; - done = true; // Let's be optimistic. - if (data_socket) // Might have been closed by new_data_socket's handler. - { - data_socket->async_receive(f2.to_buffers(), 0, - ( - lambda::if_(!lambda::_1) - [ - // We have successfully received a frame on the old data - // socket. Stop the io_context so that we can print it. - lambda::bind(&asio::io_context::stop, &io_context), - lambda::var(done) = false - ] - )); - } - - // Run the operations in parallel. This will block until all operations - // have finished, or until the io_context is interrupted. (No threads!) - io_context.restart(); - io_context.run(); - - // If the io_context.run() was interrupted then we have received a frame - // on the old data socket. We need to keep waiting for the renegotation - // operations to complete. - if (!done) - { - if (f2.number() > last_frame_number) - { - last_frame_number = f2.number(); - std::cout << "\n" << f2.payload(); - } - } - } - - // Since the loop has finished, we have either successfully completed - // the renegotation, or an error has occurred. First we'll check for - // errors. - if (control_result) - throw asio::system_error(control_result); - if (new_data_socket_result) - throw asio::system_error(new_data_socket_result); - - // If we get here it means we have successfully started receiving data on - // the new data socket. This new data socket will be used from now on - // (until the next time we renegotiate). - std::cout << " Renegotiation complete"; - data_socket = new_data_socket; - data_endpoint = new_data_endpoint; - if (f1.number() > last_frame_number) - { - last_frame_number = f1.number(); - std::cout << "\n" << f1.payload(); - } - } - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/porthopper/protocol.hpp b/3rdparty/asio/src/examples/cpp03/porthopper/protocol.hpp deleted file mode 100644 index c79bc6b49f4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/porthopper/protocol.hpp +++ /dev/null @@ -1,156 +0,0 @@ -// -// protocol.hpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 PORTHOPPER_PROTOCOL_HPP -#define PORTHOPPER_PROTOCOL_HPP - -#include <boost/array.hpp> -#include <asio.hpp> -#include <cstring> -#include <iomanip> -#include <string> -#include <strstream> - -// This request is sent by the client to the server over a TCP connection. -// The client uses it to perform three functions: -// - To request that data start being sent to a given port. -// - To request that data is no longer sent to a given port. -// - To change the target port to another. -class control_request -{ -public: - // Construct an empty request. Used when receiving. - control_request() - { - } - - // Create a request to start sending data to a given port. - static const control_request start(unsigned short port) - { - return control_request(0, port); - } - - // Create a request to stop sending data to a given port. - static const control_request stop(unsigned short port) - { - return control_request(port, 0); - } - - // Create a request to change the port that data is sent to. - static const control_request change( - unsigned short old_port, unsigned short new_port) - { - return control_request(old_port, new_port); - } - - // Get the old port. Returns 0 for start requests. - unsigned short old_port() const - { - std::istrstream is(data_, encoded_port_size); - unsigned short port = 0; - is >> std::setw(encoded_port_size) >> std::hex >> port; - return port; - } - - // Get the new port. Returns 0 for stop requests. - unsigned short new_port() const - { - std::istrstream is(data_ + encoded_port_size, encoded_port_size); - unsigned short port = 0; - is >> std::setw(encoded_port_size) >> std::hex >> port; - return port; - } - - // Obtain buffers for reading from or writing to a socket. - boost::array<asio::mutable_buffer, 1> to_buffers() - { - boost::array<asio::mutable_buffer, 1> buffers - = { { asio::buffer(data_) } }; - return buffers; - } - -private: - // Construct with specified old and new ports. - control_request(unsigned short old_port_number, - unsigned short new_port_number) - { - std::ostrstream os(data_, control_request_size); - os << std::setw(encoded_port_size) << std::hex << old_port_number; - os << std::setw(encoded_port_size) << std::hex << new_port_number; - } - - // The length in bytes of a control_request and its components. - enum - { - encoded_port_size = 4, // 16-bit port in hex. - control_request_size = encoded_port_size * 2 - }; - - // The encoded request data. - char data_[control_request_size]; -}; - -// This frame is sent from the server to subscribed clients over UDP. -class frame -{ -public: - // The maximum allowable length of the payload. - enum { payload_size = 32 }; - - // Construct an empty frame. Used when receiving. - frame() - { - } - - // Construct a frame with specified frame number and payload. - frame(unsigned long frame_number, const std::string& payload_data) - { - std::ostrstream os(data_, frame_size); - os << std::setw(encoded_number_size) << std::hex << frame_number; - os << std::setw(payload_size) - << std::setfill(' ') << payload_data.substr(0, payload_size); - } - - // Get the frame number. - unsigned long number() const - { - std::istrstream is(data_, encoded_number_size); - unsigned long frame_number = 0; - is >> std::setw(encoded_number_size) >> std::hex >> frame_number; - return frame_number; - } - - // Get the payload data. - const std::string payload() const - { - return std::string(data_ + encoded_number_size, payload_size); - } - - // Obtain buffers for reading from or writing to a socket. - boost::array<asio::mutable_buffer, 1> to_buffers() - { - boost::array<asio::mutable_buffer, 1> buffers - = { { asio::buffer(data_) } }; - return buffers; - } - -private: - // The length in bytes of a frame and its components. - enum - { - encoded_number_size = 8, // Frame number in hex. - frame_size = encoded_number_size + payload_size - }; - - // The encoded frame data. - char data_[frame_size]; -}; - -#endif // PORTHOPPER_PROTOCOL_HPP diff --git a/3rdparty/asio/src/examples/cpp03/porthopper/server.cpp b/3rdparty/asio/src/examples/cpp03/porthopper/server.cpp deleted file mode 100644 index b98a7d4b24d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/porthopper/server.cpp +++ /dev/null @@ -1,189 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <cmath> -#include <cstdlib> -#include <exception> -#include <iostream> -#include <set> -#include "protocol.hpp" - -using asio::ip::tcp; -using asio::ip::udp; - -typedef boost::shared_ptr<tcp::socket> tcp_socket_ptr; -typedef boost::shared_ptr<asio::deadline_timer> timer_ptr; -typedef boost::shared_ptr<control_request> control_request_ptr; - -class server -{ -public: - // Construct the server to wait for incoming control connections. - server(asio::io_context& io_context, unsigned short port) - : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), - timer_(io_context), - udp_socket_(io_context, udp::endpoint(udp::v4(), 0)), - next_frame_number_(1) - { - // Start waiting for a new control connection. - tcp_socket_ptr new_socket( - new tcp::socket(acceptor_.get_executor().context())); - acceptor_.async_accept(*new_socket, - boost::bind(&server::handle_accept, this, - asio::placeholders::error, new_socket)); - - // Start the timer used to generate outgoing frames. - timer_.expires_from_now(boost::posix_time::milliseconds(100)); - timer_.async_wait(boost::bind(&server::handle_timer, this)); - } - - // Handle a new control connection. - void handle_accept(const asio::error_code& ec, tcp_socket_ptr socket) - { - if (!ec) - { - // Start receiving control requests on the connection. - control_request_ptr request(new control_request); - asio::async_read(*socket, request->to_buffers(), - boost::bind(&server::handle_control_request, this, - asio::placeholders::error, socket, request)); - } - - // Start waiting for a new control connection. - tcp_socket_ptr new_socket( - new tcp::socket(acceptor_.get_executor().context())); - acceptor_.async_accept(*new_socket, - boost::bind(&server::handle_accept, this, - asio::placeholders::error, new_socket)); - } - - // Handle a new control request. - void handle_control_request(const asio::error_code& ec, - tcp_socket_ptr socket, control_request_ptr request) - { - if (!ec) - { - // Delay handling of the control request to simulate network latency. - timer_ptr delay_timer( - new asio::deadline_timer(acceptor_.get_executor().context())); - delay_timer->expires_from_now(boost::posix_time::seconds(2)); - delay_timer->async_wait( - boost::bind(&server::handle_control_request_timer, this, - socket, request, delay_timer)); - } - } - - void handle_control_request_timer(tcp_socket_ptr socket, - control_request_ptr request, timer_ptr /*delay_timer*/) - { - // Determine what address this client is connected from, since - // subscriptions must be stored on the server as a complete endpoint, not - // just a port. We use the non-throwing overload of remote_endpoint() since - // it may fail if the socket is no longer connected. - asio::error_code ec; - tcp::endpoint remote_endpoint = socket->remote_endpoint(ec); - if (!ec) - { - // Remove old port subscription, if any. - if (unsigned short old_port = request->old_port()) - { - udp::endpoint old_endpoint(remote_endpoint.address(), old_port); - subscribers_.erase(old_endpoint); - std::cout << "Removing subscription " << old_endpoint << std::endl; - } - - // Add new port subscription, if any. - if (unsigned short new_port = request->new_port()) - { - udp::endpoint new_endpoint(remote_endpoint.address(), new_port); - subscribers_.insert(new_endpoint); - std::cout << "Adding subscription " << new_endpoint << std::endl; - } - } - - // Wait for next control request on this connection. - asio::async_read(*socket, request->to_buffers(), - boost::bind(&server::handle_control_request, this, - asio::placeholders::error, socket, request)); - } - - // Every time the timer fires we will generate a new frame and send it to all - // subscribers. - void handle_timer() - { - // Generate payload. - double x = next_frame_number_ * 0.2; - double y = std::sin(x); - int char_index = static_cast<int>((y + 1.0) * (frame::payload_size / 2)); - std::string payload; - for (int i = 0; i < frame::payload_size; ++i) - payload += (i == char_index ? '*' : '.'); - - // Create the frame to be sent to all subscribers. - frame f(next_frame_number_++, payload); - - // Send frame to all subscribers. We can use synchronous calls here since - // UDP send operations typically do not block. - std::set<udp::endpoint>::iterator j; - for (j = subscribers_.begin(); j != subscribers_.end(); ++j) - { - asio::error_code ec; - udp_socket_.send_to(f.to_buffers(), *j, 0, ec); - } - - // Wait for next timeout. - timer_.expires_from_now(boost::posix_time::milliseconds(100)); - timer_.async_wait(boost::bind(&server::handle_timer, this)); - } - -private: - // The acceptor used to accept incoming control connections. - tcp::acceptor acceptor_; - - // The timer used for generating data. - asio::deadline_timer timer_; - - // The socket used to send data to subscribers. - udp::socket udp_socket_; - - // The next frame number. - unsigned long next_frame_number_; - - // The set of endpoints that are subscribed. - std::set<udp::endpoint> subscribers_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: server <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/serialization/.gitignore b/3rdparty/asio/src/examples/cpp03/serialization/.gitignore deleted file mode 100644 index 692ea7e7e65..00000000000 --- a/3rdparty/asio/src/examples/cpp03/serialization/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -client -server -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/serialization/client.cpp b/3rdparty/asio/src/examples/cpp03/serialization/client.cpp deleted file mode 100644 index 8b83de284f4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/serialization/client.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// -// client.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <iostream> -#include <vector> -#include "connection.hpp" // Must come before boost/serialization headers. -#include <boost/serialization/vector.hpp> -#include "stock.hpp" - -namespace s11n_example { - -/// Downloads stock quote information from a server. -class client -{ -public: - /// Constructor starts the asynchronous connect operation. - client(asio::io_context& io_context, - const std::string& host, const std::string& service) - : connection_(io_context) - { - // Resolve the host name into an IP address. - asio::ip::tcp::resolver resolver(io_context); - asio::ip::tcp::resolver::query query(host, service); - asio::ip::tcp::resolver::iterator endpoint_iterator = - resolver.resolve(query); - - // Start an asynchronous connect operation. - asio::async_connect(connection_.socket(), endpoint_iterator, - boost::bind(&client::handle_connect, this, - asio::placeholders::error)); - } - - /// Handle completion of a connect operation. - void handle_connect(const asio::error_code& e) - { - if (!e) - { - // Successfully established connection. Start operation to read the list - // of stocks. The connection::async_read() function will automatically - // decode the data that is read from the underlying socket. - connection_.async_read(stocks_, - boost::bind(&client::handle_read, this, - asio::placeholders::error)); - } - else - { - // An error occurred. Log it and return. Since we are not starting a new - // operation the io_context will run out of work to do and the client will - // exit. - std::cerr << e.message() << std::endl; - } - } - - /// Handle completion of a read operation. - void handle_read(const asio::error_code& e) - { - if (!e) - { - // Print out the data that was received. - for (std::size_t i = 0; i < stocks_.size(); ++i) - { - std::cout << "Stock number " << i << "\n"; - std::cout << " code: " << stocks_[i].code << "\n"; - std::cout << " name: " << stocks_[i].name << "\n"; - std::cout << " open_price: " << stocks_[i].open_price << "\n"; - std::cout << " high_price: " << stocks_[i].high_price << "\n"; - std::cout << " low_price: " << stocks_[i].low_price << "\n"; - std::cout << " last_price: " << stocks_[i].last_price << "\n"; - std::cout << " buy_price: " << stocks_[i].buy_price << "\n"; - std::cout << " buy_quantity: " << stocks_[i].buy_quantity << "\n"; - std::cout << " sell_price: " << stocks_[i].sell_price << "\n"; - std::cout << " sell_quantity: " << stocks_[i].sell_quantity << "\n"; - } - } - else - { - // An error occurred. - std::cerr << e.message() << std::endl; - } - - // Since we are not starting a new operation the io_context will run out of - // work to do and the client will exit. - } - -private: - /// The connection to the server. - connection connection_; - - /// The data received from the server. - std::vector<stock> stocks_; -}; - -} // namespace s11n_example - -int main(int argc, char* argv[]) -{ - try - { - // Check command line arguments. - if (argc != 3) - { - std::cerr << "Usage: client <host> <port>" << std::endl; - return 1; - } - - asio::io_context io_context; - s11n_example::client client(io_context, argv[1], argv[2]); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/serialization/connection.hpp b/3rdparty/asio/src/examples/cpp03/serialization/connection.hpp deleted file mode 100644 index a1fa2a19e8e..00000000000 --- a/3rdparty/asio/src/examples/cpp03/serialization/connection.hpp +++ /dev/null @@ -1,188 +0,0 @@ -// -// connection.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 SERIALIZATION_CONNECTION_HPP -#define SERIALIZATION_CONNECTION_HPP - -#include <asio.hpp> -#include <boost/archive/text_iarchive.hpp> -#include <boost/archive/text_oarchive.hpp> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/tuple/tuple.hpp> -#include <iomanip> -#include <string> -#include <sstream> -#include <vector> - -namespace s11n_example { - -/// The connection class provides serialization primitives on top of a socket. -/** - * Each message sent using this class consists of: - * @li An 8-byte header containing the length of the serialized data in - * hexadecimal. - * @li The serialized data. - */ -class connection -{ -public: - /// Constructor. - connection(asio::io_context& io_context) - : socket_(io_context) - { - } - - /// Get the underlying socket. Used for making a connection or for accepting - /// an incoming connection. - asio::ip::tcp::socket& socket() - { - return socket_; - } - - /// Asynchronously write a data structure to the socket. - template <typename T, typename Handler> - void async_write(const T& t, Handler handler) - { - // Serialize the data first so we know how large it is. - std::ostringstream archive_stream; - boost::archive::text_oarchive archive(archive_stream); - archive << t; - outbound_data_ = archive_stream.str(); - - // Format the header. - std::ostringstream header_stream; - header_stream << std::setw(header_length) - << std::hex << outbound_data_.size(); - if (!header_stream || header_stream.str().size() != header_length) - { - // Something went wrong, inform the caller. - asio::error_code error(asio::error::invalid_argument); - socket_.get_io_context().post(boost::bind(handler, error)); - return; - } - outbound_header_ = header_stream.str(); - - // Write the serialized data to the socket. We use "gather-write" to send - // both the header and the data in a single write operation. - std::vector<asio::const_buffer> buffers; - buffers.push_back(asio::buffer(outbound_header_)); - buffers.push_back(asio::buffer(outbound_data_)); - asio::async_write(socket_, buffers, handler); - } - - /// Asynchronously read a data structure from the socket. - template <typename T, typename Handler> - void async_read(T& t, Handler handler) - { - // Issue a read operation to read exactly the number of bytes in a header. - void (connection::*f)( - const asio::error_code&, - T&, boost::tuple<Handler>) - = &connection::handle_read_header<T, Handler>; - asio::async_read(socket_, asio::buffer(inbound_header_), - boost::bind(f, - this, asio::placeholders::error, boost::ref(t), - boost::make_tuple(handler))); - } - - /// Handle a completed read of a message header. The handler is passed using - /// a tuple since boost::bind seems to have trouble binding a function object - /// created using boost::bind as a parameter. - template <typename T, typename Handler> - void handle_read_header(const asio::error_code& e, - T& t, boost::tuple<Handler> handler) - { - if (e) - { - boost::get<0>(handler)(e); - } - else - { - // Determine the length of the serialized data. - std::istringstream is(std::string(inbound_header_, header_length)); - std::size_t inbound_data_size = 0; - if (!(is >> std::hex >> inbound_data_size)) - { - // Header doesn't seem to be valid. Inform the caller. - asio::error_code error(asio::error::invalid_argument); - boost::get<0>(handler)(error); - return; - } - - // Start an asynchronous call to receive the data. - inbound_data_.resize(inbound_data_size); - void (connection::*f)( - const asio::error_code&, - T&, boost::tuple<Handler>) - = &connection::handle_read_data<T, Handler>; - asio::async_read(socket_, asio::buffer(inbound_data_), - boost::bind(f, this, - asio::placeholders::error, boost::ref(t), handler)); - } - } - - /// Handle a completed read of message data. - template <typename T, typename Handler> - void handle_read_data(const asio::error_code& e, - T& t, boost::tuple<Handler> handler) - { - if (e) - { - boost::get<0>(handler)(e); - } - else - { - // Extract the data structure from the data just received. - try - { - std::string archive_data(&inbound_data_[0], inbound_data_.size()); - std::istringstream archive_stream(archive_data); - boost::archive::text_iarchive archive(archive_stream); - archive >> t; - } - catch (std::exception& e) - { - // Unable to decode data. - asio::error_code error(asio::error::invalid_argument); - boost::get<0>(handler)(error); - return; - } - - // Inform caller that data has been received ok. - boost::get<0>(handler)(e); - } - } - -private: - /// The underlying socket. - asio::ip::tcp::socket socket_; - - /// The size of a fixed length header. - enum { header_length = 8 }; - - /// Holds an outbound header. - std::string outbound_header_; - - /// Holds the outbound data. - std::string outbound_data_; - - /// Holds an inbound header. - char inbound_header_[header_length]; - - /// Holds the inbound data. - std::vector<char> inbound_data_; -}; - -typedef boost::shared_ptr<connection> connection_ptr; - -} // namespace s11n_example - -#endif // SERIALIZATION_CONNECTION_HPP diff --git a/3rdparty/asio/src/examples/cpp03/serialization/server.cpp b/3rdparty/asio/src/examples/cpp03/serialization/server.cpp deleted file mode 100644 index b81b1a424da..00000000000 --- a/3rdparty/asio/src/examples/cpp03/serialization/server.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <boost/lexical_cast.hpp> -#include <iostream> -#include <vector> -#include "connection.hpp" // Must come before boost/serialization headers. -#include <boost/serialization/vector.hpp> -#include "stock.hpp" - -namespace s11n_example { - -/// Serves stock quote information to any client that connects to it. -class server -{ -public: - /// Constructor opens the acceptor and starts waiting for the first incoming - /// connection. - server(asio::io_context& io_context, unsigned short port) - : acceptor_(io_context, - asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)) - { - // Create the data to be sent to each client. - stock s; - s.code = "ABC"; - s.name = "A Big Company"; - s.open_price = 4.56; - s.high_price = 5.12; - s.low_price = 4.33; - s.last_price = 4.98; - s.buy_price = 4.96; - s.buy_quantity = 1000; - s.sell_price = 4.99; - s.sell_quantity = 2000; - stocks_.push_back(s); - s.code = "DEF"; - s.name = "Developer Entertainment Firm"; - s.open_price = 20.24; - s.high_price = 22.88; - s.low_price = 19.50; - s.last_price = 19.76; - s.buy_price = 19.72; - s.buy_quantity = 34000; - s.sell_price = 19.85; - s.sell_quantity = 45000; - stocks_.push_back(s); - - // Start an accept operation for a new connection. - connection_ptr new_conn(new connection(acceptor_.get_io_context())); - acceptor_.async_accept(new_conn->socket(), - boost::bind(&server::handle_accept, this, - asio::placeholders::error, new_conn)); - } - - /// Handle completion of a accept operation. - void handle_accept(const asio::error_code& e, connection_ptr conn) - { - if (!e) - { - // Successfully accepted a new connection. Send the list of stocks to the - // client. The connection::async_write() function will automatically - // serialize the data structure for us. - conn->async_write(stocks_, - boost::bind(&server::handle_write, this, - asio::placeholders::error, conn)); - } - - // Start an accept operation for a new connection. - connection_ptr new_conn(new connection(acceptor_.get_io_context())); - acceptor_.async_accept(new_conn->socket(), - boost::bind(&server::handle_accept, this, - asio::placeholders::error, new_conn)); - } - - /// Handle completion of a write operation. - void handle_write(const asio::error_code& e, connection_ptr conn) - { - // Nothing to do. The socket will be closed automatically when the last - // reference to the connection object goes away. - } - -private: - /// The acceptor object used to accept incoming socket connections. - asio::ip::tcp::acceptor acceptor_; - - /// The data to be sent to each client. - std::vector<stock> stocks_; -}; - -} // namespace s11n_example - -int main(int argc, char* argv[]) -{ - try - { - // Check command line arguments. - if (argc != 2) - { - std::cerr << "Usage: server <port>" << std::endl; - return 1; - } - unsigned short port = boost::lexical_cast<unsigned short>(argv[1]); - - asio::io_context io_context; - s11n_example::server server(io_context, port); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/serialization/stock.hpp b/3rdparty/asio/src/examples/cpp03/serialization/stock.hpp deleted file mode 100644 index 1acbca5a7a6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/serialization/stock.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// stock.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 SERIALIZATION_STOCK_HPP -#define SERIALIZATION_STOCK_HPP - -#include <string> - -namespace s11n_example { - -/// Structure to hold information about a single stock. -struct stock -{ - std::string code; - std::string name; - double open_price; - double high_price; - double low_price; - double last_price; - double buy_price; - int buy_quantity; - double sell_price; - int sell_quantity; - - template <typename Archive> - void serialize(Archive& ar, const unsigned int version) - { - ar & code; - ar & name; - ar & open_price; - ar & high_price; - ar & low_price; - ar & last_price; - ar & buy_price; - ar & buy_quantity; - ar & sell_price; - ar & sell_quantity; - } -}; - -} // namespace s11n_example - -#endif // SERIALIZATION_STOCK_HPP diff --git a/3rdparty/asio/src/examples/cpp03/services/.gitignore b/3rdparty/asio/src/examples/cpp03/services/.gitignore deleted file mode 100644 index 701b1b85834..00000000000 --- a/3rdparty/asio/src/examples/cpp03/services/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_client -*.ilk -*.manifest -*.pdb -*.tds -log.txt diff --git a/3rdparty/asio/src/examples/cpp03/services/basic_logger.hpp b/3rdparty/asio/src/examples/cpp03/services/basic_logger.hpp deleted file mode 100644 index 876086a2ecf..00000000000 --- a/3rdparty/asio/src/examples/cpp03/services/basic_logger.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// -// basic_logger.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 SERVICES_BASIC_LOGGER_HPP -#define SERVICES_BASIC_LOGGER_HPP - -#include <asio.hpp> -#include <boost/noncopyable.hpp> -#include <string> - -namespace services { - -/// Class to provide simple logging functionality. Use the services::logger -/// typedef. -template <typename Service> -class basic_logger - : private boost::noncopyable -{ -public: - /// The type of the service that will be used to provide timer operations. - typedef Service service_type; - - /// The native implementation type of the timer. - typedef typename service_type::impl_type impl_type; - - /// Constructor. - /** - * This constructor creates a logger. - * - * @param io_context The io_context object used to locate the logger service. - * - * @param identifier An identifier for this logger. - */ - explicit basic_logger(asio::io_context& io_context, - const std::string& identifier) - : service_(asio::use_service<Service>(io_context)), - impl_(service_.null()) - { - service_.create(impl_, identifier); - } - - /// Destructor. - ~basic_logger() - { - service_.destroy(impl_); - } - - /// Get the io_context associated with the object. - asio::io_context& get_io_context() - { - return service_.get_io_context(); - } - - /// Set the output file for all logger instances. - void use_file(const std::string& file) - { - service_.use_file(impl_, file); - } - - /// Log a message. - void log(const std::string& message) - { - service_.log(impl_, message); - } - -private: - /// The backend service implementation. - service_type& service_; - - /// The underlying native implementation. - impl_type impl_; -}; - -} // namespace services - -#endif // SERVICES_BASIC_LOGGER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/services/daytime_client.cpp b/3rdparty/asio/src/examples/cpp03/services/daytime_client.cpp deleted file mode 100644 index e0a6af9df6f..00000000000 --- a/3rdparty/asio/src/examples/cpp03/services/daytime_client.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// -// daytime_client.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <iostream> -#include "logger.hpp" - -using asio::ip::tcp; - -char read_buffer[1024]; - -void read_handler(const asio::error_code& e, - std::size_t bytes_transferred, tcp::socket* s) -{ - if (!e) - { - std::cout.write(read_buffer, bytes_transferred); - - s->async_read_some(asio::buffer(read_buffer), - boost::bind(read_handler, asio::placeholders::error, - asio::placeholders::bytes_transferred, s)); - } - else - { - services::logger logger(s->get_executor().context(), "read_handler"); - - std::string msg = "Read error: "; - msg += e.message(); - logger.log(msg); - } -} - -void connect_handler(const asio::error_code& e, tcp::socket* s) -{ - services::logger logger(s->get_executor().context(), "connect_handler"); - - if (!e) - { - logger.log("Connection established"); - - s->async_read_some(asio::buffer(read_buffer), - boost::bind(read_handler, asio::placeholders::error, - asio::placeholders::bytes_transferred, s)); - } - else - { - std::string msg = "Unable to establish connection: "; - msg += e.message(); - logger.log(msg); - } -} - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: daytime_client <host>" << std::endl; - return 1; - } - - asio::io_context io_context; - - // Set the name of the file that all logger instances will use. - services::logger logger(io_context, ""); - logger.use_file("log.txt"); - - // Resolve the address corresponding to the given host. - tcp::resolver resolver(io_context); - tcp::resolver::results_type endpoints = - resolver.resolve(argv[1], "daytime"); - - // Start an asynchronous connect. - tcp::socket socket(io_context); - asio::async_connect(socket, endpoints, - boost::bind(connect_handler, - asio::placeholders::error, &socket)); - - // Run the io_context until all operations have finished. - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/services/logger.hpp b/3rdparty/asio/src/examples/cpp03/services/logger.hpp deleted file mode 100644 index 41d17e6de10..00000000000 --- a/3rdparty/asio/src/examples/cpp03/services/logger.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// logger.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 SERVICES_LOGGER_HPP -#define SERVICES_LOGGER_HPP - -#include "basic_logger.hpp" -#include "logger_service.hpp" - -namespace services { - -/// Typedef for typical logger usage. -typedef basic_logger<logger_service> logger; - -} // namespace services - -#endif // SERVICES_LOGGER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/services/logger_service.cpp b/3rdparty/asio/src/examples/cpp03/services/logger_service.cpp deleted file mode 100644 index c3543e47f5a..00000000000 --- a/3rdparty/asio/src/examples/cpp03/services/logger_service.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// -// logger_service.cpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "logger_service.hpp" - -namespace services { - -asio::io_context::id logger_service::id; - -} // namespace services diff --git a/3rdparty/asio/src/examples/cpp03/services/logger_service.hpp b/3rdparty/asio/src/examples/cpp03/services/logger_service.hpp deleted file mode 100644 index 9f175dffba3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/services/logger_service.hpp +++ /dev/null @@ -1,145 +0,0 @@ -// -// logger_service.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 SERVICES_LOGGER_SERVICE_HPP -#define SERVICES_LOGGER_SERVICE_HPP - -#include <asio.hpp> -#include <boost/bind.hpp> -#include <boost/date_time/posix_time/posix_time.hpp> -#include <boost/noncopyable.hpp> -#include <boost/scoped_ptr.hpp> -#include <fstream> -#include <sstream> -#include <string> - -namespace services { - -/// Service implementation for the logger. -class logger_service - : public asio::io_context::service -{ -public: - /// The unique service identifier. - static asio::io_context::id id; - - /// The backend implementation of a logger. - struct logger_impl - { - explicit logger_impl(const std::string& ident) : identifier(ident) {} - std::string identifier; - }; - - /// The type for an implementation of the logger. - typedef logger_impl* impl_type; - - /// Constructor creates a thread to run a private io_context. - logger_service(asio::io_context& io_context) - : asio::io_context::service(io_context), - work_io_context_(), - work_(asio::make_work_guard(work_io_context_)), - work_thread_(new asio::thread( - boost::bind(&asio::io_context::run, &work_io_context_))) - { - } - - /// Destructor shuts down the private io_context. - ~logger_service() - { - /// Indicate that we have finished with the private io_context. Its - /// io_context::run() function will exit once all other work has completed. - work_.reset(); - if (work_thread_) - work_thread_->join(); - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Return a null logger implementation. - impl_type null() const - { - return 0; - } - - /// Create a new logger implementation. - void create(impl_type& impl, const std::string& identifier) - { - impl = new logger_impl(identifier); - } - - /// Destroy a logger implementation. - void destroy(impl_type& impl) - { - delete impl; - impl = null(); - } - - /// Set the output file for the logger. The current implementation sets the - /// output file for all logger instances, and so the impl parameter is not - /// actually needed. It is retained here to illustrate how service functions - /// are typically defined. - void use_file(impl_type& /*impl*/, const std::string& file) - { - // Pass the work of opening the file to the background thread. - asio::post(work_io_context_, boost::bind( - &logger_service::use_file_impl, this, file)); - } - - /// Log a message. - void log(impl_type& impl, const std::string& message) - { - // Format the text to be logged. - std::ostringstream os; - os << impl->identifier << ": " << message; - - // Pass the work of opening the file to the background thread. - asio::post(work_io_context_, boost::bind( - &logger_service::log_impl, this, os.str())); - } - -private: - /// Helper function used to open the output file from within the private - /// io_context's thread. - void use_file_impl(const std::string& file) - { - ofstream_.close(); - ofstream_.clear(); - ofstream_.open(file.c_str()); - } - - /// Helper function used to log a message from within the private io_context's - /// thread. - void log_impl(const std::string& text) - { - ofstream_ << text << std::endl; - } - - /// Private io_context used for performing logging operations. - asio::io_context work_io_context_; - - /// Work for the private io_context to perform. If we do not give the - /// io_context some work to do then the io_context::run() function will exit - /// immediately. - asio::executor_work_guard< - asio::io_context::executor_type> work_; - - /// Thread used for running the work io_context's run loop. - boost::scoped_ptr<asio::thread> work_thread_; - - /// The file to which log messages will be written. - std::ofstream ofstream_; -}; - -} // namespace services - -#endif // SERVICES_LOGGER_SERVICE_HPP diff --git a/3rdparty/asio/src/examples/cpp03/socks4/.gitignore b/3rdparty/asio/src/examples/cpp03/socks4/.gitignore deleted file mode 100644 index e11e0de344e..00000000000 --- a/3rdparty/asio/src/examples/cpp03/socks4/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -sync_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/socks4/socks4.hpp b/3rdparty/asio/src/examples/cpp03/socks4/socks4.hpp deleted file mode 100644 index c5558756558..00000000000 --- a/3rdparty/asio/src/examples/cpp03/socks4/socks4.hpp +++ /dev/null @@ -1,144 +0,0 @@ -// -// socks4.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 SOCKS4_HPP -#define SOCKS4_HPP - -#include <string> -#include <asio.hpp> -#include <boost/array.hpp> - -namespace socks4 { - -const unsigned char version = 0x04; - -class request -{ -public: - enum command_type - { - connect = 0x01, - bind = 0x02 - }; - - request(command_type cmd, const asio::ip::tcp::endpoint& endpoint, - const std::string& user_id) - : version_(version), - command_(cmd), - user_id_(user_id), - null_byte_(0) - { - // Only IPv4 is supported by the SOCKS 4 protocol. - if (endpoint.protocol() != asio::ip::tcp::v4()) - { - throw asio::system_error( - asio::error::address_family_not_supported); - } - - // Convert port number to network byte order. - unsigned short port = endpoint.port(); - port_high_byte_ = (port >> 8) & 0xff; - port_low_byte_ = port & 0xff; - - // Save IP address in network byte order. - address_ = endpoint.address().to_v4().to_bytes(); - } - - boost::array<asio::const_buffer, 7> buffers() const - { - boost::array<asio::const_buffer, 7> bufs = - { - { - asio::buffer(&version_, 1), - asio::buffer(&command_, 1), - asio::buffer(&port_high_byte_, 1), - asio::buffer(&port_low_byte_, 1), - asio::buffer(address_), - asio::buffer(user_id_), - asio::buffer(&null_byte_, 1) - } - }; - return bufs; - } - -private: - unsigned char version_; - unsigned char command_; - unsigned char port_high_byte_; - unsigned char port_low_byte_; - asio::ip::address_v4::bytes_type address_; - std::string user_id_; - unsigned char null_byte_; -}; - -class reply -{ -public: - enum status_type - { - request_granted = 0x5a, - request_failed = 0x5b, - request_failed_no_identd = 0x5c, - request_failed_bad_user_id = 0x5d - }; - - reply() - : null_byte_(0), - status_() - { - } - - boost::array<asio::mutable_buffer, 5> buffers() - { - boost::array<asio::mutable_buffer, 5> bufs = - { - { - asio::buffer(&null_byte_, 1), - asio::buffer(&status_, 1), - asio::buffer(&port_high_byte_, 1), - asio::buffer(&port_low_byte_, 1), - asio::buffer(address_) - } - }; - return bufs; - } - - bool success() const - { - return null_byte_ == 0 && status_ == request_granted; - } - - unsigned char status() const - { - return status_; - } - - asio::ip::tcp::endpoint endpoint() const - { - unsigned short port = port_high_byte_; - port = (port << 8) & 0xff00; - port = port | port_low_byte_; - - asio::ip::address_v4 address(address_); - - return asio::ip::tcp::endpoint(address, port); - } - -private: - unsigned char null_byte_; - unsigned char status_; - unsigned char port_high_byte_; - unsigned char port_low_byte_; - asio::ip::address_v4::bytes_type address_; -}; - -} // namespace socks4 - -#endif // SOCKS4_HPP diff --git a/3rdparty/asio/src/examples/cpp03/socks4/sync_client.cpp b/3rdparty/asio/src/examples/cpp03/socks4/sync_client.cpp deleted file mode 100644 index 7b82564ab53..00000000000 --- a/3rdparty/asio/src/examples/cpp03/socks4/sync_client.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// sync_client.cpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <iomanip> -#include <ostream> -#include <string> -#include <asio.hpp> -#include <boost/array.hpp> -#include "socks4.hpp" - -using asio::ip::tcp; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 4) - { - std::cout << "Usage: sync_client <socks4server> <socks4port> <user>\n"; - std::cout << "Examples:\n"; - std::cout << " sync_client 127.0.0.1 1080 chris\n"; - std::cout << " sync_client localhost socks chris\n"; - return 1; - } - - asio::io_context io_context; - - // Get a list of endpoints corresponding to the SOCKS 4 server name. - tcp::resolver resolver(io_context); - tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]); - - // Try each endpoint until we successfully establish a connection to the - // SOCKS 4 server. - tcp::socket socket(io_context); - asio::connect(socket, endpoints); - - // Get an endpoint for the Boost website. This will be passed to the SOCKS - // 4 server. Explicitly specify IPv4 since SOCKS 4 does not support IPv6. - tcp::endpoint http_endpoint = - *resolver.resolve(tcp::v4(), "www.boost.org", "http").begin(); - - // Send the request to the SOCKS 4 server. - socks4::request socks_request( - socks4::request::connect, http_endpoint, argv[3]); - asio::write(socket, socks_request.buffers()); - - // Receive a response from the SOCKS 4 server. - socks4::reply socks_reply; - asio::read(socket, socks_reply.buffers()); - - // Check whether we successfully negotiated with the SOCKS 4 server. - if (!socks_reply.success()) - { - std::cout << "Connection failed.\n"; - std::cout << "status = 0x" << std::hex << socks_reply.status(); - return 1; - } - - // Form the HTTP 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 response. - std::string request = - "GET / HTTP/1.0\r\n" - "Host: www.boost.org\r\n" - "Accept: */*\r\n" - "Connection: close\r\n\r\n"; - - // Send the HTTP request. - asio::write(socket, asio::buffer(request)); - - // Read until EOF, writing data to output as we go. - boost::array<char, 512> response; - asio::error_code error; - while (std::size_t s = socket.read_some( - asio::buffer(response), error)) - std::cout.write(response.data(), s); - if (error != asio::error::eof) - throw asio::system_error(error); - } - catch (std::exception& e) - { - std::cout << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/spawn/.gitignore b/3rdparty/asio/src/examples/cpp03/spawn/.gitignore deleted file mode 100644 index 6b8a121e099..00000000000 --- a/3rdparty/asio/src/examples/cpp03/spawn/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -.deps -.dirstamp -parallel_grep -*.o -*.obj -*.exe -*_server -*_client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/spawn/echo_server.cpp b/3rdparty/asio/src/examples/cpp03/spawn/echo_server.cpp deleted file mode 100644 index 415f6da8f33..00000000000 --- a/3rdparty/asio/src/examples/cpp03/spawn/echo_server.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// echo_server.cpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio/deadline_timer.hpp> -#include <asio/io_context.hpp> -#include <asio/ip/tcp.hpp> -#include <asio/spawn.hpp> -#include <asio/write.hpp> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <iostream> - -using asio::ip::tcp; - -class session : public boost::enable_shared_from_this<session> -{ -public: - explicit session(asio::io_context& io_context) - : strand_(io_context), - socket_(io_context), - timer_(io_context) - { - } - - tcp::socket& socket() - { - return socket_; - } - - void go() - { - asio::spawn(strand_, - boost::bind(&session::echo, - shared_from_this(), _1)); - asio::spawn(strand_, - boost::bind(&session::timeout, - shared_from_this(), _1)); - } - -private: - void echo(asio::yield_context yield) - { - try - { - char data[128]; - for (;;) - { - timer_.expires_from_now(boost::posix_time::seconds(10)); - std::size_t n = socket_.async_read_some(asio::buffer(data), yield); - asio::async_write(socket_, asio::buffer(data, n), yield); - } - } - catch (std::exception& e) - { - socket_.close(); - timer_.cancel(); - } - } - - void timeout(asio::yield_context yield) - { - while (socket_.is_open()) - { - asio::error_code ignored_ec; - timer_.async_wait(yield[ignored_ec]); - if (timer_.expires_from_now() <= boost::posix_time::seconds(0)) - socket_.close(); - } - } - - asio::io_context::strand strand_; - tcp::socket socket_; - asio::deadline_timer timer_; -}; - -void do_accept(asio::io_context& io_context, - unsigned short port, asio::yield_context yield) -{ - tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port)); - - for (;;) - { - asio::error_code ec; - boost::shared_ptr<session> new_session(new session(io_context)); - acceptor.async_accept(new_session->socket(), yield[ec]); - if (!ec) new_session->go(); - } -} - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: echo_server <port>\n"; - return 1; - } - - asio::io_context io_context; - - asio::spawn(io_context, - boost::bind(do_accept, - boost::ref(io_context), atoi(argv[1]), _1)); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/spawn/parallel_grep.cpp b/3rdparty/asio/src/examples/cpp03/spawn/parallel_grep.cpp deleted file mode 100644 index d742f196d78..00000000000 --- a/3rdparty/asio/src/examples/cpp03/spawn/parallel_grep.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// parallel_grep.cpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio/dispatch.hpp> -#include <asio/post.hpp> -#include <asio/spawn.hpp> -#include <asio/strand.hpp> -#include <asio/thread_pool.hpp> -#include <boost/bind.hpp> -#include <fstream> -#include <iostream> -#include <string> - -using asio::dispatch; -using asio::spawn; -using asio::strand; -using asio::thread_pool; -using asio::yield_context; - -void print_match(std::string input_file, std::string line) -{ - std::cout << input_file << ':' << line << std::endl; -} - -void search_file(std::string search_string, std::string input_file, - strand<thread_pool::executor_type> output_strand, yield_context yield) -{ - std::ifstream is(input_file.c_str()); - std::string line; - std::size_t line_num = 0; - while (std::getline(is, line)) - { - // If we find a match, send a message to the output. - if (line.find(search_string) != std::string::npos) - { - dispatch(output_strand, boost::bind(&print_match, input_file, line)); - } - - // Every so often we yield control to another coroutine. - if (++line_num % 10 == 0) - post(yield); - } -} - -int main(int argc, char* argv[]) -{ - try - { - if (argc < 2) - { - std::cerr << "Usage: parallel_grep <string> <files...>\n"; - return 1; - } - - // We use a fixed size pool of threads for reading the input files. The - // number of threads is automatically determined based on the number of - // CPUs available in the system. - thread_pool pool; - - // To prevent the output from being garbled, we use a strand to synchronise - // printing. - strand<thread_pool::executor_type> output_strand(pool.get_executor()); - - // Spawn a new coroutine for each file specified on the command line. - std::string search_string = argv[1]; - for (int argn = 2; argn < argc; ++argn) - { - std::string input_file = argv[argn]; - spawn(pool, boost::bind(&search_file, - search_string, input_file, output_strand, _1)); - } - - // Join the thread pool to wait for all the spawned tasks to complete. - pool.join(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/ssl/.gitignore b/3rdparty/asio/src/examples/cpp03/ssl/.gitignore deleted file mode 100644 index a67811253d9..00000000000 --- a/3rdparty/asio/src/examples/cpp03/ssl/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -server -client -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/ssl/README b/3rdparty/asio/src/examples/cpp03/ssl/README deleted file mode 100644 index 8d94105be5b..00000000000 --- a/3rdparty/asio/src/examples/cpp03/ssl/README +++ /dev/null @@ -1,8 +0,0 @@ -The passphrase for both the CA and server private keys is "test". - - -------------------------------------------------------------------------------- -Copyright (c) 2003-2016 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) diff --git a/3rdparty/asio/src/examples/cpp03/ssl/ca.pem b/3rdparty/asio/src/examples/cpp03/ssl/ca.pem deleted file mode 100644 index 1ee5f2ca43b..00000000000 --- a/3rdparty/asio/src/examples/cpp03/ssl/ca.pem +++ /dev/null @@ -1,49 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDlzCCAn+gAwIBAgIJAMJYU3U6A0IRMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV -BAYTAkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChME -YXNpbzAeFw0xNTExMTgyMjMzNDhaFw0yMDExMTYyMjMzNDhaMDsxCzAJBgNVBAYT -AkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNp -bzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcRJocHdVMdLUJ/pypY -QVSTC0t3IIgjwjazrK3kAaoIMvzPmDFxEXWcDx+nyz8kQ/E38Ir/ef2BCNGci5hu -wkfMSuMoW9l2N4hx3QCcF46tTDEZztFxWAH7QbE2wYMlMgKZSxWimNfq0YjxEEXb -QM0lGPLFh7Xoko29H0F3LKaaQV9u/vop3Hs0h12HeWlY4PiLp7QQTNGqbWcXycA0 -NZ/fyismireyEvPAgo6L8iXuAi7g0TVKVNlrticGGjMcMq6IMvxzEpSMkuMQ5rWj -pZjWOoBjSYBuXdblcBRvXhOr2Ws8jJLMZfehKq9q1reQfoGV6xMnbwmumSXbWRWT -0vkCAwEAAaOBnTCBmjAdBgNVHQ4EFgQUK/Zv/AVtfIeucJw8VEtux1dhI1YwawYD -VR0jBGQwYoAUK/Zv/AVtfIeucJw8VEtux1dhI1ahP6Q9MDsxCzAJBgNVBAYTAkFV -MQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNpb4IJ -AMJYU3U6A0IRMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBABLYXimq -v/HLyIJi7Xn8AJUsICj8LKF/J24nwwiF+ibf7UkoChJURs4nN78bod/lpDVPTEVl -gTBdV/vBJs416sCEFfsGjqB9OBYj4gb0VaJDsQd0+NMvXp0faKv2y9wgScxG9/cg -aM7eRmyfMn1qjb6tpNxVOPpe/nFi8Vx/1orejBRaZr4zF5TkoPepfwLWQeXDUIdE -+QHZ60jZAkR5RXTVU4u3kOKcJs839pmJYyxM4H2VxpR18vy4/YdIVWkREIUM2OgT -5iznIQIIgR56QRGP85uef+I6n0BHzrBk6du69bkQFxrFjLVGlal4bIQqSg4KGWgx -dEdymMWzmMxpO9s= ------END CERTIFICATE----- ------BEGIN RSA PRIVATE KEY----- -MIIEpgIBAAKCAQEAxxEmhwd1Ux0tQn+nKlhBVJMLS3cgiCPCNrOsreQBqggy/M+Y -MXERdZwPH6fLPyRD8Tfwiv95/YEI0ZyLmG7CR8xK4yhb2XY3iHHdAJwXjq1MMRnO -0XFYAftBsTbBgyUyAplLFaKY1+rRiPEQRdtAzSUY8sWHteiSjb0fQXcspppBX27+ -+incezSHXYd5aVjg+IuntBBM0aptZxfJwDQ1n9/KKyaKt7IS88CCjovyJe4CLuDR -NUpU2Wu2JwYaMxwyrogy/HMSlIyS4xDmtaOlmNY6gGNJgG5d1uVwFG9eE6vZazyM -ksxl96Eqr2rWt5B+gZXrEydvCa6ZJdtZFZPS+QIDAQABAoIBAQCOma+SvPoDzvvU -DiPOxqgOEMPfjHfGbm86xl0luBalGfiEd6WbjVanfGKtF4MWOUFec+chez+FJMEP -fufVC0qrKiJfNVMOpYvEd2SMgkSx1VymM8me6WXVDYsSipn2+1cm228ZEYAR9Emj -oqQ4loaGLlP/3RaJbhBF7ruMJvXaZZQ4fZy74Z4tyRaaE1B659ua7Rjne7eNhQE8 -cR7cQDkxsNNN3LTbfLRwEc/gcDXWgLe5JlR/K4ZrdKc3lyivm+Uew3ubKs+fgkyY -kHmuI3RJGIjpnsZW0/So+pHm3b/fo6lmlhTXtNNd+tkkKn2K9ttbXT3Sc13Pc+4w -c4MLyUpdAoGBAOxTtGDpeF6U4s+GPuOCzHCwKQyzfOyCL/UTZv1UJX7Kn1FYycJH -eOjtBRtS661cGkGd1MPfjdX2VV84AmBGDUmRqJ2KfTI1NjLAEJ115ANTpmSTm3lF -UYncgbzl6aflLpjE1mgY+JTJykYeN5jhhO0r2bsdY7S+zaMCSI5NLuznAoGBANej -aMtqLg2qKoq+fUkNBHHLXelR5dBXFnKgSrTj++H4yeW9pYbl8bK3gTF3I5+dSjHW -DdC4+X09iPqY7p8vm8Gq/vgO8Bu+EnKNVr80PJSj7AzFGd6mk/CVrAzoY2XJWbAp -YFwpo1WfHjS5wBfQzBlXY7kWVB7fj32kk14PYmUfAoGBAJXfd7NGHPoOfdCSGGv8 -VV7ZuQ6+/WiYH4XS6iuaI7VHFsZmAn3dCcbeGbD8Y04r7NLUH0yhB7g7YmTihk87 -3c1cPIy8eS1QJbEFsQPK8fFSKWH7YkwEM/O0DesX+5hodaaYnkiiHXNujYLuQuAH -lV87wfcyajsEDjFkj1L/i9TdAoGBAKYfRUQv8HqmdU+doHb+iEYCHb75UMpHzQtR -YTwpxoo3V5Kdnz9lNeYwaF7rIY59ZgMunEYHumw5U6V625nW228/hF0lZOR6cUu+ -hu2WGHWKMvdDgMJ+IcpeA8WN4cUwcN+9gHZ/vUzg4CxOTSYLvLBpGnIkOXnvUGPC -vaTgxTSRAoGBAOHcuZ9hcUrPuVI1HVkjQQLu5mLZ3tz6linEbe/RCdJMK8JrRX4w -ubB7gFclMYGbLlDNAJVYkydJaCy/2NAI3rfsOda+VmDqGx6z4BbSGceHhomyU1Oo -1H7YaXsuzDkzl23HRsyp0pKJpTdghZdbVsGF8vAB8ygK3ehM233neSln ------END RSA PRIVATE KEY----- diff --git a/3rdparty/asio/src/examples/cpp03/ssl/client.cpp b/3rdparty/asio/src/examples/cpp03/ssl/client.cpp deleted file mode 100644 index 02a3ce8b3ca..00000000000 --- a/3rdparty/asio/src/examples/cpp03/ssl/client.cpp +++ /dev/null @@ -1,156 +0,0 @@ -// -// client.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <iostream> -#include <boost/bind.hpp> -#include "asio.hpp" -#include "asio/ssl.hpp" - -enum { max_length = 1024 }; - -class client -{ -public: - client(asio::io_context& io_context, - asio::ssl::context& context, - asio::ip::tcp::resolver::results_type endpoints) - : socket_(io_context, context) - { - socket_.set_verify_mode(asio::ssl::verify_peer); - socket_.set_verify_callback( - boost::bind(&client::verify_certificate, this, _1, _2)); - - asio::async_connect(socket_.lowest_layer(), endpoints, - boost::bind(&client::handle_connect, this, - asio::placeholders::error)); - } - - bool verify_certificate(bool preverified, - asio::ssl::verify_context& ctx) - { - // The verify callback can be used to check whether the certificate that is - // being presented is valid for the peer. For example, RFC 2818 describes - // the steps involved in doing this for HTTPS. Consult the OpenSSL - // documentation for more details. Note that the callback is called once - // for each certificate in the certificate chain, starting from the root - // certificate authority. - - // In this example we will simply print the certificate's subject name. - char subject_name[256]; - X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); - X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256); - std::cout << "Verifying " << subject_name << "\n"; - - return preverified; - } - - void handle_connect(const asio::error_code& error) - { - if (!error) - { - socket_.async_handshake(asio::ssl::stream_base::client, - boost::bind(&client::handle_handshake, this, - asio::placeholders::error)); - } - else - { - std::cout << "Connect failed: " << error.message() << "\n"; - } - } - - void handle_handshake(const asio::error_code& error) - { - if (!error) - { - std::cout << "Enter message: "; - std::cin.getline(request_, max_length); - size_t request_length = strlen(request_); - - asio::async_write(socket_, - asio::buffer(request_, request_length), - boost::bind(&client::handle_write, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - std::cout << "Handshake failed: " << error.message() << "\n"; - } - } - - void handle_write(const asio::error_code& error, - size_t bytes_transferred) - { - if (!error) - { - asio::async_read(socket_, - asio::buffer(reply_, bytes_transferred), - boost::bind(&client::handle_read, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - std::cout << "Write failed: " << error.message() << "\n"; - } - } - - void handle_read(const asio::error_code& error, - size_t bytes_transferred) - { - if (!error) - { - std::cout << "Reply: "; - std::cout.write(reply_, bytes_transferred); - std::cout << "\n"; - } - else - { - std::cout << "Read failed: " << error.message() << "\n"; - } - } - -private: - asio::ssl::stream<asio::ip::tcp::socket> socket_; - char request_[max_length]; - char reply_[max_length]; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: client <host> <port>\n"; - return 1; - } - - asio::io_context io_context; - - asio::ip::tcp::resolver resolver(io_context); - asio::ip::tcp::resolver::results_type endpoints = - resolver.resolve(argv[1], argv[2]); - - asio::ssl::context ctx(asio::ssl::context::sslv23); - ctx.load_verify_file("ca.pem"); - - client c(io_context, ctx, endpoints); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/ssl/dh2048.pem b/3rdparty/asio/src/examples/cpp03/ssl/dh2048.pem deleted file mode 100644 index 07250cca62f..00000000000 --- a/3rdparty/asio/src/examples/cpp03/ssl/dh2048.pem +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN DH PARAMETERS----- -MIIBCAKCAQEAyNnxZSYc6J89mDNnqOH8bnwBiAJxcaUS3PkIEcwW8D9o2BlNq6EO -XKMIbdfwPFZi80GMpNu3YP2A2B42sAHmb7w7ZA92QDv3JjqzR0QuS/CkMv4CEjha -QBFwBDDWnnHBSj4w/t54ii0SH34mWcjBItI2eMtnM9J6fnvNiWqJxdt4iA4mZjZD -qZTjIRyjgKAevzkqAlBqQRoVUUgu+9Cf29wXjVl3bE+0VU5CdFeyT+Y9yunz88mq -rGyx1uPt+zbIfxuNLH+coY67y1ht7iZEL5WLd3wGCycRT+lYy2AL/rxGBPxStFIT -2bOkQao6sAfb4UdGEUlwHUXZrAV51oM30wIBAg== ------END DH PARAMETERS----- diff --git a/3rdparty/asio/src/examples/cpp03/ssl/server.cpp b/3rdparty/asio/src/examples/cpp03/ssl/server.cpp deleted file mode 100644 index ad3d73a2c44..00000000000 --- a/3rdparty/asio/src/examples/cpp03/ssl/server.cpp +++ /dev/null @@ -1,170 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <cstdlib> -#include <iostream> -#include <boost/bind.hpp> -#include "asio.hpp" -#include "asio/ssl.hpp" - -typedef asio::ssl::stream<asio::ip::tcp::socket> ssl_socket; - -class session -{ -public: - session(asio::io_context& io_context, - asio::ssl::context& context) - : socket_(io_context, context) - { - } - - ssl_socket::lowest_layer_type& socket() - { - return socket_.lowest_layer(); - } - - void start() - { - socket_.async_handshake(asio::ssl::stream_base::server, - boost::bind(&session::handle_handshake, this, - asio::placeholders::error)); - } - - void handle_handshake(const asio::error_code& error) - { - if (!error) - { - socket_.async_read_some(asio::buffer(data_, max_length), - boost::bind(&session::handle_read, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - delete this; - } - } - - void handle_read(const asio::error_code& error, - size_t bytes_transferred) - { - if (!error) - { - asio::async_write(socket_, - asio::buffer(data_, bytes_transferred), - boost::bind(&session::handle_write, this, - asio::placeholders::error)); - } - else - { - delete this; - } - } - - void handle_write(const asio::error_code& error) - { - if (!error) - { - socket_.async_read_some(asio::buffer(data_, max_length), - boost::bind(&session::handle_read, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - else - { - delete this; - } - } - -private: - ssl_socket socket_; - enum { max_length = 1024 }; - char data_[max_length]; -}; - -class server -{ -public: - server(asio::io_context& io_context, unsigned short port) - : io_context_(io_context), - acceptor_(io_context, - asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)), - context_(asio::ssl::context::sslv23) - { - context_.set_options( - asio::ssl::context::default_workarounds - | asio::ssl::context::no_sslv2 - | asio::ssl::context::single_dh_use); - context_.set_password_callback(boost::bind(&server::get_password, this)); - context_.use_certificate_chain_file("server.pem"); - context_.use_private_key_file("server.pem", asio::ssl::context::pem); - context_.use_tmp_dh_file("dh2048.pem"); - - start_accept(); - } - - std::string get_password() const - { - return "test"; - } - - void start_accept() - { - session* new_session = new session(io_context_, context_); - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, - asio::placeholders::error)); - } - - void handle_accept(session* new_session, - const asio::error_code& error) - { - if (!error) - { - new_session->start(); - } - else - { - delete new_session; - } - - start_accept(); - } - -private: - asio::io_context& io_context_; - asio::ip::tcp::acceptor acceptor_; - asio::ssl::context context_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: server <port>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/ssl/server.pem b/3rdparty/asio/src/examples/cpp03/ssl/server.pem deleted file mode 100644 index 37ea6e26715..00000000000 --- a/3rdparty/asio/src/examples/cpp03/ssl/server.pem +++ /dev/null @@ -1,71 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDAzCCAesCCQD9QcRiWk0y9TANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJB -VTEMMAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxDTALBgNVBAoTBGFzaW8w -HhcNMTUxMTE4MjIzNzMxWhcNMjAxMTE2MjIzNzMxWjBMMQswCQYDVQQGEwJBVTEM -MAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxDTALBgNVBAoTBGFzaW8xDzAN -BgNVBAsTBnNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0 -+NXSklsGJR7HYHP/H4V5+KpYrmFKva/K7iiqi+XyWEjGnj+/iImJW26phhg9GouN -JJxdrP7/0LwpMsEC/9v09dMNAEewtYhPgD4kiUH/E/79wVmayMZZZGrpF9Rw+wWv -q58y3L1wKge3qilX6slVDdNhqU3vBiMKEJfsjE4PKcEVjPCjVJG2562eHK9FxyjQ -DykyH61lQKBQOiElilPQKzAO7U36yTvs+chWuUfK47B8EC+PJ5KcLEppli4ljlwE -w01HnGxwvjDLobKm2jL6CWi3aYGWudyTsNAd7YC5C7psktBypQLBcfp7uUrrR5Bb -PEjFHJUWIlyoYvm2OjMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAtceVW6tixFsB -ZRhjL5aRCcbx2iMwEXd54lcP6BWe1qOcDPHoSYI1zvvGzohbEvBfqUv78S9MtzaT -gMe5rIU9M1ZM09PyaM6ZutGpKHE8L4qcOslTt41GQFsSqPFdcbgSV20MvBzjGayR -AI/WV0avW3oasdetJPZCR7bRbCbMbWTgclUfv5F25ENcR+BhNuilfL15owL0s4sS -Wb4jOOHhXV9iXeS2dH0snFqv4BmQ9ZoA7zbM9lG3EU5DuxHESYkCnzJyEqqY3vWv -PFRViCxLp5LQLmkTQ3dglVQA4x6ZaonaewdPtdhjkLUuIqDvQx5+kIaOELbSws+c -bREYlnGrFw== ------END CERTIFICATE----- ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-256-CBC,D459676347D389E9135496D8AAFA7953 - -wbrjxr9NHur8kgxDsgXOY9qFGKpONIQLxkuahUrDD/H+s/l7ugsLWOPsOXbjNL/7 -QYUBAx85HKm9D8BQ5g78Y82qfArap3/3IIuysDfQDh4fQodhVtmGTFiCOvudlGEp -lq1niQRLThlxeRoFphH8KKiOTO9a/d8tdL7zRmiFwnVnhK4014mgVmgcSefA1AF5 -RbJAeMclUKddG6ltQK00ptg84CDXiMWQXFBGGmQ1av2lyFzC+xLP+qDqZAYTM9lZ -NFRo2oEZP1ozfOVNSbXTanJgZ0DSSmhGE1PcVrHSeE/v+k1kPh3oVKi9GV51kIDC -Zd9f/XltuDOzy1Ybn6gRy4nzNpzcwjSCIHEdSD5nxU5JfHfQ3OtnsEab7qf989iP -s2LbCSp5uGTMvfesMIkixIZAQp2FeahZTAgU2Vx+wi5Kks68rOqeywEfzACL/Um5 -7XZu8gDs4MgRRWnxK1BbJDPifICLvSJZvgB9FKX/hk4FHFF+MtcrkalehCuLooDV -3rfHNvRSbg7J97XQ3QC+k9ZDaumpy6n+LhaVv7BIJRBnBBtZ5Eg3DmPg6flqaHAU -Y/8d82wb/pCmbvR3B1/Ebgs84DPJ+uZnY9M5Iwx19oqlVSR2ts/Tx619LGAm+BiQ -7YDoC4CFmpAA8Uw0xnUbNgx94NdNmlnLeLtS50b0XlWpHKbVzmVbNYEjY6NHMlLt -aqxWHTYTa7g/c1bg2/nxF1Lbfu5VSTROGBUuer1c3yzVuyBrjcX92Jp4BJH78qOp -N6lY6MnH4HYRXHjzlt/S0ZzO0faPPe18Q8SWvnDVuE3fYzzL772B56d2t8eodc+/ -t6M3qJ60eXdsmgYOaPRLRUovN2xT2UUr0+biuguHyqfaVfcEU/adw+b9oUVE+5Nw -nZHI5qhPnhLxChyZqbBl68zMUyKlfff4OyLvRGpfcHwBw6DTGjduB+DDsqqkcIB9 -2VL6nps7ZVCwMPI18siUd6cttEOf6ZXrVqHg9wfDvJOlh2NNKNLxSAFubHc90Jlj -KejrWenXo2w6YkSUeTV4t4cWu7U8rXIkTJXDl1S6NO8DWqNDo5KjgJ2SK5NlSOJ7 -jgECn390ooneJOxxytPVQO2xppXQZZS65RHrvhB+ss5xUknly9q+ICyt6xTR9nqA -PKkeSE6qVY0J4JgFXpkgQxgwMnjSED3LKr3jlz28pr5cC6tsc5SSlekHjT2fcSrX -uccaVahaJRigf+q+4XzmJtdwbZU+YWGZRVMlQLA5yzPHQHDYkPpOeYU4WReND8S4 -TZRkPHaxOZ2lKQwJB93V8Vbt2MvwRy392452a33S4TcQLaWzoOljXjmZjrp2rvRz -prBaNe8LnO4V8Oliv+H+E0UWiWFDuI+HBy4X4O9plsbw/gk64Phl9qLiBwaX/AIR -66FXvC/czABo9oSt2jekcMtJofYr8Gr2bsJlt5ZX+GEOxz4jMv7xvz5/L3W7jVav -pHGIv4xfN9FrXzL47O7UuUF9xZg4Rp/fxwpgEDNZmX/3DnP0ewZQUcgUX0pdqNGQ -YVqJXcRF7KqG2NSQFuwPESZQnxU0WzSgRyUae7xg1WKfSuN8NVAzKhOgeqlD2IAo ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIDlzCCAn+gAwIBAgIJAMJYU3U6A0IRMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV -BAYTAkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChME -YXNpbzAeFw0xNTExMTgyMjMzNDhaFw0yMDExMTYyMjMzNDhaMDsxCzAJBgNVBAYT -AkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNp -bzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcRJocHdVMdLUJ/pypY -QVSTC0t3IIgjwjazrK3kAaoIMvzPmDFxEXWcDx+nyz8kQ/E38Ir/ef2BCNGci5hu -wkfMSuMoW9l2N4hx3QCcF46tTDEZztFxWAH7QbE2wYMlMgKZSxWimNfq0YjxEEXb -QM0lGPLFh7Xoko29H0F3LKaaQV9u/vop3Hs0h12HeWlY4PiLp7QQTNGqbWcXycA0 -NZ/fyismireyEvPAgo6L8iXuAi7g0TVKVNlrticGGjMcMq6IMvxzEpSMkuMQ5rWj -pZjWOoBjSYBuXdblcBRvXhOr2Ws8jJLMZfehKq9q1reQfoGV6xMnbwmumSXbWRWT -0vkCAwEAAaOBnTCBmjAdBgNVHQ4EFgQUK/Zv/AVtfIeucJw8VEtux1dhI1YwawYD -VR0jBGQwYoAUK/Zv/AVtfIeucJw8VEtux1dhI1ahP6Q9MDsxCzAJBgNVBAYTAkFV -MQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNpb4IJ -AMJYU3U6A0IRMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBABLYXimq -v/HLyIJi7Xn8AJUsICj8LKF/J24nwwiF+ibf7UkoChJURs4nN78bod/lpDVPTEVl -gTBdV/vBJs416sCEFfsGjqB9OBYj4gb0VaJDsQd0+NMvXp0faKv2y9wgScxG9/cg -aM7eRmyfMn1qjb6tpNxVOPpe/nFi8Vx/1orejBRaZr4zF5TkoPepfwLWQeXDUIdE -+QHZ60jZAkR5RXTVU4u3kOKcJs839pmJYyxM4H2VxpR18vy4/YdIVWkREIUM2OgT -5iznIQIIgR56QRGP85uef+I6n0BHzrBk6du69bkQFxrFjLVGlal4bIQqSg4KGWgx -dEdymMWzmMxpO9s= ------END CERTIFICATE----- diff --git a/3rdparty/asio/src/examples/cpp03/timeouts/.gitignore b/3rdparty/asio/src/examples/cpp03/timeouts/.gitignore deleted file mode 100644 index dda7f39c3c2..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timeouts/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*_client -server -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/timeouts/async_tcp_client.cpp b/3rdparty/asio/src/examples/cpp03/timeouts/async_tcp_client.cpp deleted file mode 100644 index 98b90e9a1b3..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timeouts/async_tcp_client.cpp +++ /dev/null @@ -1,308 +0,0 @@ -// -// async_tcp_client.cpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "asio/deadline_timer.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/tcp.hpp" -#include "asio/read_until.hpp" -#include "asio/streambuf.hpp" -#include "asio/write.hpp" -#include <boost/bind.hpp> -#include <iostream> - -using asio::deadline_timer; -using asio::ip::tcp; - -// -// This class manages socket timeouts by applying the concept of a deadline. -// Some asynchronous operations are given deadlines by which they must complete. -// Deadlines are enforced by an "actor" that persists for the lifetime of the -// client object: -// -// +----------------+ -// | | -// | check_deadline |<---+ -// | | | -// +----------------+ | async_wait() -// | | -// +---------+ -// -// If the deadline actor determines that the deadline has expired, the socket -// is closed and any outstanding operations are consequently cancelled. -// -// Connection establishment involves trying each endpoint in turn until a -// connection is successful, or the available endpoints are exhausted. If the -// deadline actor closes the socket, the connect actor is woken up and moves to -// the next endpoint. -// -// +---------------+ -// | | -// | start_connect |<---+ -// | | | -// +---------------+ | -// | | -// async_- | +----------------+ -// connect() | | | -// +--->| handle_connect | -// | | -// +----------------+ -// : -// Once a connection is : -// made, the connect : -// actor forks in two - : -// : -// an actor for reading : and an actor for -// inbound messages: : sending heartbeats: -// : -// +------------+ : +-------------+ -// | |<- - - - -+- - - - ->| | -// | start_read | | start_write |<---+ -// | |<---+ | | | -// +------------+ | +-------------+ | async_wait() -// | | | | -// async_- | +-------------+ async_- | +--------------+ -// read_- | | | write() | | | -// until() +--->| handle_read | +--->| handle_write | -// | | | | -// +-------------+ +--------------+ -// -// The input actor reads messages from the socket, where messages are delimited -// by the newline character. The deadline for a complete message is 30 seconds. -// -// The heartbeat actor sends a heartbeat (a message that consists of a single -// newline character) every 10 seconds. In this example, no deadline is applied -// message sending. -// -class client -{ -public: - client(asio::io_context& io_context) - : stopped_(false), - socket_(io_context), - deadline_(io_context), - heartbeat_timer_(io_context) - { - } - - // Called by the user of the client class to initiate the connection process. - // The endpoints will have been obtained using a tcp::resolver. - void start(tcp::resolver::results_type endpoints) - { - // Start the connect actor. - endpoints_ = endpoints; - start_connect(endpoints_.begin()); - - // Start the deadline actor. You will note that we're not setting any - // particular deadline here. Instead, the connect and input actors will - // update the deadline prior to each asynchronous operation. - deadline_.async_wait(boost::bind(&client::check_deadline, this)); - } - - // This function terminates all the actors to shut down the connection. It - // may be called by the user of the client class, or by the class itself in - // response to graceful termination or an unrecoverable error. - void stop() - { - stopped_ = true; - asio::error_code ignored_ec; - socket_.close(ignored_ec); - deadline_.cancel(); - heartbeat_timer_.cancel(); - } - -private: - void start_connect(tcp::resolver::results_type::iterator endpoint_iter) - { - if (endpoint_iter != endpoints_.end()) - { - std::cout << "Trying " << endpoint_iter->endpoint() << "...\n"; - - // Set a deadline for the connect operation. - deadline_.expires_from_now(boost::posix_time::seconds(60)); - - // Start the asynchronous connect operation. - socket_.async_connect(endpoint_iter->endpoint(), - boost::bind(&client::handle_connect, - this, _1, endpoint_iter)); - } - else - { - // There are no more endpoints to try. Shut down the client. - stop(); - } - } - - void handle_connect(const asio::error_code& ec, - tcp::resolver::results_type::iterator endpoint_iter) - { - if (stopped_) - return; - - // The async_connect() function automatically opens the socket at the start - // of the asynchronous operation. If the socket is closed at this time then - // the timeout handler must have run first. - if (!socket_.is_open()) - { - std::cout << "Connect timed out\n"; - - // Try the next available endpoint. - start_connect(++endpoint_iter); - } - - // Check if the connect operation failed before the deadline expired. - else if (ec) - { - std::cout << "Connect error: " << ec.message() << "\n"; - - // We need to close the socket used in the previous connection attempt - // before starting a new one. - socket_.close(); - - // Try the next available endpoint. - start_connect(++endpoint_iter); - } - - // Otherwise we have successfully established a connection. - else - { - std::cout << "Connected to " << endpoint_iter->endpoint() << "\n"; - - // Start the input actor. - start_read(); - - // Start the heartbeat actor. - start_write(); - } - } - - void start_read() - { - // Set a deadline for the read operation. - deadline_.expires_from_now(boost::posix_time::seconds(30)); - - // Start an asynchronous operation to read a newline-delimited message. - asio::async_read_until(socket_, input_buffer_, '\n', - boost::bind(&client::handle_read, this, _1)); - } - - void handle_read(const asio::error_code& ec) - { - if (stopped_) - return; - - if (!ec) - { - // Extract the newline-delimited message from the buffer. - std::string line; - std::istream is(&input_buffer_); - std::getline(is, line); - - // Empty messages are heartbeats and so ignored. - if (!line.empty()) - { - std::cout << "Received: " << line << "\n"; - } - - start_read(); - } - else - { - std::cout << "Error on receive: " << ec.message() << "\n"; - - stop(); - } - } - - void start_write() - { - if (stopped_) - return; - - // Start an asynchronous operation to send a heartbeat message. - asio::async_write(socket_, asio::buffer("\n", 1), - boost::bind(&client::handle_write, this, _1)); - } - - void handle_write(const asio::error_code& ec) - { - if (stopped_) - return; - - if (!ec) - { - // Wait 10 seconds before sending the next heartbeat. - heartbeat_timer_.expires_from_now(boost::posix_time::seconds(10)); - heartbeat_timer_.async_wait(boost::bind(&client::start_write, this)); - } - else - { - std::cout << "Error on heartbeat: " << ec.message() << "\n"; - - stop(); - } - } - - void check_deadline() - { - if (stopped_) - return; - - // Check whether the deadline has passed. We compare the deadline against - // the current time since a new asynchronous operation may have moved the - // deadline before this actor had a chance to run. - if (deadline_.expires_at() <= deadline_timer::traits_type::now()) - { - // The deadline has passed. The socket is closed so that any outstanding - // asynchronous operations are cancelled. - socket_.close(); - - // There is no longer an active deadline. The expiry is set to positive - // infinity so that the actor takes no action until a new deadline is set. - deadline_.expires_at(boost::posix_time::pos_infin); - } - - // Put the actor back to sleep. - deadline_.async_wait(boost::bind(&client::check_deadline, this)); - } - -private: - bool stopped_; - tcp::resolver::results_type endpoints_; - tcp::socket socket_; - asio::streambuf input_buffer_; - deadline_timer deadline_; - deadline_timer heartbeat_timer_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: client <host> <port>\n"; - return 1; - } - - asio::io_context io_context; - tcp::resolver r(io_context); - client c(io_context); - - c.start(r.resolve(argv[1], argv[2])); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/timeouts/blocking_tcp_client.cpp b/3rdparty/asio/src/examples/cpp03/timeouts/blocking_tcp_client.cpp deleted file mode 100644 index 69d467af1bb..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timeouts/blocking_tcp_client.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// -// blocking_tcp_client.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "asio/connect.hpp" -#include "asio/deadline_timer.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/tcp.hpp" -#include "asio/read_until.hpp" -#include "asio/streambuf.hpp" -#include "asio/system_error.hpp" -#include "asio/write.hpp" -#include "asio/thread.hpp" -#include <cstdlib> -#include <iostream> -#include <string> -#include <boost/lambda/bind.hpp> -#include <boost/lambda/lambda.hpp> - -using asio::deadline_timer; -using asio::ip::tcp; -using boost::lambda::bind; -using boost::lambda::var; -using boost::lambda::_1; - -//---------------------------------------------------------------------- - -// -// This class manages socket timeouts by applying the concept of a deadline. -// Each asynchronous operation is given a deadline by which it must complete. -// Deadlines are enforced by an "actor" that persists for the lifetime of the -// client object: -// -// +----------------+ -// | | -// | check_deadline |<---+ -// | | | -// +----------------+ | async_wait() -// | | -// +---------+ -// -// If the actor determines that the deadline has expired, the socket is closed -// and any outstanding operations are consequently cancelled. The socket -// operations themselves use boost::lambda function objects as completion -// handlers. For a given socket operation, the client object runs the -// io_context to block thread execution until the actor completes. -// -class client -{ -public: - client() - : socket_(io_context_), - deadline_(io_context_) - { - // No deadline is required until the first socket operation is started. We - // set the deadline to positive infinity so that the actor takes no action - // until a specific deadline is set. - deadline_.expires_at(boost::posix_time::pos_infin); - - // Start the persistent actor that checks for deadline expiry. - check_deadline(); - } - - void connect(const std::string& host, const std::string& service, - boost::posix_time::time_duration timeout) - { - // Resolve the host name and service to a list of endpoints. - tcp::resolver::results_type endpoints = - tcp::resolver(io_context_).resolve(host, service); - - // Set a deadline for the asynchronous operation. As a host name may - // resolve to multiple endpoints, this function uses the composed operation - // async_connect. The deadline applies to the entire operation, rather than - // individual connection attempts. - deadline_.expires_from_now(timeout); - - // Set up the variable that receives the result of the asynchronous - // operation. The error code is set to would_block to signal that the - // operation is incomplete. Asio guarantees that its asynchronous - // operations will never fail with would_block, so any other value in - // ec indicates completion. - asio::error_code ec = asio::error::would_block; - - // Start the asynchronous operation itself. The boost::lambda function - // object is used as a callback and will update the ec variable when the - // operation completes. The blocking_udp_client.cpp example shows how you - // can use boost::bind rather than boost::lambda. - asio::async_connect(socket_, endpoints, var(ec) = _1); - - // Block until the asynchronous operation has completed. - do io_context_.run_one(); while (ec == asio::error::would_block); - - // Determine whether a connection was successfully established. The - // deadline actor may have had a chance to run and close our socket, even - // though the connect operation notionally succeeded. Therefore we must - // check whether the socket is still open before deciding if we succeeded - // or failed. - if (ec || !socket_.is_open()) - throw asio::system_error( - ec ? ec : asio::error::operation_aborted); - } - - std::string read_line(boost::posix_time::time_duration timeout) - { - // Set a deadline for the asynchronous operation. Since this function uses - // a composed operation (async_read_until), the deadline applies to the - // entire operation, rather than individual reads from the socket. - deadline_.expires_from_now(timeout); - - // Set up the variable that receives the result of the asynchronous - // operation. The error code is set to would_block to signal that the - // operation is incomplete. Asio guarantees that its asynchronous - // operations will never fail with would_block, so any other value in - // ec indicates completion. - asio::error_code ec = asio::error::would_block; - - // Start the asynchronous operation itself. The boost::lambda function - // object is used as a callback and will update the ec variable when the - // operation completes. The blocking_udp_client.cpp example shows how you - // can use boost::bind rather than boost::lambda. - asio::async_read_until(socket_, input_buffer_, '\n', var(ec) = _1); - - // Block until the asynchronous operation has completed. - do io_context_.run_one(); while (ec == asio::error::would_block); - - if (ec) - throw asio::system_error(ec); - - std::string line; - std::istream is(&input_buffer_); - std::getline(is, line); - return line; - } - - void write_line(const std::string& line, - boost::posix_time::time_duration timeout) - { - std::string data = line + "\n"; - - // Set a deadline for the asynchronous operation. Since this function uses - // a composed operation (async_write), the deadline applies to the entire - // operation, rather than individual writes to the socket. - deadline_.expires_from_now(timeout); - - // Set up the variable that receives the result of the asynchronous - // operation. The error code is set to would_block to signal that the - // operation is incomplete. Asio guarantees that its asynchronous - // operations will never fail with would_block, so any other value in - // ec indicates completion. - asio::error_code ec = asio::error::would_block; - - // Start the asynchronous operation itself. The boost::lambda function - // object is used as a callback and will update the ec variable when the - // operation completes. The blocking_udp_client.cpp example shows how you - // can use boost::bind rather than boost::lambda. - asio::async_write(socket_, asio::buffer(data), var(ec) = _1); - - // Block until the asynchronous operation has completed. - do io_context_.run_one(); while (ec == asio::error::would_block); - - if (ec) - throw asio::system_error(ec); - } - -private: - void check_deadline() - { - // Check whether the deadline has passed. We compare the deadline against - // the current time since a new asynchronous operation may have moved the - // deadline before this actor had a chance to run. - if (deadline_.expires_at() <= deadline_timer::traits_type::now()) - { - // The deadline has passed. The socket is closed so that any outstanding - // asynchronous operations are cancelled. This allows the blocked - // connect(), read_line() or write_line() functions to return. - asio::error_code ignored_ec; - socket_.close(ignored_ec); - - // There is no longer an active deadline. The expiry is set to positive - // infinity so that the actor takes no action until a new deadline is set. - deadline_.expires_at(boost::posix_time::pos_infin); - } - - // Put the actor back to sleep. - deadline_.async_wait(bind(&client::check_deadline, this)); - } - - asio::io_context io_context_; - tcp::socket socket_; - deadline_timer deadline_; - asio::streambuf input_buffer_; -}; - -//---------------------------------------------------------------------- - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 4) - { - std::cerr << "Usage: blocking_tcp <host> <port> <message>\n"; - return 1; - } - - client c; - c.connect(argv[1], argv[2], boost::posix_time::seconds(10)); - - boost::posix_time::ptime time_sent = - boost::posix_time::microsec_clock::universal_time(); - - c.write_line(argv[3], boost::posix_time::seconds(10)); - - for (;;) - { - std::string line = c.read_line(boost::posix_time::seconds(10)); - - // Keep going until we get back the line that was sent. - if (line == argv[3]) - break; - } - - boost::posix_time::ptime time_received = - boost::posix_time::microsec_clock::universal_time(); - - std::cout << "Round trip time: "; - std::cout << (time_received - time_sent).total_microseconds(); - std::cout << " microseconds\n"; - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/timeouts/blocking_udp_client.cpp b/3rdparty/asio/src/examples/cpp03/timeouts/blocking_udp_client.cpp deleted file mode 100644 index fd2da7640b8..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timeouts/blocking_udp_client.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// -// blocking_udp_client.cpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 "asio/deadline_timer.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/udp.hpp" -#include <cstdlib> -#include <boost/bind.hpp> -#include <boost/date_time/posix_time/posix_time_types.hpp> -#include <iostream> - -using asio::deadline_timer; -using asio::ip::udp; - -//---------------------------------------------------------------------- - -// -// This class manages socket timeouts by applying the concept of a deadline. -// Each asynchronous operation is given a deadline by which it must complete. -// Deadlines are enforced by an "actor" that persists for the lifetime of the -// client object: -// -// +----------------+ -// | | -// | check_deadline |<---+ -// | | | -// +----------------+ | async_wait() -// | | -// +---------+ -// -// If the actor determines that the deadline has expired, any outstanding -// socket operations are cancelled. The socket operations themselves are -// implemented as transient actors: -// -// +---------------+ -// | | -// | receive | -// | | -// +---------------+ -// | -// async_- | +----------------+ -// receive() | | | -// +--->| handle_receive | -// | | -// +----------------+ -// -// The client object runs the io_context to block thread execution until the -// actor completes. -// -class client -{ -public: - client(const udp::endpoint& listen_endpoint) - : socket_(io_context_, listen_endpoint), - deadline_(io_context_) - { - // No deadline is required until the first socket operation is started. We - // set the deadline to positive infinity so that the actor takes no action - // until a specific deadline is set. - deadline_.expires_at(boost::posix_time::pos_infin); - - // Start the persistent actor that checks for deadline expiry. - check_deadline(); - } - - std::size_t receive(const asio::mutable_buffer& buffer, - boost::posix_time::time_duration timeout, asio::error_code& ec) - { - // Set a deadline for the asynchronous operation. - deadline_.expires_from_now(timeout); - - // Set up the variables that receive the result of the asynchronous - // operation. The error code is set to would_block to signal that the - // operation is incomplete. Asio guarantees that its asynchronous - // operations will never fail with would_block, so any other value in - // ec indicates completion. - ec = asio::error::would_block; - std::size_t length = 0; - - // Start the asynchronous operation itself. The handle_receive function - // used as a callback will update the ec and length variables. - socket_.async_receive(asio::buffer(buffer), - boost::bind(&client::handle_receive, _1, _2, &ec, &length)); - - // Block until the asynchronous operation has completed. - do io_context_.run_one(); while (ec == asio::error::would_block); - - return length; - } - -private: - void check_deadline() - { - // Check whether the deadline has passed. We compare the deadline against - // the current time since a new asynchronous operation may have moved the - // deadline before this actor had a chance to run. - if (deadline_.expires_at() <= deadline_timer::traits_type::now()) - { - // The deadline has passed. The outstanding asynchronous operation needs - // to be cancelled so that the blocked receive() function will return. - // - // Please note that cancel() has portability issues on some versions of - // Microsoft Windows, and it may be necessary to use close() instead. - // Consult the documentation for cancel() for further information. - socket_.cancel(); - - // There is no longer an active deadline. The expiry is set to positive - // infinity so that the actor takes no action until a new deadline is set. - deadline_.expires_at(boost::posix_time::pos_infin); - } - - // Put the actor back to sleep. - deadline_.async_wait(boost::bind(&client::check_deadline, this)); - } - - static void handle_receive( - const asio::error_code& ec, std::size_t length, - asio::error_code* out_ec, std::size_t* out_length) - { - *out_ec = ec; - *out_length = length; - } - -private: - asio::io_context io_context_; - udp::socket socket_; - deadline_timer deadline_; -}; - -//---------------------------------------------------------------------- - -int main(int argc, char* argv[]) -{ - try - { - using namespace std; // For atoi. - - if (argc != 3) - { - std::cerr << "Usage: blocking_udp_timeout <listen_addr> <listen_port>\n"; - return 1; - } - - udp::endpoint listen_endpoint( - asio::ip::make_address(argv[1]), - std::atoi(argv[2])); - - client c(listen_endpoint); - - for (;;) - { - char data[1024]; - asio::error_code ec; - std::size_t n = c.receive(asio::buffer(data), - boost::posix_time::seconds(10), ec); - - if (ec) - { - std::cout << "Receive error: " << ec.message() << "\n"; - } - else - { - std::cout << "Received: "; - std::cout.write(data, n); - std::cout << "\n"; - } - } - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/timeouts/server.cpp b/3rdparty/asio/src/examples/cpp03/timeouts/server.cpp deleted file mode 100644 index 212cd90d820..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timeouts/server.cpp +++ /dev/null @@ -1,427 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <algorithm> -#include <cstdlib> -#include <deque> -#include <iostream> -#include <set> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include "asio/deadline_timer.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/tcp.hpp" -#include "asio/ip/udp.hpp" -#include "asio/read_until.hpp" -#include "asio/streambuf.hpp" -#include "asio/write.hpp" - -using asio::deadline_timer; -using asio::ip::tcp; -using asio::ip::udp; - -//---------------------------------------------------------------------- - -class subscriber -{ -public: - virtual ~subscriber() {} - virtual void deliver(const std::string& msg) = 0; -}; - -typedef boost::shared_ptr<subscriber> subscriber_ptr; - -//---------------------------------------------------------------------- - -class channel -{ -public: - void join(subscriber_ptr subscriber) - { - subscribers_.insert(subscriber); - } - - void leave(subscriber_ptr subscriber) - { - subscribers_.erase(subscriber); - } - - void deliver(const std::string& msg) - { - std::for_each(subscribers_.begin(), subscribers_.end(), - boost::bind(&subscriber::deliver, _1, boost::ref(msg))); - } - -private: - std::set<subscriber_ptr> subscribers_; -}; - -//---------------------------------------------------------------------- - -// -// This class manages socket timeouts by applying the concept of a deadline. -// Some asynchronous operations are given deadlines by which they must complete. -// Deadlines are enforced by two "actors" that persist for the lifetime of the -// session object, one for input and one for output: -// -// +----------------+ +----------------+ -// | | | | -// | check_deadline |<---+ | check_deadline |<---+ -// | | | async_wait() | | | async_wait() -// +----------------+ | on input +----------------+ | on output -// | | deadline | | deadline -// +---------+ +---------+ -// -// If either deadline actor determines that the corresponding deadline has -// expired, the socket is closed and any outstanding operations are cancelled. -// -// The input actor reads messages from the socket, where messages are delimited -// by the newline character: -// -// +------------+ -// | | -// | start_read |<---+ -// | | | -// +------------+ | -// | | -// async_- | +-------------+ -// read_- | | | -// until() +--->| handle_read | -// | | -// +-------------+ -// -// The deadline for receiving a complete message is 30 seconds. If a non-empty -// message is received, it is delivered to all subscribers. If a heartbeat (a -// message that consists of a single newline character) is received, a heartbeat -// is enqueued for the client, provided there are no other messages waiting to -// be sent. -// -// The output actor is responsible for sending messages to the client: -// -// +--------------+ -// | |<---------------------+ -// | await_output | | -// | |<---+ | -// +--------------+ | | -// | | | async_wait() | -// | +--------+ | -// V | -// +-------------+ +--------------+ -// | | async_write() | | -// | start_write |-------------->| handle_write | -// | | | | -// +-------------+ +--------------+ -// -// The output actor first waits for an output message to be enqueued. It does -// this by using a deadline_timer as an asynchronous condition variable. The -// deadline_timer will be signalled whenever the output queue is non-empty. -// -// Once a message is available, it is sent to the client. The deadline for -// sending a complete message is 30 seconds. After the message is successfully -// sent, the output actor again waits for the output queue to become non-empty. -// -class tcp_session - : public subscriber, - public boost::enable_shared_from_this<tcp_session> -{ -public: - tcp_session(asio::io_context& io_context, channel& ch) - : channel_(ch), - socket_(io_context), - input_deadline_(io_context), - non_empty_output_queue_(io_context), - output_deadline_(io_context) - { - input_deadline_.expires_at(boost::posix_time::pos_infin); - output_deadline_.expires_at(boost::posix_time::pos_infin); - - // The non_empty_output_queue_ deadline_timer is set to pos_infin whenever - // the output queue is empty. This ensures that the output actor stays - // asleep until a message is put into the queue. - non_empty_output_queue_.expires_at(boost::posix_time::pos_infin); - } - - tcp::socket& socket() - { - return socket_; - } - - // Called by the server object to initiate the four actors. - void start() - { - channel_.join(shared_from_this()); - - start_read(); - - input_deadline_.async_wait( - boost::bind(&tcp_session::check_deadline, - shared_from_this(), &input_deadline_)); - - await_output(); - - output_deadline_.async_wait( - boost::bind(&tcp_session::check_deadline, - shared_from_this(), &output_deadline_)); - } - -private: - void stop() - { - channel_.leave(shared_from_this()); - - asio::error_code ignored_ec; - socket_.close(ignored_ec); - input_deadline_.cancel(); - non_empty_output_queue_.cancel(); - output_deadline_.cancel(); - } - - bool stopped() const - { - return !socket_.is_open(); - } - - void deliver(const std::string& msg) - { - output_queue_.push_back(msg + "\n"); - - // Signal that the output queue contains messages. Modifying the expiry - // will wake the output actor, if it is waiting on the timer. - non_empty_output_queue_.expires_at(boost::posix_time::neg_infin); - } - - void start_read() - { - // Set a deadline for the read operation. - input_deadline_.expires_from_now(boost::posix_time::seconds(30)); - - // Start an asynchronous operation to read a newline-delimited message. - asio::async_read_until(socket_, input_buffer_, '\n', - boost::bind(&tcp_session::handle_read, shared_from_this(), _1)); - } - - void handle_read(const asio::error_code& ec) - { - if (stopped()) - return; - - if (!ec) - { - // Extract the newline-delimited message from the buffer. - std::string msg; - std::istream is(&input_buffer_); - std::getline(is, msg); - - if (!msg.empty()) - { - channel_.deliver(msg); - } - else - { - // We received a heartbeat message from the client. If there's nothing - // else being sent or ready to be sent, send a heartbeat right back. - if (output_queue_.empty()) - { - output_queue_.push_back("\n"); - - // Signal that the output queue contains messages. Modifying the - // expiry will wake the output actor, if it is waiting on the timer. - non_empty_output_queue_.expires_at(boost::posix_time::neg_infin); - } - } - - start_read(); - } - else - { - stop(); - } - } - - void await_output() - { - if (stopped()) - return; - - if (output_queue_.empty()) - { - // There are no messages that are ready to be sent. The actor goes to - // sleep by waiting on the non_empty_output_queue_ timer. When a new - // message is added, the timer will be modified and the actor will wake. - non_empty_output_queue_.expires_at(boost::posix_time::pos_infin); - non_empty_output_queue_.async_wait( - boost::bind(&tcp_session::await_output, shared_from_this())); - } - else - { - start_write(); - } - } - - void start_write() - { - // Set a deadline for the write operation. - output_deadline_.expires_from_now(boost::posix_time::seconds(30)); - - // Start an asynchronous operation to send a message. - asio::async_write(socket_, - asio::buffer(output_queue_.front()), - boost::bind(&tcp_session::handle_write, shared_from_this(), _1)); - } - - void handle_write(const asio::error_code& ec) - { - if (stopped()) - return; - - if (!ec) - { - output_queue_.pop_front(); - - await_output(); - } - else - { - stop(); - } - } - - void check_deadline(deadline_timer* deadline) - { - if (stopped()) - return; - - // Check whether the deadline has passed. We compare the deadline against - // the current time since a new asynchronous operation may have moved the - // deadline before this actor had a chance to run. - if (deadline->expires_at() <= deadline_timer::traits_type::now()) - { - // The deadline has passed. Stop the session. The other actors will - // terminate as soon as possible. - stop(); - } - else - { - // Put the actor back to sleep. - deadline->async_wait( - boost::bind(&tcp_session::check_deadline, - shared_from_this(), deadline)); - } - } - - channel& channel_; - tcp::socket socket_; - asio::streambuf input_buffer_; - deadline_timer input_deadline_; - std::deque<std::string> output_queue_; - deadline_timer non_empty_output_queue_; - deadline_timer output_deadline_; -}; - -typedef boost::shared_ptr<tcp_session> tcp_session_ptr; - -//---------------------------------------------------------------------- - -class udp_broadcaster - : public subscriber -{ -public: - udp_broadcaster(asio::io_context& io_context, - const udp::endpoint& broadcast_endpoint) - : socket_(io_context) - { - socket_.connect(broadcast_endpoint); - } - -private: - void deliver(const std::string& msg) - { - asio::error_code ignored_ec; - socket_.send(asio::buffer(msg), 0, ignored_ec); - } - - udp::socket socket_; -}; - -//---------------------------------------------------------------------- - -class server -{ -public: - server(asio::io_context& io_context, - const tcp::endpoint& listen_endpoint, - const udp::endpoint& broadcast_endpoint) - : io_context_(io_context), - acceptor_(io_context, listen_endpoint) - { - subscriber_ptr bc(new udp_broadcaster(io_context_, broadcast_endpoint)); - channel_.join(bc); - - start_accept(); - } - - void start_accept() - { - tcp_session_ptr new_session(new tcp_session(io_context_, channel_)); - - acceptor_.async_accept(new_session->socket(), - boost::bind(&server::handle_accept, this, new_session, _1)); - } - - void handle_accept(tcp_session_ptr session, - const asio::error_code& ec) - { - if (!ec) - { - session->start(); - } - - start_accept(); - } - -private: - asio::io_context& io_context_; - tcp::acceptor acceptor_; - channel channel_; -}; - -//---------------------------------------------------------------------- - -int main(int argc, char* argv[]) -{ - try - { - using namespace std; // For atoi. - - if (argc != 4) - { - std::cerr << "Usage: server <listen_port> <bcast_address> <bcast_port>\n"; - return 1; - } - - asio::io_context io_context; - - tcp::endpoint listen_endpoint(tcp::v4(), atoi(argv[1])); - - udp::endpoint broadcast_endpoint( - asio::ip::make_address(argv[2]), atoi(argv[3])); - - server s(io_context, listen_endpoint, broadcast_endpoint); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/timers/.gitignore b/3rdparty/asio/src/examples/cpp03/timers/.gitignore deleted file mode 100644 index a3fe695226f..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timers/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -*timer -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/timers/tick_count_timer.cpp b/3rdparty/asio/src/examples/cpp03/timers/tick_count_timer.cpp deleted file mode 100644 index 8b98cfd2a54..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timers/tick_count_timer.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// -// tick_count_timer.cpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <ctime> -#include <iostream> - -#if defined(WIN32) -# include <windows.h> -#else -# error This example is for Windows only! -#endif - -struct tick_count_traits -{ - // The time type. This type has no constructor that takes a DWORD to ensure - // that the timer can only be used with relative times. - class time_type - { - public: - time_type() : ticks_(0) {} - private: - friend struct tick_count_traits; - DWORD ticks_; - }; - - // The duration type. According to the TimeTraits requirements, the duration - // must be a signed type. This means we can't handle durations larger than - // 2^31. - class duration_type - { - public: - duration_type() : ticks_(0) {} - duration_type(LONG ticks) : ticks_(ticks) {} - private: - friend struct tick_count_traits; - LONG ticks_; - }; - - // Get the current time. - static time_type now() - { - time_type result; - result.ticks_ = ::GetTickCount(); - return result; - } - - // Add a duration to a time. - static time_type add(const time_type& t, const duration_type& d) - { - time_type result; - result.ticks_ = t.ticks_ + d.ticks_; - return result; - } - - // Subtract one time from another. - static duration_type subtract(const time_type& t1, const time_type& t2) - { - // DWORD tick count values can wrap (see less_than() below). We'll convert - // to a duration by taking the absolute difference and adding the sign - // based on which is the "lesser" absolute time. - return duration_type(less_than(t1, t2) - ? -static_cast<LONG>(t2.ticks_ - t1.ticks_) - : static_cast<LONG>(t1.ticks_ - t2.ticks_)); - } - - // Test whether one time is less than another. - static bool less_than(const time_type& t1, const time_type& t2) - { - // DWORD tick count values wrap periodically, so we'll use a heuristic that - // says that if subtracting t1 from t2 yields a value smaller than 2^31, - // then t1 is probably less than t2. This means that we can't handle - // durations larger than 2^31, which shouldn't be a problem in practice. - return (t2.ticks_ - t1.ticks_) < static_cast<DWORD>(1 << 31); - } - - // Convert to POSIX duration type. - static boost::posix_time::time_duration to_posix_duration( - const duration_type& d) - { - return boost::posix_time::milliseconds(d.ticks_); - } -}; - -typedef asio::basic_deadline_timer< - DWORD, tick_count_traits> tick_count_timer; - -void handle_timeout(const asio::error_code&) -{ - std::cout << "handle_timeout\n"; -} - -int main() -{ - try - { - asio::io_context io_context; - - tick_count_timer timer(io_context, 5000); - std::cout << "Starting synchronous wait\n"; - timer.wait(); - std::cout << "Finished synchronous wait\n"; - - timer.expires_from_now(5000); - std::cout << "Starting asynchronous wait\n"; - timer.async_wait(&handle_timeout); - io_context.run(); - std::cout << "Finished asynchronous wait\n"; - } - catch (std::exception& e) - { - std::cout << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/timers/time_t_timer.cpp b/3rdparty/asio/src/examples/cpp03/timers/time_t_timer.cpp deleted file mode 100644 index 8a434e9b20c..00000000000 --- a/3rdparty/asio/src/examples/cpp03/timers/time_t_timer.cpp +++ /dev/null @@ -1,93 +0,0 @@ -// -// time_t_timer.cpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <ctime> -#include <iostream> - -struct time_t_traits -{ - // The time type. - typedef std::time_t time_type; - - // The duration type. - struct duration_type - { - duration_type() : value(0) {} - duration_type(std::time_t v) : value(v) {} - std::time_t value; - }; - - // Get the current time. - static time_type now() - { - return std::time(0); - } - - // Add a duration to a time. - static time_type add(const time_type& t, const duration_type& d) - { - return t + d.value; - } - - // Subtract one time from another. - static duration_type subtract(const time_type& t1, const time_type& t2) - { - return duration_type(t1 - t2); - } - - // Test whether one time is less than another. - static bool less_than(const time_type& t1, const time_type& t2) - { - return t1 < t2; - } - - // Convert to POSIX duration type. - static boost::posix_time::time_duration to_posix_duration( - const duration_type& d) - { - return boost::posix_time::seconds(d.value); - } -}; - -typedef asio::basic_deadline_timer< - std::time_t, time_t_traits> time_t_timer; - -void handle_timeout(const asio::error_code&) -{ - std::cout << "handle_timeout\n"; -} - -int main() -{ - try - { - asio::io_context io_context; - - time_t_timer timer(io_context); - - timer.expires_from_now(5); - std::cout << "Starting synchronous wait\n"; - timer.wait(); - std::cout << "Finished synchronous wait\n"; - - timer.expires_from_now(5); - std::cout << "Starting asynchronous wait\n"; - timer.async_wait(&handle_timeout); - io_context.run(); - std::cout << "Finished asynchronous wait\n"; - } - catch (std::exception& e) - { - std::cout << "Exception: " << e.what() << "\n"; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime1/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/daytime1/.gitignore deleted file mode 100644 index 2926eaf9bf6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime1/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -client -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime1/client.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/daytime1/client.cpp deleted file mode 100644 index 9784d48a6fb..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime1/client.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// -// client.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <boost/array.hpp> -#include <asio.hpp> - -using asio::ip::tcp; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: client <host>" << std::endl; - return 1; - } - - asio::io_context io_context; - - tcp::resolver resolver(io_context); - tcp::resolver::results_type endpoints = - resolver.resolve(argv[1], "daytime"); - - tcp::socket socket(io_context); - asio::connect(socket, endpoints); - - for (;;) - { - boost::array<char, 128> buf; - asio::error_code error; - - size_t len = socket.read_some(asio::buffer(buf), error); - - if (error == asio::error::eof) - break; // Connection closed cleanly by peer. - else if (error) - throw asio::system_error(error); // Some other error. - - std::cout.write(buf.data(), len); - } - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime2/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/daytime2/.gitignore deleted file mode 100644 index 7f06efb3296..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime2/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -server -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime2/server.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/daytime2/server.cpp deleted file mode 100644 index f662ed246c4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime2/server.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <ctime> -#include <iostream> -#include <string> -#include <asio.hpp> - -using asio::ip::tcp; - -std::string make_daytime_string() -{ - using namespace std; // For time_t, time and ctime; - time_t now = time(0); - return ctime(&now); -} - -int main() -{ - try - { - asio::io_context io_context; - - tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13)); - - for (;;) - { - tcp::socket socket(io_context); - acceptor.accept(socket); - - std::string message = make_daytime_string(); - - asio::error_code ignored_error; - asio::write(socket, asio::buffer(message), ignored_error); - } - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime3/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/daytime3/.gitignore deleted file mode 100644 index 7f06efb3296..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime3/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -server -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime3/server.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/daytime3/server.cpp deleted file mode 100644 index cb2c9480594..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime3/server.cpp +++ /dev/null @@ -1,117 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <ctime> -#include <iostream> -#include <string> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <asio.hpp> - -using asio::ip::tcp; - -std::string make_daytime_string() -{ - using namespace std; // For time_t, time and ctime; - time_t now = time(0); - return ctime(&now); -} - -class tcp_connection - : public boost::enable_shared_from_this<tcp_connection> -{ -public: - typedef boost::shared_ptr<tcp_connection> pointer; - - static pointer create(asio::io_context& io_context) - { - return pointer(new tcp_connection(io_context)); - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - message_ = make_daytime_string(); - - asio::async_write(socket_, asio::buffer(message_), - boost::bind(&tcp_connection::handle_write, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - -private: - tcp_connection(asio::io_context& io_context) - : socket_(io_context) - { - } - - void handle_write(const asio::error_code& /*error*/, - size_t /*bytes_transferred*/) - { - } - - tcp::socket socket_; - std::string message_; -}; - -class tcp_server -{ -public: - tcp_server(asio::io_context& io_context) - : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13)) - { - start_accept(); - } - -private: - void start_accept() - { - tcp_connection::pointer new_connection = - tcp_connection::create(acceptor_.get_executor().context()); - - acceptor_.async_accept(new_connection->socket(), - boost::bind(&tcp_server::handle_accept, this, new_connection, - asio::placeholders::error)); - } - - void handle_accept(tcp_connection::pointer new_connection, - const asio::error_code& error) - { - if (!error) - { - new_connection->start(); - } - - start_accept(); - } - - tcp::acceptor acceptor_; -}; - -int main() -{ - try - { - asio::io_context io_context; - tcp_server server(io_context); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime4/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/daytime4/.gitignore deleted file mode 100644 index 2926eaf9bf6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime4/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -client -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime4/client.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/daytime4/client.cpp deleted file mode 100644 index da3b651d56d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime4/client.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// client.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <boost/array.hpp> -#include <asio.hpp> - -using asio::ip::udp; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: client <host>" << std::endl; - return 1; - } - - asio::io_context io_context; - - udp::resolver resolver(io_context); - udp::endpoint receiver_endpoint = - *resolver.resolve(udp::v4(), argv[1], "daytime").begin(); - - udp::socket socket(io_context); - socket.open(udp::v4()); - - boost::array<char, 1> send_buf = {{ 0 }}; - socket.send_to(asio::buffer(send_buf), receiver_endpoint); - - boost::array<char, 128> recv_buf; - udp::endpoint sender_endpoint; - size_t len = socket.receive_from( - asio::buffer(recv_buf), sender_endpoint); - - std::cout.write(recv_buf.data(), len); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime5/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/daytime5/.gitignore deleted file mode 100644 index 7f06efb3296..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime5/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -server -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime5/server.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/daytime5/server.cpp deleted file mode 100644 index fdf452562d2..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime5/server.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <ctime> -#include <iostream> -#include <string> -#include <boost/array.hpp> -#include <asio.hpp> - -using asio::ip::udp; - -std::string make_daytime_string() -{ - using namespace std; // For time_t, time and ctime; - time_t now = time(0); - return ctime(&now); -} - -int main() -{ - try - { - asio::io_context io_context; - - udp::socket socket(io_context, udp::endpoint(udp::v4(), 13)); - - for (;;) - { - boost::array<char, 1> recv_buf; - udp::endpoint remote_endpoint; - asio::error_code error; - socket.receive_from(asio::buffer(recv_buf), - remote_endpoint, 0, error); - - if (error && error != asio::error::message_size) - throw asio::system_error(error); - - std::string message = make_daytime_string(); - - asio::error_code ignored_error; - socket.send_to(asio::buffer(message), - remote_endpoint, 0, ignored_error); - } - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime6/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/daytime6/.gitignore deleted file mode 100644 index 7f06efb3296..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime6/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -server -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime6/server.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/daytime6/server.cpp deleted file mode 100644 index d67045ff990..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime6/server.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <ctime> -#include <iostream> -#include <string> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <asio.hpp> - -using asio::ip::udp; - -std::string make_daytime_string() -{ - using namespace std; // For time_t, time and ctime; - time_t now = time(0); - return ctime(&now); -} - -class udp_server -{ -public: - udp_server(asio::io_context& io_context) - : socket_(io_context, udp::endpoint(udp::v4(), 13)) - { - start_receive(); - } - -private: - void start_receive() - { - socket_.async_receive_from( - asio::buffer(recv_buffer_), remote_endpoint_, - boost::bind(&udp_server::handle_receive, this, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - - void handle_receive(const asio::error_code& error, - std::size_t /*bytes_transferred*/) - { - if (!error || error == asio::error::message_size) - { - boost::shared_ptr<std::string> message( - new std::string(make_daytime_string())); - - socket_.async_send_to(asio::buffer(*message), remote_endpoint_, - boost::bind(&udp_server::handle_send, this, message, - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - - start_receive(); - } - } - - void handle_send(boost::shared_ptr<std::string> /*message*/, - const asio::error_code& /*error*/, - std::size_t /*bytes_transferred*/) - { - } - - udp::socket socket_; - udp::endpoint remote_endpoint_; - boost::array<char, 1> recv_buffer_; -}; - -int main() -{ - try - { - asio::io_context io_context; - udp_server server(io_context); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime7/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/daytime7/.gitignore deleted file mode 100644 index 7f06efb3296..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime7/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -server -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime7/server.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/daytime7/server.cpp deleted file mode 100644 index b9dc60558c9..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime7/server.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// -// server.cpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <ctime> -#include <iostream> -#include <string> -#include <boost/array.hpp> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <asio.hpp> - -using asio::ip::tcp; -using asio::ip::udp; - -std::string make_daytime_string() -{ - using namespace std; // For time_t, time and ctime; - time_t now = time(0); - return ctime(&now); -} - -class tcp_connection - : public boost::enable_shared_from_this<tcp_connection> -{ -public: - typedef boost::shared_ptr<tcp_connection> pointer; - - static pointer create(asio::io_context& io_context) - { - return pointer(new tcp_connection(io_context)); - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - message_ = make_daytime_string(); - - asio::async_write(socket_, asio::buffer(message_), - boost::bind(&tcp_connection::handle_write, shared_from_this())); - } - -private: - tcp_connection(asio::io_context& io_context) - : socket_(io_context) - { - } - - void handle_write() - { - } - - tcp::socket socket_; - std::string message_; -}; - -class tcp_server -{ -public: - tcp_server(asio::io_context& io_context) - : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13)) - { - start_accept(); - } - -private: - void start_accept() - { - tcp_connection::pointer new_connection = - tcp_connection::create(acceptor_.get_executor().context()); - - acceptor_.async_accept(new_connection->socket(), - boost::bind(&tcp_server::handle_accept, this, new_connection, - asio::placeholders::error)); - } - - void handle_accept(tcp_connection::pointer new_connection, - const asio::error_code& error) - { - if (!error) - { - new_connection->start(); - } - - start_accept(); - } - - tcp::acceptor acceptor_; -}; - -class udp_server -{ -public: - udp_server(asio::io_context& io_context) - : socket_(io_context, udp::endpoint(udp::v4(), 13)) - { - start_receive(); - } - -private: - void start_receive() - { - socket_.async_receive_from( - asio::buffer(recv_buffer_), remote_endpoint_, - boost::bind(&udp_server::handle_receive, this, - asio::placeholders::error)); - } - - void handle_receive(const asio::error_code& error) - { - if (!error || error == asio::error::message_size) - { - boost::shared_ptr<std::string> message( - new std::string(make_daytime_string())); - - socket_.async_send_to(asio::buffer(*message), remote_endpoint_, - boost::bind(&udp_server::handle_send, this, message)); - - start_receive(); - } - } - - void handle_send(boost::shared_ptr<std::string> /*message*/) - { - } - - udp::socket socket_; - udp::endpoint remote_endpoint_; - boost::array<char, 1> recv_buffer_; -}; - -int main() -{ - try - { - asio::io_context io_context; - tcp_server server1(io_context); - udp_server server2(io_context); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/daytime_dox.txt b/3rdparty/asio/src/examples/cpp03/tutorial/daytime_dox.txt deleted file mode 100644 index 1bf591a43a8..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/daytime_dox.txt +++ /dev/null @@ -1,502 +0,0 @@ -// -// Copyright (c) 2003-2016 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) -// - -/** -\page tutdaytime1 Daytime.1 - A synchronous TCP daytime client - -This tutorial program shows how to use asio to implement a client application -with TCP. - -\dontinclude daytime1/client.cpp -\skip #include - -We start by including the necessary header files. - -\until asio.hpp - -The purpose of this application is to access a daytime service, -so we need the user to specify the server. - -\until } - -All programs that use asio need to have at least one asio::io_service -object. - -\until asio::io_service - -We need to turn the server name that was specified as a parameter to the -application, into a TCP endpoint. To do this we use an -asio::ip::tcp::resolver object. - -\until tcp::resolver - -A resolver takes a query object and turns it into a list of endpoints. We -construct a query using the name of the server, specified in <tt>argv[1]</tt>, -and the name of the service, in this case <tt>"daytime"</tt>. - -\until tcp::resolver::query - -The list of endpoints is returned using an iterator of type -asio::ip::tcp::resolver::iterator. (Note that a default constructed -asio::ip::tcp::resolver::iterator object can be used as an end iterator.) - -\until tcp::resolver::iterator - -Now we create and connect the socket. The list of endpoints obtained above may -contain both IPv4 and IPv6 endpoints, so we need to try each of them until we -find one that works. This keeps the client program independent of a specific IP -version. The asio::connect() function does this for us automatically. - -\until asio::connect - -The connection is open. All we need to do now is read the response from the -daytime service. - -We use a <tt>boost::array</tt> to hold the received data. The asio::buffer() -function automatically determines the size of the array to help prevent buffer -overruns. Instead of a <tt>boost::array</tt>, we could have used a <tt>char -[]</tt> or <tt>std::vector</tt>. - -\until read_some - -When the server closes the connection, the asio::ip::tcp::socket::read_some() -function will exit with the asio::error::eof error, which is how we know to -exit the loop. - -\until } - -Finally, handle any exceptions that may have been thrown. - -\until } -\until } - -See the \ref tutdaytime1src "full source listing" \n -Return to the \ref index "tutorial index" \n -Next: \ref tutdaytime2 - -*/ - -/** -\page tutdaytime1src Source listing for Daytime.1 -\include daytime1/client.cpp -Return to \ref tutdaytime1 -*/ - -/** -\page tutdaytime2 Daytime.2 - A synchronous TCP daytime server - -This tutorial program shows how to use asio to implement a server application -with TCP. - -\dontinclude daytime2/server.cpp -\skip #include - -\until using - -We define the function <tt>make_daytime_string()</tt> to create the string to -be sent back to the client. This function will be reused in all of our daytime -server applications. - -\until asio::io_service - -A asio::ip::tcp::acceptor object needs to be created to listen -for new connections. It is initialised to listen on TCP port 13, for IP version 4. - -\until tcp::acceptor - -This is an iterative server, which means that it will handle one -connection at a time. Create a socket that will represent the connection to the -client, and then wait for a connection. - -\until acceptor.accept - -A client is accessing our service. Determine the current time -and transfer this information to the client. - -\until } -\until } - -Finally, handle any exceptions. - -\until } -\until } - -See the \ref tutdaytime2src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tutdaytime1 \n -Next: \ref tutdaytime3 - -*/ - -/** -\page tutdaytime2src Source listing for Daytime.2 -\include daytime2/server.cpp -Return to \ref tutdaytime2 -*/ - -/** -\page tutdaytime3 Daytime.3 - An asynchronous TCP daytime server - -\section tutdaytime3funcmain The main() function - -\dontinclude daytime3/server.cpp -\skip int main() -\until try -\until { - -We need to create a server object to accept incoming client connections. The -asio::io_service object provides I/O services, such as sockets, that the -server object will use. - -\until tcp_server - -Run the asio::io_service object so that it will perform asynchronous operations -on your behalf. - -\until return 0; -\until } - -\section tutdaytime3classtcp_server The tcp_server class - -\dontinclude daytime3/server.cpp -\skip class tcp_server -\until public: - -The constructor initialises an acceptor to listen on TCP port 13. - -\until private: - -The function <tt>start_accept()</tt> creates a socket and initiates an -asynchronous accept operation to wait for a new connection. - -\until } - -The function <tt>handle_accept()</tt> is called when the asynchronous accept -operation initiated by <tt>start_accept()</tt> finishes. It services the client -request, and then calls <tt>start_accept()</tt> to initiate the next accept -operation. - -\until } -\until } - -\section tutdaytime3classtcp_connection The tcp_connection class - -We will use <tt>shared_ptr</tt> and <tt>enable_shared_from_this</tt> because we -want to keep the <tt>tcp_connection</tt> object alive as long as there is an -operation that refers to it. - -\dontinclude daytime3/server.cpp -\skip class tcp_connection -\until shared_ptr -\until } -\until } - -In the function <tt>start()</tt>, we call asio::async_write() to serve the data -to the client. Note that we are using asio::async_write(), rather than -asio::ip::tcp::socket::async_write_some(), to ensure that the entire block of -data is sent. - -\until { - -The data to be sent is stored in the class member <tt>message_</tt> as we need -to keep the data valid until the asynchronous operation is complete. - -\until message_ - -When initiating the asynchronous operation, and if using \ref boost_bind, you -must specify only the arguments that match the handler's parameter list. In -this program, both of the argument placeholders (asio::placeholders::error and -asio::placeholders::bytes_transferred) could potentially have been removed, -since they are not being used in <tt>handle_write()</tt>. - -\until placeholders::bytes_transferred - -Any further actions for this client connection are now the responsibility of -<tt>handle_write()</tt>. - -\until }; - -\section tutdaytime3remunused Removing unused handler parameters - -You may have noticed that the <tt>error</tt>, and <tt>bytes_transferred</tt> -parameters are not used in the body of the <tt>handle_write()</tt> function. If -parameters are not needed, it is possible to remove them from the function so -that it looks like: - -\code - void handle_write() - { - } -\endcode - -The asio::async_write() call used to initiate the call can then be changed to -just: - -\code - asio::async_write(socket_, asio::buffer(message_), - boost::bind(&tcp_connection::handle_write, shared_from_this())); -\endcode - -See the \ref tutdaytime3src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tutdaytime2 \n -Next: \ref tutdaytime4 - -*/ - -/** -\page tutdaytime3src Source listing for Daytime.3 -\include daytime3/server.cpp -Return to \ref tutdaytime3 -*/ - -/** -\page tutdaytime4 Daytime.4 - A synchronous UDP daytime client - -This tutorial program shows how to use asio to implement a client application -with UDP. - -\dontinclude daytime4/client.cpp -\skip #include -\until using asio::ip::udp; - -The start of the application is essentially the same as for the TCP daytime -client. - -\until asio::io_service - -We use an asio::ip::udp::resolver object to find the correct remote endpoint to -use based on the host and service names. The query is restricted to return only -IPv4 endpoints by the asio::ip::udp::v4() argument. - -\until udp::v4 - -The asio::ip::udp::resolver::resolve() function is guaranteed to return at -least one endpoint in the list if it does not fail. This means it is safe to -dereference the return value directly. - -\until udp::endpoint - -Since UDP is datagram-oriented, we will not be using a stream socket. Create an -asio::ip::udp::socket and initiate contact with the remote endpoint. - -\until receiver_endpoint - -Now we need to be ready to accept whatever the server sends back to us. The -endpoint on our side that receives the server's response will be initialised by -asio::ip::udp::socket::receive_from(). - -\until } - -Finally, handle any exceptions that may have been thrown. - -\until } -\until } -See the \ref tutdaytime4src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tutdaytime3 \n -Next: \ref tutdaytime5 - -*/ - -/** -\page tutdaytime4src Source listing for Daytime.4 -\include daytime4/client.cpp -Return to \ref tutdaytime4 -*/ - -/** -\page tutdaytime5 Daytime.5 - A synchronous UDP daytime server - -This tutorial program shows how to use asio to implement a server application -with UDP. - -\dontinclude daytime5/server.cpp -\skip int main() -\until asio::io_service - -Create an asio::ip::udp::socket object to receive requests on UDP port 13. - -\until udp::socket - -Wait for a client to initiate contact with us. The remote_endpoint object will -be populated by asio::ip::udp::socket::receive_from(). - -\until throw - -Determine what we are going to send back to the client. - -\until std::string message - -Send the response to the remote_endpoint. - -\until } -\until } - -Finally, handle any exceptions. - -\until } -\until } - -See the \ref tutdaytime5src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tutdaytime4 \n -Next: \ref tutdaytime6 - -*/ - -/** -\page tutdaytime5src Source listing for Daytime.5 -\include daytime5/server.cpp -Return to \ref tutdaytime5 -*/ - -/** -\page tutdaytime6 Daytime.6 - An asynchronous UDP daytime server - -\section tutdaytime6funcmain The main() function - -\dontinclude daytime6/server.cpp -\skip int main() -\until try -\until { - -Create a server object to accept incoming client requests, and run -the asio::io_service object. - -\until return 0; -\until } - -\section tutdaytime6classudp_server The udp_server class - -\dontinclude daytime6/server.cpp -\skip class udp_server -\until public: - -The constructor initialises a socket to listen on UDP port 13. - -\until private: -\until { - -The function asio::ip::udp::socket::async_receive_from() will cause the -application to listen in the background for a new request. When such a request -is received, the asio::io_service object will invoke the -<tt>handle_receive()</tt> function with two arguments: a value of type -asio::error_code indicating whether the operation succeeded or failed, and a -<tt>size_t</tt> value <tt>bytes_transferred</tt> specifying the number of bytes -received. - -\until } - -The function <tt>handle_receive()</tt> will service the client request. - -\until { - -The <tt>error</tt> parameter contains the result of the asynchronous operation. -Since we only provide the 1-byte <tt>recv_buffer_</tt> to contain the client's -request, the asio::io_service object would return an error if the client sent -anything larger. We can ignore such an error if it comes up. - -\until { - -Determine what we are going to send. - -\until make_daytime_string() - -We now call asio::ip::udp::socket::async_send_to() to serve the data to the -client. - -\until asio::placeholders::bytes_transferred - -When initiating the asynchronous operation, and if using \ref boost_bind, you -must specify only the arguments that match the handler's parameter list. In -this program, both of the argument placeholders (asio::placeholders::error and -asio::placeholders::bytes_transferred) could potentially have been removed. - -Start listening for the next client request. - -\until start_receive - -Any further actions for this client request are now the responsibility of -<tt>handle_send()</tt>. - -\until } -\until } - -The function <tt>handle_send()</tt> is invoked after the service request has -been completed. - -\until } -\until } - -See the \ref tutdaytime6src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tutdaytime5 \n -Next: \ref tutdaytime7 - -*/ - -/** -\page tutdaytime6src Source listing for Daytime.6 -\include daytime6/server.cpp -Return to \ref tutdaytime6 -*/ - -/** -\page tutdaytime7 Daytime.7 - A combined TCP/UDP asynchronous server - -This tutorial program shows how to combine the two asynchronous servers that we -have just written, into a single server application. - -\section tutdaytime7funcmain The main() function - -\dontinclude daytime7/server.cpp -\skip int main() -\until asio::io_service - -We will begin by creating a server object to accept a TCP client connection. - -\until tcp_server - -We also need a server object to accept a UDP client request. - -\until udp_server - -We have created two lots of work for the asio::io_service object to do. - -\until return 0; -\until } - -\section tutdaytime7classtcp The tcp_connection and tcp_server classes - -The following two classes are taken from \ref tutdaytime3 "Daytime.3". - -\dontinclude daytime7/server.cpp -\skip class tcp_connection -\until }; -\until }; - -\section tutdaytime7classudp The udp_server class - -Similarly, this next class is taken from the -\ref tutdaytime6 "previous tutorial step". - -\dontinclude daytime7/server.cpp -\skip class udp_server -\until }; - -See the \ref tutdaytime7src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tutdaytime6 - -*/ - -/** -\page tutdaytime7src Source listing for Daytime.7 -\include daytime7/server.cpp -Return to \ref tutdaytime7 -*/ diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/index_dox.txt b/3rdparty/asio/src/examples/cpp03/tutorial/index_dox.txt deleted file mode 100644 index 7d3bd1a2912..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/index_dox.txt +++ /dev/null @@ -1,48 +0,0 @@ -// -// Copyright (c) 2003-2016 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) -// - -/** -\mainpage asio Tutorial - -\section tuttimer Basic Skills - -The tutorial programs in this first section introduce the fundamental concepts -required to use the asio toolkit. Before plunging into the complex world of -network programming, these tutorial programs illustrate the basic skills using -simple asynchronous timers. - -\li \ref tuttimer1 -\li \ref tuttimer2 -\li \ref tuttimer3 -\li \ref tuttimer4 -\li \ref tuttimer5 - -\section tutdaytime Introduction to Sockets - -The tutorial programs in this section show how to use asio to develop simple -client and server programs. These tutorial programs are based around the <a -href="http://www.ietf.org/rfc/rfc867.txt">daytime</a> protocol, which supports -both TCP and UDP. - -The first three tutorial programs implement the daytime protocol using TCP. - -\li \ref tutdaytime1 -\li \ref tutdaytime2 -\li \ref tutdaytime3 - -The next three tutorial programs implement the daytime protocol using UDP. - -\li \ref tutdaytime4 -\li \ref tutdaytime5 -\li \ref tutdaytime6 - -The last tutorial program in this section demonstrates how asio allows the TCP -and UDP servers to be easily combined into a single program. - -\li \ref tutdaytime7 - -*/ diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer1/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/timer1/.gitignore deleted file mode 100644 index 1d47ca67c43..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer1/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -timer -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer1/timer.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/timer1/timer.cpp deleted file mode 100644 index 79ddf918261..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer1/timer.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// timer.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/date_time/posix_time/posix_time.hpp> - -int main() -{ - asio::io_context io; - - asio::deadline_timer t(io, boost::posix_time::seconds(5)); - t.wait(); - - std::cout << "Hello, world!" << std::endl; - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer2/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/timer2/.gitignore deleted file mode 100644 index 1d47ca67c43..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer2/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -timer -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer2/timer.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/timer2/timer.cpp deleted file mode 100644 index 3275c22c2f6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer2/timer.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// timer.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/date_time/posix_time/posix_time.hpp> - -void print(const asio::error_code& /*e*/) -{ - std::cout << "Hello, world!" << std::endl; -} - -int main() -{ - asio::io_context io; - - asio::deadline_timer t(io, boost::posix_time::seconds(5)); - t.async_wait(&print); - - io.run(); - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer3/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/timer3/.gitignore deleted file mode 100644 index 1d47ca67c43..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer3/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -timer -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer3/timer.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/timer3/timer.cpp deleted file mode 100644 index dfbf7d660a0..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer3/timer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// timer.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <boost/date_time/posix_time/posix_time.hpp> - -void print(const asio::error_code& /*e*/, - asio::deadline_timer* t, int* count) -{ - if (*count < 5) - { - std::cout << *count << std::endl; - ++(*count); - - t->expires_at(t->expires_at() + boost::posix_time::seconds(1)); - t->async_wait(boost::bind(print, - asio::placeholders::error, t, count)); - } -} - -int main() -{ - asio::io_context io; - - int count = 0; - asio::deadline_timer t(io, boost::posix_time::seconds(1)); - t.async_wait(boost::bind(print, - asio::placeholders::error, &t, &count)); - - io.run(); - - std::cout << "Final count is " << count << std::endl; - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer4/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/timer4/.gitignore deleted file mode 100644 index 1d47ca67c43..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer4/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -timer -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer4/timer.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/timer4/timer.cpp deleted file mode 100644 index cbea70d26fa..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer4/timer.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// -// timer.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <boost/date_time/posix_time/posix_time.hpp> - -class printer -{ -public: - printer(asio::io_context& io) - : timer_(io, boost::posix_time::seconds(1)), - count_(0) - { - timer_.async_wait(boost::bind(&printer::print, this)); - } - - ~printer() - { - std::cout << "Final count is " << count_ << std::endl; - } - - void print() - { - if (count_ < 5) - { - std::cout << count_ << std::endl; - ++count_; - - timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1)); - timer_.async_wait(boost::bind(&printer::print, this)); - } - } - -private: - asio::deadline_timer timer_; - int count_; -}; - -int main() -{ - asio::io_context io; - printer p(io); - io.run(); - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer5/.gitignore b/3rdparty/asio/src/examples/cpp03/tutorial/timer5/.gitignore deleted file mode 100644 index 1d47ca67c43..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer5/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -timer -.deps -.dirstamp -*.o -*.obj -*.exe -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer5/timer.cpp b/3rdparty/asio/src/examples/cpp03/tutorial/timer5/timer.cpp deleted file mode 100644 index a798e85aacf..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer5/timer.cpp +++ /dev/null @@ -1,81 +0,0 @@ -// -// timer.cpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <asio.hpp> -#include <boost/bind.hpp> -#include <boost/date_time/posix_time/posix_time.hpp> - -class printer -{ -public: - printer(asio::io_context& io) - : strand_(io), - timer1_(io, boost::posix_time::seconds(1)), - timer2_(io, boost::posix_time::seconds(1)), - count_(0) - { - timer1_.async_wait(asio::bind_executor(strand_, - boost::bind(&printer::print1, this))); - - timer2_.async_wait(asio::bind_executor(strand_, - boost::bind(&printer::print2, this))); - } - - ~printer() - { - std::cout << "Final count is " << count_ << std::endl; - } - - void print1() - { - if (count_ < 10) - { - std::cout << "Timer 1: " << count_ << std::endl; - ++count_; - - timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1)); - - timer1_.async_wait(asio::bind_executor(strand_, - boost::bind(&printer::print1, this))); - } - } - - void print2() - { - if (count_ < 10) - { - std::cout << "Timer 2: " << count_ << std::endl; - ++count_; - - timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1)); - - timer2_.async_wait(asio::bind_executor(strand_, - boost::bind(&printer::print2, this))); - } - } - -private: - asio::io_context::strand strand_; - asio::deadline_timer timer1_; - asio::deadline_timer timer2_; - int count_; -}; - -int main() -{ - asio::io_context io; - printer p(io); - asio::thread t(boost::bind(&asio::io_context::run, &io)); - io.run(); - t.join(); - - return 0; -} diff --git a/3rdparty/asio/src/examples/cpp03/tutorial/timer_dox.txt b/3rdparty/asio/src/examples/cpp03/tutorial/timer_dox.txt deleted file mode 100644 index 7c5a0a099a6..00000000000 --- a/3rdparty/asio/src/examples/cpp03/tutorial/timer_dox.txt +++ /dev/null @@ -1,383 +0,0 @@ -// -// Copyright (c) 2003-2016 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) -// - -/** -\page tuttimer1 Timer.1 - Using a timer synchronously - -This tutorial program introduces asio by showing how to perform a blocking -wait on a timer. - -\dontinclude timer1/timer.cpp -\skip #include - -We start by including the necessary header files. - -All of the asio classes can be used by simply including the <tt>"asio.hpp"</tt> -header file. - -\until asio.hpp - -Since this example uses timers, we need to include the appropriate -Boost.Date_Time header file for manipulating times. - -\until posix_time.hpp - -All programs that use asio need to have at least one asio::io_service object. -This class provides access to I/O functionality. We declare an object of this -type first thing in the main function. - -\until asio::io_service - -Next we declare an object of type asio::deadline_timer. The core asio classes -that provide I/O functionality (or as in this case timer functionality) always -take a reference to an io_service as their first constructor argument. The -second argument to the constructor sets the timer to expire 5 seconds from now. - -\until asio::deadline_timer - -In this simple example we perform a blocking wait on the timer. -That is, the call to asio::deadline_timer::wait() will not return until the -timer has expired, 5 seconds after it was created (i.e. <b>not</b> from when the -wait starts). - -A deadline timer is always in one of two states: "expired" or "not expired". If -the asio::deadline_timer::wait() function is called on an expired timer, it -will return immediately. - -\until wait - -Finally we print the obligatory <tt>"Hello, world!"</tt> -message to show when the timer has expired. - -\until } - -See the \ref tuttimer1src "full source listing" \n -Return to the \ref index "tutorial index" \n -Next: \ref tuttimer2 - -*/ - -/** -\page tuttimer1src Source listing for Timer.1 -\include timer1/timer.cpp -Return to \ref tuttimer1 -*/ - -/** -\page tuttimer2 Timer.2 - Using a timer asynchronously - -This tutorial program demonstrates how to use asio's asynchronous callback -functionality by modifying the program from tutorial Timer.1 to perform an -asynchronous wait on the timer. - -\dontinclude timer2/timer.cpp -\skip #include - -\until posix_time.hpp - -Using asio's asynchronous functionality means having a callback -function that will be called when an asynchronous operation completes. In this -program we define a function called <tt>print</tt> to be called when the -asynchronous wait finishes. - -\until asio::deadline_timer - -Next, instead of doing a blocking wait as in tutorial Timer.1, -we call the asio::deadline_timer::async_wait() function to perform an -asynchronous wait. When calling this function we pass the <tt>print</tt> -callback handler that was defined above. - -\skipline async_wait - -Finally, we must call the asio::io_service::run() member function -on the io_service object. - -The asio library provides a guarantee that callback handlers will <b>only</b> -be called from threads that are currently calling asio::io_service::run(). -Therefore unless the asio::io_service::run() function is called the callback for -the asynchronous wait completion will never be invoked. - -The asio::io_service::run() function will also continue to run while there is -still "work" to do. In this example, the work is the asynchronous wait on the -timer, so the call will not return until the timer has expired and the -callback has completed. - -It is important to remember to give the io_service some work to do before -calling asio::io_service::run(). For example, if we had omitted the above call -to asio::deadline_timer::async_wait(), the io_service would not have had any -work to do, and consequently asio::io_service::run() would have returned -immediately. - -\skip run -\until } - -See the \ref tuttimer2src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tuttimer1 \n -Next: \ref tuttimer3 - -*/ - -/** -\page tuttimer2src Source listing for Timer.2 -\include timer2/timer.cpp -Return to \ref tuttimer2 -*/ - -/** -\page tuttimer3 Timer.3 - Binding arguments to a handler - -In this tutorial we will modify the program from tutorial Timer.2 so that the -timer fires once a second. This will show how to pass additional parameters to -your handler function. - -\dontinclude timer3/timer.cpp -\skip #include - -\until posix_time.hpp - -To implement a repeating timer using asio you need to change -the timer's expiry time in your callback function, and to then start a new -asynchronous wait. Obviously this means that the callback function will need -to be able to access the timer object. To this end we add two new parameters -to the <tt>print</tt> function: - -\li A pointer to a timer object. - -\li A counter so that we can stop the program when the timer fires for the -sixth time. - -\until { - -As mentioned above, this tutorial program uses a counter to -stop running when the timer fires for the sixth time. However you will observe -that there is no explicit call to ask the io_service to stop. Recall that in -tutorial Timer.2 we learnt that the asio::io_service::run() function completes -when there is no more "work" to do. By not starting a new asynchronous wait on -the timer when <tt>count</tt> reaches 5, the io_service will run out of work and -stop running. - -\until ++ - -Next we move the expiry time for the timer along by one second -from the previous expiry time. By calculating the new expiry time relative to -the old, we can ensure that the timer does not drift away from the -whole-second mark due to any delays in processing the handler. - -\until expires_at - -Then we start a new asynchronous wait on the timer. As you can -see, the \ref boost_bind function is used to associate the extra parameters -with your callback handler. The asio::deadline_timer::async_wait() function -expects a handler function (or function object) with the signature -<tt>void(const asio::error_code&)</tt>. Binding the additional parameters -converts your <tt>print</tt> function into a function object that matches the -signature correctly. - -See the <a href="http://www.boost.org/libs/bind/bind.html">Boost.Bind -documentation</a> for more information on how to use \ref boost_bind. - -In this example, the asio::placeholders::error argument to \ref boost_bind is a -named placeholder for the error object passed to the handler. When initiating -the asynchronous operation, and if using \ref boost_bind, you must specify only -the arguments that match the handler's parameter list. In tutorial Timer.4 you -will see that this placeholder may be elided if the parameter is not needed by -the callback handler. - -\until asio::io_service - -A new <tt>count</tt> variable is added so that we can stop the -program when the timer fires for the sixth time. - -\until asio::deadline_timer - -As in Step 4, when making the call to -asio::deadline_timer::async_wait() from <tt>main</tt> we bind the additional -parameters needed for the <tt>print</tt> function. - -\until run - -Finally, just to prove that the <tt>count</tt> variable was -being used in the <tt>print</tt> handler function, we will print out its new -value. - -\until } - -See the \ref tuttimer3src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tuttimer2 \n -Next: \ref tuttimer4 - -*/ - -/** -\page tuttimer3src Source listing for Timer.3 -\include timer3/timer.cpp -Return to \ref tuttimer3 -*/ - -/** -\page tuttimer4 Timer.4 - Using a member function as a handler - -In this tutorial we will see how to use a class member function as a callback -handler. The program should execute identically to the tutorial program from -tutorial Timer.3. - -\dontinclude timer4/timer.cpp -\skip #include - -\until posix_time.hpp - -Instead of defining a free function <tt>print</tt> as the -callback handler, as we did in the earlier tutorial programs, we now define a -class called <tt>printer</tt>. - -\until public - -The constructor of this class will take a reference to the -io_service object and use it when initialising the <tt>timer_</tt> member. The -counter used to shut down the program is now also a member of the class. - -\until { - -The \ref boost_bind function works just as well with class -member functions as with free functions. Since all non-static class member -functions have an implicit <tt>this</tt> parameter, we need to bind -<tt>this</tt> to the function. As in tutorial Timer.3, \ref boost_bind -converts our callback handler (now a member function) into a function object -that can be invoked as though it has the signature <tt>void(const -asio::error_code&)</tt>. - -You will note that the asio::placeholders::error placeholder is not specified -here, as the <tt>print</tt> member function does not accept an error object as -a parameter. - -\until } - -In the class destructor we will print out the final value of -the counter. - -\until } - -The <tt>print</tt> member function is very similar to the -<tt>print</tt> function from tutorial Timer.3, except that it now operates on -the class data members instead of having the timer and counter passed in as -parameters. - -\until }; - -The <tt>main</tt> function is much simpler than before, as it -now declares a local <tt>printer</tt> object before running the io_service as -normal. - -\until } - -See the \ref tuttimer4src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tuttimer3 \n -Next: \ref tuttimer5 \n - -*/ - -/** -\page tuttimer4src Source listing for Timer.4 -\include timer4/timer.cpp -Return to \ref tuttimer4 -*/ - -/** -\page tuttimer5 Timer.5 - Synchronising handlers in multithreaded programs - -This tutorial demonstrates the use of the asio::io_service::strand class to -synchronise callback handlers in a multithreaded program. - -The previous four tutorials avoided the issue of handler synchronisation by -calling the asio::io_service::run() function from one thread only. As you -already know, the asio library provides a guarantee that callback handlers will -<b>only</b> be called from threads that are currently calling -asio::io_service::run(). Consequently, calling asio::io_service::run() from -only one thread ensures that callback handlers cannot run concurrently. - -The single threaded approach is usually the best place to start when -developing applications using asio. The downside is the limitations it places -on programs, particularly servers, including: - -<ul> -<li>Poor responsiveness when handlers can take a long time to complete.</li> -<li>An inability to scale on multiprocessor systems.</li> -</ul> - -If you find yourself running into these limitations, an alternative approach -is to have a pool of threads calling asio::io_service::run(). However, as this -allows handlers to execute concurrently, we need a method of synchronisation -when handlers might be accessing a shared, thread-unsafe resource. - -\dontinclude timer5/timer.cpp -\skip #include - -\until posix_time.hpp - -We start by defining a class called <tt>printer</tt>, similar -to the class in the previous tutorial. This class will extend the previous -tutorial by running two timers in parallel. - -\until public - -In addition to initialising a pair of asio::deadline_timer members, the -constructor initialises the <tt>strand_</tt> member, an object of type -asio::io_service::strand. - -An asio::io_service::strand is an executor that guarantees that, for those -handlers that are dispatched through it, an executing handler will be allowed -to complete before the next one is started. This is guaranteed irrespective of -the number of threads that are calling asio::io_service::run(). Of course, the -handlers may still execute concurrently with other handlers that were -<b>not</b> dispatched through an asio::io_service::strand, or were dispatched -through a different asio::io_service::strand object. - -\until { - -When initiating the asynchronous operations, each callback handler is "bound" -to an asio::io_service::strand object. The -asio::io_service::strand::bind_executor() function returns a new handler that -automatically dispatches its contained handler through the -asio::io_service::strand object. By binding the handlers to the same -asio::io_service::strand, we are ensuring that they cannot execute -concurrently. - -\until } -\until } - -In a multithreaded program, the handlers for asynchronous -operations should be synchronised if they access shared resources. In this -tutorial, the shared resources used by the handlers (<tt>print1</tt> and -<tt>print2</tt>) are <tt>std::cout</tt> and the <tt>count_</tt> data member. - -\until }; - -The <tt>main</tt> function now causes asio::io_service::run() to -be called from two threads: the main thread and one additional thread. This is -accomplished using an asio::thread object. - -Just as it would with a call from a single thread, concurrent calls to -asio::io_service::run() will continue to execute while there is "work" left to -do. The background thread will not exit until all asynchronous operations have -completed. - -\until } - -See the \ref tuttimer5src "full source listing" \n -Return to the \ref index "tutorial index" \n -Previous: \ref tuttimer4 \n - -*/ - -/** -\page tuttimer5src Source listing for Timer.5 -\include timer5/timer.cpp -Return to \ref tuttimer5 -*/ diff --git a/3rdparty/asio/src/examples/cpp03/windows/.gitignore b/3rdparty/asio/src/examples/cpp03/windows/.gitignore deleted file mode 100644 index 180ba886e58..00000000000 --- a/3rdparty/asio/src/examples/cpp03/windows/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -server -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/windows/transmit_file.cpp b/3rdparty/asio/src/examples/cpp03/windows/transmit_file.cpp deleted file mode 100644 index 8ca9e1790fc..00000000000 --- a/3rdparty/asio/src/examples/cpp03/windows/transmit_file.cpp +++ /dev/null @@ -1,171 +0,0 @@ -// -// transmit_file.cpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 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 <ctime> -#include <iostream> -#include <string> -#include <boost/bind.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include "asio.hpp" - -#if defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) - -using asio::ip::tcp; -using asio::windows::overlapped_ptr; -using asio::windows::random_access_handle; - -// A wrapper for the TransmitFile overlapped I/O operation. -template <typename Handler> -void transmit_file(tcp::socket& socket, - random_access_handle& file, Handler handler) -{ - // Construct an OVERLAPPED-derived object to contain the handler. - overlapped_ptr overlapped(socket.get_executor().context(), handler); - - // Initiate the TransmitFile operation. - BOOL ok = ::TransmitFile(socket.native_handle(), - file.native_handle(), 0, 0, overlapped.get(), 0, 0); - DWORD last_error = ::GetLastError(); - - // Check if the operation completed immediately. - if (!ok && last_error != ERROR_IO_PENDING) - { - // The operation completed immediately, so a completion notification needs - // to be posted. When complete() is called, ownership of the OVERLAPPED- - // derived object passes to the io_context. - asio::error_code ec(last_error, - asio::error::get_system_category()); - overlapped.complete(ec, 0); - } - else - { - // The operation was successfully initiated, so ownership of the - // OVERLAPPED-derived object has passed to the io_context. - overlapped.release(); - } -} - -class connection - : public boost::enable_shared_from_this<connection> -{ -public: - typedef boost::shared_ptr<connection> pointer; - - static pointer create(asio::io_context& io_context, - const std::string& filename) - { - return pointer(new connection(io_context, filename)); - } - - tcp::socket& socket() - { - return socket_; - } - - void start() - { - asio::error_code ec; - file_.assign(::CreateFile(filename_.c_str(), GENERIC_READ, 0, 0, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0), ec); - if (file_.is_open()) - { - transmit_file(socket_, file_, - boost::bind(&connection::handle_write, shared_from_this(), - asio::placeholders::error, - asio::placeholders::bytes_transferred)); - } - } - -private: - connection(asio::io_context& io_context, const std::string& filename) - : socket_(io_context), - filename_(filename), - file_(io_context) - { - } - - void handle_write(const asio::error_code& /*error*/, - size_t /*bytes_transferred*/) - { - asio::error_code ignored_ec; - socket_.shutdown(tcp::socket::shutdown_both, ignored_ec); - } - - tcp::socket socket_; - std::string filename_; - random_access_handle file_; -}; - -class server -{ -public: - server(asio::io_context& io_context, - unsigned short port, const std::string& filename) - : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), - filename_(filename) - { - start_accept(); - } - -private: - void start_accept() - { - connection::pointer new_connection = - connection::create(acceptor_.get_executor().context(), filename_); - - acceptor_.async_accept(new_connection->socket(), - boost::bind(&server::handle_accept, this, new_connection, - asio::placeholders::error)); - } - - void handle_accept(connection::pointer new_connection, - const asio::error_code& error) - { - if (!error) - { - new_connection->start(); - } - - start_accept(); - } - - tcp::acceptor acceptor_; - std::string filename_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 3) - { - std::cerr << "Usage: transmit_file <port> <filename>\n"; - return 1; - } - - asio::io_context io_context; - - using namespace std; // For atoi. - server s(io_context, atoi(argv[1]), argv[2]); - - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << e.what() << std::endl; - } - - return 0; -} - -#else // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) -# error Overlapped I/O not available on this platform -#endif // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) |