From 2b6c4f44107efef17923f9631fea289f7d6cfc35 Mon Sep 17 00:00:00 2001 From: Toni Uhlig Date: Fri, 27 Jun 2025 11:42:54 +0200 Subject: Fixed TODOs, simplified API, give control over (session) buffer sizes * fix LoggingProxyServer cout race condition Signed-off-by: Toni Uhlig --- socks5.hpp | 70 +++++++++++++++++++++++--------------------------------------- 1 file changed, 26 insertions(+), 44 deletions(-) (limited to 'socks5.hpp') diff --git a/socks5.hpp b/socks5.hpp index 6765dff..9d21b93 100644 --- a/socks5.hpp +++ b/socks5.hpp @@ -14,7 +14,7 @@ #include #include -#include "fastbuffer.hpp" +#include "boost-asio-fastbuffer/fastbuffer.hpp" namespace SOCKS5 { class DestinationSocketBase : private boost::noncopyable { @@ -22,20 +22,13 @@ public: virtual ~DestinationSocketBase() {} template - void connect_tcp(boost::asio::ip::address &address, uint16_t port, - Callback &&handler) { - do_connect_tcp(address, port, std::forward(handler)); - } - template - void tcp_bind(boost::asio::ip::address &address, uint16_t port, - Callback &&handler) { - do_bind_tcp(address, port, std::forward(handler)); - } - template - void udp_bind(boost::asio::ip::address &address, uint16_t port, - Callback &&handler) { - do_bind_udp(address, port, std::forward(handler)); + void + connect_tcp(boost::asio::ip::tcp::resolver::results_type::const_iterator &it, + Callback &&handler) { + do_connect_tcp(it, std::forward(handler)); } + void tcp_bind() { throw std::runtime_error("TCP Bind not implemented"); } + void udp_bind() { throw std::runtime_error("UDP Bind not implemented"); } template bool read(BufferBase &buffer, Callback &&handler) { return do_read(buffer, std::forward(handler)); @@ -47,13 +40,9 @@ public: virtual bool cancel() = 0; protected: - virtual void - do_connect_tcp(boost::asio::ip::address &address, uint16_t port, - std::function) = 0; - virtual void do_bind_tcp(boost::asio::ip::address &address, uint16_t port, - std::function) = 0; - virtual void do_bind_udp(boost::asio::ip::address &address, uint16_t port, - std::function) = 0; + virtual void do_connect_tcp( + boost::asio::ip::tcp::resolver::results_type::const_iterator &it, + std::function) = 0; virtual bool do_read(BufferBase &, std::function) = 0; @@ -70,12 +59,8 @@ public: protected: void do_connect_tcp( - boost::asio::ip::address &address, uint16_t port, + boost::asio::ip::tcp::resolver::results_type::const_iterator &it, std::function handler) override; - void do_bind_tcp(boost::asio::ip::address &address, uint16_t port, - std::function) override; - void do_bind_udp(boost::asio::ip::address &address, uint16_t port, - std::function) override; bool do_read(BufferBase &buffer, std::function handler) override; @@ -85,11 +70,8 @@ protected: bool cancel() override; boost::asio::strand m_strand; - boost::optional> + boost::optional> m_socket; }; @@ -119,33 +101,37 @@ public: m_getDestinationSocket = std::forward(handler); start_internal(); } + void set_session_buffer_size(std::size_t buffer_size) { + session_buffer_size = buffer_size; + } private: void start_internal(); void recv_client_greeting(const boost::system::error_code &ec, std::size_t length); - void recv_client_greeting(std::size_t length); void send_server_greeting(bool auth_supported); void recv_connection_request(const boost::system::error_code &ec, std::size_t length); void process_connection_request(); void send_server_response(std::uint8_t proxy_cmd, std::uint8_t status_code); - void resolve_destination_host(std::uint8_t proxy_cmd, - const std::string_view &host, - std::uint16_t port); + void resolve_tcp_destination_host(std::uint8_t proxy_cmd, + const std::string_view &host, + std::uint16_t port); void connect_to_destination(std::uint8_t proxy_cmd); void handle_write(const boost::system::error_code &ec, std::size_t length); void handle_response_write(std::uint8_t proxy_cmd, std::uint8_t status_code, const boost::system::error_code &ec, std::size_t length); + std::size_t session_buffer_size; std::function( boost::asio::any_io_executor)> m_getDestinationSocket; std::shared_ptr m_destinationSocket; - boost::asio::ip::tcp::resolver m_resolver; - boost::asio::ip::address m_destinationAddress; - std::uint16_t m_destinationPort; + boost::optional m_tcp_resolver; + boost::asio::ip::tcp::resolver::results_type m_tcp_resolver_results; + boost::asio::ip::tcp::resolver::results_type::const_iterator + m_tcp_resolver_iter; }; class ProxySession : private ProxyBase, @@ -154,7 +140,7 @@ public: ProxySession(std::uint32_t session_id, boost::asio::ip::tcp::socket &&client_socket, std::shared_ptr &&dest_socket, - std::size_t buffer_size = BUFSIZ); + std::size_t buffer_size); ProxySession(std::uint32_t session_id, boost::asio::ip::tcp::socket &&client_socket, std::shared_ptr &&dest_socket, @@ -210,12 +196,8 @@ public: private: void do_connect_tcp( - boost::asio::ip::address &address, uint16_t port, + boost::asio::ip::tcp::resolver::results_type::const_iterator &it, std::function handler) override; - void do_bind_tcp(boost::asio::ip::address &address, uint16_t port, - std::function) override; - void do_bind_udp(boost::asio::ip::address &address, uint16_t port, - std::function) override; bool do_read(BufferBase &buffer, std::function handler) override; -- cgit v1.2.3