--- a/src/java.base/share/classes/java/net/Socket.java Tue Mar 05 10:02:36 2019 +0000
+++ b/src/java.base/share/classes/java/net/Socket.java Sat Mar 09 12:49:54 2019 +0000
@@ -155,12 +155,14 @@
epoint.getPort());
}
- SocketImpl si = SocketImpl.createPlatformSocketImpl(false);
- impl = (type == Proxy.Type.SOCKS) ? new SocksSocketImpl(p, si)
- : new HttpConnectSocketImpl(p, si);
+ // create a SOCKS or HTTP SocketImpl that delegates to a platform SocketImpl
+ SocketImpl delegate = SocketImpl.createPlatformSocketImpl(false);
+ impl = (type == Proxy.Type.SOCKS) ? new SocksSocketImpl(p, delegate)
+ : new HttpConnectSocketImpl(p, delegate);
impl.setSocket(this);
} else {
if (p == Proxy.NO_PROXY) {
+ // create a platform or custom SocketImpl for the DIRECT case
SocketImplFactory factory = Socket.factory;
if (factory == null) {
impl = SocketImpl.createPlatformSocketImpl(false);
@@ -512,15 +514,6 @@
});
}
- static SocketImpl createImpl() {
- SocketImplFactory factory = Socket.factory;
- if (factory != null) {
- return factory.createSocketImpl();
- } else {
- return SocketImpl.createPlatformSocketImpl(false);
- }
- }
-
void setImpl(SocketImpl si) {
impl = si;
impl.setSocket(this);
@@ -536,8 +529,9 @@
impl = factory.createSocketImpl();
checkOldImpl();
} else {
- SocketImpl si = SocketImpl.createPlatformSocketImpl(false);
- impl = new SocksSocketImpl(si);
+ // create a SOCKS SocketImpl that delegates to a platform SocketImpl
+ SocketImpl delegate = SocketImpl.createPlatformSocketImpl(false);
+ impl = new SocksSocketImpl(delegate);
}
if (impl != null)
impl.setSocket(this);
@@ -1736,6 +1730,10 @@
*/
private static volatile SocketImplFactory factory;
+ static SocketImplFactory socketImplFactory() {
+ return factory;
+ }
+
/**
* Sets the client socket implementation factory for the
* application. The factory can be specified only once.