Most of the factories did not behave well when Java is configured to use a SOCKS proxy for TCP connections.
See: http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html
And also this example:
public static void main(String... args) throws Exception { | |
// enable Socks proxy for all TCP connections | |
System.setProperty("socksProxyHost", "example.com"); | |
System.setProperty("socksProxyPort", "1080"); |
Socket socket = new Socket(); | |
try { |
Method m = Socket.class.getDeclaredMethod("getImpl"); | ||
m.setAccessible(true); | ||
System.out.println("used socket impl: " + m.invoke(socket).getClass().getName()); |
Field f = Socket.class.getDeclaredField("factory"); | ||
f.setAccessible(true); | ||
System.out.println("used socket factory: " + f.get(null)); |
socket.bind(new InetSocketAddress((InetAddress) null, 0)); | ||
System.out.println("socket bound to: " + socket.getLocalSocketAddress()); | ||
socket.connect(new InetSocketAddress("google.com", 80)); |
} finally { | ||
socket.close(); | ||
} |
}
In a standalone application this will mostly not matter because it is unlikely to use this option.
But if you are developing against the Eclipse IDE this will matter because Eclipse will set those
properties if you are adding proxies in the Eclipse configuration.
And this is the part it seems that Smack got wrong:
In the DirectSocketFactory class only 2 of 4 methods are using Proxy.NO_PROXY to bypass the
Java SOCKS proxy.
Furthermore the SOCKS4/5 and HTTP SocketFactory did not even use Proxy.NO_PROXY and so
we are connecting to the SOCKS proxy used by JAVA and afterwards we will connect to the SOCKS
proxy that was passed in in the ConnectionConfiguration class.
It would be really helpful if you offer a way to either completly bypass the JAVA SOCKS5 proxy option or always use
this option for all Smack SocketFactories.