@ -291,10 +291,25 @@ struct ProxyCredentials
@@ -291,10 +291,25 @@ struct ProxyCredentials
std : : string password ;
} ;
std : : string Socks5ErrorString ( int err )
{
switch ( err ) {
case 0x01 : return " general failure " ;
case 0x02 : return " connection not allowed " ;
case 0x03 : return " network unreachable " ;
case 0x04 : return " host unreachable " ;
case 0x05 : return " connection refused " ;
case 0x06 : return " TTL expired " ;
case 0x07 : return " protocol error " ;
case 0x08 : return " address type not supported " ;
default : return " unknown " ;
}
}
/** Connect using SOCKS5 (as described in RFC1928) */
static bool Socks5 ( const std : : string & strDest , int port , const ProxyCredentials * auth , SOCKET & hSocket )
{
LogPrintf ( " SOCKS5 connecting %s \n " , strDest ) ;
LogPrint ( " net " , " SOCKS5 connecting %s \n " , strDest ) ;
if ( strDest . size ( ) > 255 ) {
CloseSocket ( hSocket ) ;
return error ( " Hostname too long " ) ;
@ -318,7 +333,8 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
@@ -318,7 +333,8 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
char pchRet1 [ 2 ] ;
if ( ! InterruptibleRecv ( pchRet1 , 2 , SOCKS5_RECV_TIMEOUT , hSocket ) ) {
CloseSocket ( hSocket ) ;
return error ( " Error reading proxy response " ) ;
LogPrintf ( " Socks5() connect to %s:%d failed: InterruptibleRecv() timeout or other failure \n " , strDest , port ) ;
return false ;
}
if ( pchRet1 [ 0 ] ! = 0x05 ) {
CloseSocket ( hSocket ) ;
@ -379,19 +395,10 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
@@ -379,19 +395,10 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
return error ( " Proxy failed to accept request " ) ;
}
if ( pchRet2 [ 1 ] ! = 0x00 ) {
// Failures to connect to a peer that are not proxy errors
CloseSocket ( hSocket ) ;
switch ( pchRet2 [ 1 ] )
{
case 0x01 : return error ( " Proxy error: general failure " ) ;
case 0x02 : return error ( " Proxy error: connection not allowed " ) ;
case 0x03 : return error ( " Proxy error: network unreachable " ) ;
case 0x04 : return error ( " Proxy error: host unreachable " ) ;
case 0x05 : return error ( " Proxy error: connection refused " ) ;
case 0x06 : return error ( " Proxy error: TTL expired " ) ;
case 0x07 : return error ( " Proxy error: protocol error " ) ;
case 0x08 : return error ( " Proxy error: address type not supported " ) ;
default : return error ( " Proxy error: unknown " ) ;
}
LogPrintf ( " Socks5() connect to %s:%d failed: %s \n " , strDest , port , Socks5ErrorString ( pchRet2 [ 1 ] ) ) ;
return false ;
}
if ( pchRet2 [ 2 ] ! = 0x00 ) {
CloseSocket ( hSocket ) ;
@ -423,7 +430,7 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
@@ -423,7 +430,7 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials
CloseSocket ( hSocket ) ;
return error ( " Error reading from proxy " ) ;
}
LogPrintf ( " SOCKS5 connected %s \n " , strDest ) ;
LogPrint ( " net " , " SOCKS5 connected %s \n " , strDest ) ;
return true ;
}