Skip to content

Commit 404a3ab

Browse files
committed
HTTPCLIENT-2292: HttpClient ignores socketConfig#getSocksProxyAddress
1 parent 8da4783 commit 404a3ab

File tree

8 files changed

+48
-67
lines changed

8 files changed

+48
-67
lines changed

httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
import java.io.IOException;
3030
import java.net.InetAddress;
3131
import java.net.InetSocketAddress;
32+
import java.net.Proxy;
3233
import java.net.Socket;
34+
import java.net.SocketAddress;
3335
import java.util.Arrays;
3436

3537
import org.apache.hc.client5.http.ConnectExceptionSupport;
@@ -146,13 +148,14 @@ public void connect(
146148
}
147149

148150
final Timeout soTimeout = socketConfig.getSoTimeout();
149-
151+
final SocketAddress socksProxyAddress = socketConfig.getSocksProxyAddress();
152+
final Proxy proxy = socksProxyAddress != null ? new Proxy(Proxy.Type.SOCKS, socksProxyAddress) : null;
150153
final int port = this.schemePortResolver.resolve(host);
151154
for (int i = 0; i < remoteAddresses.length; i++) {
152155
final InetAddress address = remoteAddresses[i];
153156
final boolean last = i == remoteAddresses.length - 1;
154157

155-
Socket sock = sf.createSocket(context);
158+
Socket sock = sf.createSocket(proxy, context);
156159
if (soTimeout != null) {
157160
sock.setSoTimeout(soTimeout.toMillisecondsIntBound());
158161
}

httpclient5/src/main/java/org/apache/hc/client5/http/socket/ConnectionSocketFactory.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929

3030
import java.io.IOException;
3131
import java.net.InetSocketAddress;
32+
import java.net.Proxy;
3233
import java.net.Socket;
3334

3435
import org.apache.hc.core5.annotation.Contract;
36+
import org.apache.hc.core5.annotation.Internal;
3537
import org.apache.hc.core5.annotation.ThreadingBehavior;
3638
import org.apache.hc.core5.http.HttpHost;
3739
import org.apache.hc.core5.http.protocol.HttpContext;
@@ -50,13 +52,21 @@ public interface ConnectionSocketFactory {
5052
* Creates new, unconnected socket. The socket should subsequently be passed to
5153
* {@link #connectSocket(TimeValue, Socket, HttpHost, InetSocketAddress, InetSocketAddress,
5254
* HttpContext) connectSocket} method.
53-
*
54-
* @return a new socket
55-
*
56-
* @throws IOException if an I/O error occurs while creating the socket
5755
*/
5856
Socket createSocket(HttpContext context) throws IOException;
5957

58+
/**
59+
* Creates new, unconnected socket via a proxy (generally SOCKS is expected).
60+
* The socket should subsequently be passed to {@link #connectSocket(TimeValue, Socket,
61+
* HttpHost, InetSocketAddress, InetSocketAddress, HttpContext) connectSocket} method.
62+
*
63+
* @since 5.2
64+
*/
65+
@Internal
66+
default Socket createSocket(Proxy proxy, HttpContext context) throws IOException {
67+
return createSocket(context);
68+
}
69+
6070
/**
6171
* Connects the socket to the target host with the given resolved remote address.
6272
*

httpclient5/src/main/java/org/apache/hc/client5/http/socket/PlainConnectionSocketFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import java.io.IOException;
3131
import java.net.InetSocketAddress;
32+
import java.net.Proxy;
3233
import java.net.Socket;
3334
import java.security.AccessController;
3435
import java.security.PrivilegedActionException;
@@ -60,6 +61,11 @@ public PlainConnectionSocketFactory() {
6061
super();
6162
}
6263

64+
@Override
65+
public Socket createSocket(final Proxy proxy, final HttpContext context) throws IOException {
66+
return proxy != null ? new Socket(proxy) : new Socket();
67+
}
68+
6369
@Override
6470
public Socket createSocket(final HttpContext context) throws IOException {
6571
return new Socket();

httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.io.IOException;
3131
import java.io.InputStream;
3232
import java.net.InetSocketAddress;
33+
import java.net.Proxy;
3334
import java.net.Socket;
3435
import java.security.AccessController;
3536
import java.security.PrivilegedActionException;
@@ -39,7 +40,6 @@
3940
import java.util.List;
4041
import java.util.regex.Pattern;
4142

42-
import javax.net.SocketFactory;
4343
import javax.net.ssl.HostnameVerifier;
4444
import javax.net.ssl.SSLContext;
4545
import javax.net.ssl.SSLException;
@@ -200,7 +200,12 @@ protected void prepareSocket(final SSLSocket socket, final HttpContext context)
200200

201201
@Override
202202
public Socket createSocket(final HttpContext context) throws IOException {
203-
return SocketFactory.getDefault().createSocket();
203+
return new Socket();
204+
}
205+
206+
@Override
207+
public Socket createSocket(final Proxy proxy, final HttpContext context) throws IOException {
208+
return new Socket(proxy);
204209
}
205210

206211
@Override

httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientExecuteSOCKS.java

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,17 @@
2727

2828
package org.apache.hc.client5.http.examples;
2929

30-
import java.io.IOException;
3130
import java.net.InetSocketAddress;
32-
import java.net.Proxy;
33-
import java.net.Socket;
3431

3532
import org.apache.hc.client5.http.classic.methods.HttpGet;
3633
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
3734
import org.apache.hc.client5.http.impl.classic.HttpClients;
3835
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
3936
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
40-
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
4137
import org.apache.hc.core5.http.HttpHost;
42-
import org.apache.hc.core5.http.config.Registry;
43-
import org.apache.hc.core5.http.config.RegistryBuilder;
4438
import org.apache.hc.core5.http.io.SocketConfig;
4539
import org.apache.hc.core5.http.io.entity.EntityUtils;
4640
import org.apache.hc.core5.http.message.StatusLine;
47-
import org.apache.hc.core5.http.protocol.HttpContext;
48-
import org.apache.hc.core5.util.TimeValue;
4941

5042
/**
5143
* How to send a request via SOCKS proxy.
@@ -55,10 +47,7 @@
5547
public class ClientExecuteSOCKS {
5648

5749
public static void main(final String[] args)throws Exception {
58-
final Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
59-
.register("http", new MyConnectionSocketFactory())
60-
.build();
61-
final InetSocketAddress socksaddr = new InetSocketAddress("mysockshost", 1234);
50+
final InetSocketAddress socksaddr = new InetSocketAddress("localhost", 1080);
6251
final PoolingHttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
6352
.setDefaultSocketConfig(SocketConfig.custom()
6453
.setSocksProxyAddress(socksaddr)
@@ -82,36 +71,4 @@ public static void main(final String[] args)throws Exception {
8271
}
8372
}
8473

85-
static class MyConnectionSocketFactory implements ConnectionSocketFactory {
86-
87-
@Override
88-
public Socket createSocket(final HttpContext context) throws IOException {
89-
final InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address");
90-
final Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr);
91-
return new Socket(proxy);
92-
}
93-
94-
@Override
95-
public Socket connectSocket(
96-
final TimeValue connectTimeout,
97-
final Socket socket,
98-
final HttpHost host,
99-
final InetSocketAddress remoteAddress,
100-
final InetSocketAddress localAddress,
101-
final HttpContext context) throws IOException {
102-
final Socket sock;
103-
if (socket != null) {
104-
sock = socket;
105-
} else {
106-
sock = createSocket(context);
107-
}
108-
if (localAddress != null) {
109-
sock.bind(localAddress);
110-
}
111-
sock.connect(remoteAddress, connectTimeout != null ? connectTimeout.toMillisecondsIntBound() : 0);
112-
return sock;
113-
}
114-
115-
}
116-
11774
}

httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestBasicHttpClientConnectionManager.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ public void testTargetConnect() throws Exception {
375375
Mockito.when(dnsResolver.resolve("somehost")).thenReturn(new InetAddress[] {remote});
376376
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
377377
Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(plainSocketFactory);
378-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
378+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
379379
Mockito.when(plainSocketFactory.connectSocket(
380380
Mockito.eq(socket),
381381
Mockito.any(),
@@ -389,7 +389,7 @@ public void testTargetConnect() throws Exception {
389389

390390
Mockito.verify(dnsResolver, Mockito.times(1)).resolve("somehost");
391391
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(target);
392-
Mockito.verify(plainSocketFactory, Mockito.times(1)).createSocket(context);
392+
Mockito.verify(plainSocketFactory, Mockito.times(1)).createSocket(null, context);
393393
Mockito.verify(plainSocketFactory, Mockito.times(1)).connectSocket(
394394
socket,
395395
target,
@@ -403,7 +403,7 @@ public void testTargetConnect() throws Exception {
403403

404404
Mockito.verify(dnsResolver, Mockito.times(2)).resolve("somehost");
405405
Mockito.verify(schemePortResolver, Mockito.times(2)).resolve(target);
406-
Mockito.verify(plainSocketFactory, Mockito.times(2)).createSocket(context);
406+
Mockito.verify(plainSocketFactory, Mockito.times(2)).createSocket(null, context);
407407
Mockito.verify(plainSocketFactory, Mockito.times(1)).connectSocket(
408408
socket,
409409
target,
@@ -447,7 +447,7 @@ public void testProxyConnectAndUpgrade() throws Exception {
447447
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
448448
Mockito.when(socketFactoryRegistry.lookup("http")).thenReturn(plainSocketFactory);
449449
Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslSocketFactory);
450-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
450+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
451451
Mockito.when(plainSocketFactory.connectSocket(
452452
Mockito.eq(socket),
453453
Mockito.any(),
@@ -461,7 +461,7 @@ public void testProxyConnectAndUpgrade() throws Exception {
461461

462462
Mockito.verify(dnsResolver, Mockito.times(1)).resolve("someproxy");
463463
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(proxy);
464-
Mockito.verify(plainSocketFactory, Mockito.times(1)).createSocket(context);
464+
Mockito.verify(plainSocketFactory, Mockito.times(1)).createSocket(null, context);
465465
Mockito.verify(plainSocketFactory, Mockito.times(1)).connectSocket(
466466
socket,
467467
proxy,

httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestHttpClientConnectionOperator.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void testConnect() throws Exception {
9191
Mockito.when(dnsResolver.resolve("somehost")).thenReturn(new InetAddress[] { ip1, ip2 });
9292
Mockito.when(socketFactoryRegistry.lookup("http")).thenReturn(plainSocketFactory);
9393
Mockito.when(schemePortResolver.resolve(host)).thenReturn(80);
94-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
94+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
9595
Mockito.when(plainSocketFactory.connectSocket(
9696
Mockito.any(),
9797
Mockito.any(),
@@ -141,7 +141,7 @@ public void testConnectTimeout() throws Exception {
141141
Mockito.when(dnsResolver.resolve("somehost")).thenReturn(new InetAddress[] { ip1, ip2 });
142142
Mockito.when(socketFactoryRegistry.lookup("http")).thenReturn(plainSocketFactory);
143143
Mockito.when(schemePortResolver.resolve(host)).thenReturn(80);
144-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
144+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
145145
Mockito.when(plainSocketFactory.connectSocket(
146146
Mockito.any(),
147147
Mockito.any(),
@@ -166,7 +166,7 @@ public void testConnectFailure() throws Exception {
166166
Mockito.when(dnsResolver.resolve("somehost")).thenReturn(new InetAddress[] { ip1, ip2 });
167167
Mockito.when(socketFactoryRegistry.lookup("http")).thenReturn(plainSocketFactory);
168168
Mockito.when(schemePortResolver.resolve(host)).thenReturn(80);
169-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
169+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
170170
Mockito.when(plainSocketFactory.connectSocket(
171171
Mockito.any(),
172172
Mockito.any(),
@@ -192,7 +192,7 @@ public void testConnectFailover() throws Exception {
192192
Mockito.when(dnsResolver.resolve("somehost")).thenReturn(new InetAddress[] { ip1, ip2 });
193193
Mockito.when(socketFactoryRegistry.lookup("http")).thenReturn(plainSocketFactory);
194194
Mockito.when(schemePortResolver.resolve(host)).thenReturn(80);
195-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
195+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
196196
Mockito.when(plainSocketFactory.connectSocket(
197197
Mockito.any(),
198198
Mockito.any(),
@@ -236,7 +236,7 @@ public void testConnectExplicitAddress() throws Exception {
236236

237237
Mockito.when(socketFactoryRegistry.lookup("http")).thenReturn(plainSocketFactory);
238238
Mockito.when(schemePortResolver.resolve(host)).thenReturn(80);
239-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
239+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
240240
Mockito.when(plainSocketFactory.connectSocket(
241241
Mockito.any(),
242242
Mockito.any(),

httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestPoolingHttpClientConnectionManager.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ public void testTargetConnect() throws Exception {
260260
Mockito.when(dnsResolver.resolve("somehost")).thenReturn(new InetAddress[]{remote});
261261
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
262262
Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(plainSocketFactory);
263-
Mockito.when(plainSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
263+
Mockito.when(plainSocketFactory.createSocket(Mockito.any(), Mockito.any())).thenReturn(socket);
264264
Mockito.when(plainSocketFactory.connectSocket(
265265
Mockito.eq(socket),
266266
Mockito.any(),
@@ -274,7 +274,7 @@ public void testTargetConnect() throws Exception {
274274

275275
Mockito.verify(dnsResolver, Mockito.times(1)).resolve("somehost");
276276
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(target);
277-
Mockito.verify(plainSocketFactory, Mockito.times(1)).createSocket(context);
277+
Mockito.verify(plainSocketFactory, Mockito.times(1)).createSocket(null, context);
278278
Mockito.verify(plainSocketFactory, Mockito.times(1)).connectSocket(
279279
socket,
280280
target,
@@ -288,7 +288,7 @@ public void testTargetConnect() throws Exception {
288288

289289
Mockito.verify(dnsResolver, Mockito.times(2)).resolve("somehost");
290290
Mockito.verify(schemePortResolver, Mockito.times(2)).resolve(target);
291-
Mockito.verify(plainSocketFactory, Mockito.times(2)).createSocket(context);
291+
Mockito.verify(plainSocketFactory, Mockito.times(2)).createSocket(null, context);
292292
Mockito.verify(plainSocketFactory, Mockito.times(1)).connectSocket(
293293
socket,
294294
target,
@@ -345,7 +345,7 @@ public void testProxyConnectAndUpgrade() throws Exception {
345345
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
346346
Mockito.when(socketFactoryRegistry.lookup("http")).thenReturn(plainsf);
347347
Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslsf);
348-
Mockito.when(plainsf.createSocket(Mockito.any())).thenReturn(mockSock);
348+
Mockito.when(plainsf.createSocket(Mockito.any(), Mockito.any())).thenReturn(mockSock);
349349
Mockito.when(plainsf.connectSocket(
350350
Mockito.eq(mockSock),
351351
Mockito.any(),
@@ -359,7 +359,7 @@ public void testProxyConnectAndUpgrade() throws Exception {
359359

360360
Mockito.verify(dnsResolver, Mockito.times(1)).resolve("someproxy");
361361
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(proxy);
362-
Mockito.verify(plainsf, Mockito.times(1)).createSocket(context);
362+
Mockito.verify(plainsf, Mockito.times(1)).createSocket(null, context);
363363
Mockito.verify(plainsf, Mockito.times(1)).connectSocket(
364364
mockSock,
365365
proxy,

0 commit comments

Comments
 (0)