| 810 | |
| 811 | template<typename Socket> |
| 812 | void SOCKSHandler::SendUpstreamRequest(std::shared_ptr<Socket>& upstreamSock) |
| 813 | { |
| 814 | LogPrint(eLogInfo, "SOCKS: Negotiating with upstream proxy"); |
| 815 | EnterState(UPSTREAM_HANDSHAKE); |
| 816 | if (upstreamSock) |
| 817 | { |
| 818 | auto s = shared_from_this (); |
| 819 | auto onHandshake = [s, &upstreamSock](const boost::system::error_code& ec) |
| 820 | { |
| 821 | if (!ec) |
| 822 | s->SocksUpstreamSuccess(upstreamSock); |
| 823 | else |
| 824 | { |
| 825 | s->SocksRequestFailed(SOCKS5_NET_UNREACH); |
| 826 | LogPrint(eLogError, "SOCKS: Upstream proxy failure: ", ec.message ()); |
| 827 | } |
| 828 | }; |
| 829 | switch (m_addrtype) |
| 830 | { |
| 831 | case ADDR_DNS: |
| 832 | i2p::transport::Socks5Handshake (*upstreamSock, std::make_pair(m_address.dns.ToString (), m_port), onHandshake); |
| 833 | break; |
| 834 | case ADDR_IPV4: |
| 835 | i2p::transport::Socks5Handshake (*upstreamSock, boost::asio::ip::tcp::endpoint ( |
| 836 | boost::asio::ip::address_v4(m_address.ip), m_port), onHandshake); |
| 837 | break; |
| 838 | case ADDR_IPV6: |
| 839 | { |
| 840 | boost::asio::ip::address_v6::bytes_type bytes; |
| 841 | memcpy (bytes.data (), m_address.ipv6, 16); |
| 842 | i2p::transport::Socks5Handshake (*upstreamSock, boost::asio::ip::tcp::endpoint ( |
| 843 | boost::asio::ip::address_v6(bytes), m_port), onHandshake); |
| 844 | break; |
| 845 | } |
| 846 | default: |
| 847 | LogPrint(eLogError, "SOCKS: Upstream proxy unknown address type: ", m_addrtype); |
| 848 | } |
| 849 | } |
| 850 | else |
| 851 | LogPrint(eLogError, "SOCKS: No upstream socket to send handshake to"); |
| 852 | } |
| 853 | |
| 854 | void SOCKSHandler::HandleUpstreamConnected(const boost::system::error_code & ecode, |
| 855 | const boost::asio::ip::tcp::endpoint& ep) |
no test coverage detected