Skip to content

Commit 4fd3358

Browse files
authored
Merge pull request #998 from zhicwu/develop
Add use_no_proxy option to avoid using proxy
2 parents 9e58b36 + a95ea43 commit 4fd3358

File tree

5 files changed

+66
-9
lines changed

5 files changed

+66
-9
lines changed

clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseConfig.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*/
2727
public class ClickHouseConfig implements Serializable {
2828
static final class ClientOptions {
29-
private static final ClientOptions instance = new ClientOptions();
29+
private static final ClientOptions INSTANCE = new ClientOptions();
3030

3131
private final Map<String, ClickHouseOption> customOptions;
3232

@@ -138,7 +138,7 @@ protected static final Object mergeMetricRegistry(List<ClickHouseConfig> list) {
138138
public static Map<ClickHouseOption, Serializable> toClientOptions(Map<?, ?> props) {
139139
Map<ClickHouseOption, Serializable> options = new HashMap<>();
140140
if (props != null && !props.isEmpty()) {
141-
Map<String, ClickHouseOption> customOptions = ClientOptions.instance.customOptions;
141+
Map<String, ClickHouseOption> customOptions = ClientOptions.INSTANCE.customOptions;
142142
for (Entry<?, ?> e : props.entrySet()) {
143143
if (e.getKey() == null || e.getValue() == null) {
144144
continue;
@@ -202,6 +202,7 @@ public static Map<ClickHouseOption, Serializable> toClientOptions(Map<?, ?> prop
202202
private final String sslKey;
203203
private final boolean useBlockingQueue;
204204
private final boolean useObjectsInArray;
205+
private final boolean useNoProxy;
205206
private final boolean useServerTimeZone;
206207
private final boolean useServerTimeZoneForDates;
207208
private final TimeZone timeZoneForDate;
@@ -297,6 +298,7 @@ public ClickHouseConfig(Map<ClickHouseOption, Serializable> options, ClickHouseC
297298
this.sslKey = (String) getOption(ClickHouseClientOption.SSL_KEY);
298299
this.useBlockingQueue = (boolean) getOption(ClickHouseClientOption.USE_BLOCKING_QUEUE);
299300
this.useObjectsInArray = (boolean) getOption(ClickHouseClientOption.USE_OBJECTS_IN_ARRAYS);
301+
this.useNoProxy = (boolean) getOption(ClickHouseClientOption.USE_NO_PROXY);
300302
this.useServerTimeZone = (boolean) getOption(ClickHouseClientOption.USE_SERVER_TIME_ZONE);
301303
this.useServerTimeZoneForDates = (boolean) getOption(ClickHouseClientOption.USE_SERVER_TIME_ZONE_FOR_DATES);
302304

@@ -649,6 +651,10 @@ public boolean isUseObjectsInArray() {
649651
return useObjectsInArray;
650652
}
651653

654+
public boolean isUseNoProxy() {
655+
return useNoProxy;
656+
}
657+
652658
public boolean isUseServerTimeZone() {
653659
return useServerTimeZone;
654660
}

clickhouse-client/src/main/java/com/clickhouse/client/config/ClickHouseClientOption.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ public enum ClickHouseClientOption implements ClickHouseOption {
287287
*/
288288
USE_OBJECTS_IN_ARRAYS("use_objects_in_arrays", false,
289289
"Whether Object[] should be used instead of primitive arrays."),
290+
/**
291+
* Whether to access ClickHouse server directly without using system wide proxy
292+
* including the one defined in JVM system properties.
293+
*/
294+
USE_NO_PROXY("use_no_proxy", false,
295+
"Whether to access ClickHouse server directly without using system wide proxy including the one defined in JVM system properties."),
290296
/**
291297
* Whether to use server time zone.
292298
*/

clickhouse-grpc-client/src/main/java/com/clickhouse/client/grpc/ClickHouseGrpcChannelFactory.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.clickhouse.client.grpc;
22

33
import java.io.FileNotFoundException;
4+
import java.io.IOException;
45
import java.io.InputStreamReader;
6+
import java.net.SocketAddress;
57
import java.nio.charset.StandardCharsets;
68
import java.util.Collections;
79
import java.util.HashMap;
@@ -11,6 +13,8 @@
1113
import com.google.gson.stream.JsonReader;
1214
import io.grpc.ManagedChannel;
1315
import io.grpc.ManagedChannelBuilder;
16+
import io.grpc.ProxiedSocketAddress;
17+
import io.grpc.ProxyDetector;
1418
import io.grpc.Status;
1519
import com.clickhouse.client.ClickHouseChecker;
1620
import com.clickhouse.client.ClickHouseConfig;
@@ -22,6 +26,18 @@
2226
import com.clickhouse.client.logging.LoggerFactory;
2327

2428
public abstract class ClickHouseGrpcChannelFactory {
29+
static class NoProxyDetector implements ProxyDetector {
30+
static final NoProxyDetector INSTANCE = new NoProxyDetector();
31+
32+
private NoProxyDetector() {
33+
}
34+
35+
@Override
36+
public ProxiedSocketAddress proxyFor(SocketAddress arg0) throws IOException {
37+
return null;
38+
}
39+
}
40+
2541
private static final Logger log = LoggerFactory.getLogger(ClickHouseGrpcChannelFactory.class);
2642

2743
private static final String PROP_NAME = "name";
@@ -164,6 +180,9 @@ protected void setupMisc() {
164180
builder.enableFullStreamDecompression();
165181
}
166182

183+
if (config.isUseNoProxy()) {
184+
builder.proxyDetector(NoProxyDetector.INSTANCE);
185+
}
167186
// TODO add interceptor to customize retry
168187
builder.maxInboundMessageSize((int) config.getOption(ClickHouseGrpcOption.MAX_INBOUND_MESSAGE_SIZE))
169188
.maxInboundMetadataSize((int) config.getOption(ClickHouseGrpcOption.MAX_INBOUND_METADATA_SIZE));

clickhouse-http-client/src/main/java/com/clickhouse/client/http/HttpUrlConnectionImpl.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.io.UncheckedIOException;
2828
import java.net.ConnectException;
2929
import java.net.HttpURLConnection;
30+
import java.net.Proxy;
3031
import java.net.URL;
3132
import java.nio.charset.Charset;
3233
import java.nio.charset.StandardCharsets;
@@ -107,7 +108,9 @@ private ClickHouseHttpResponse buildResponse() throws IOException {
107108
}
108109

109110
private HttpURLConnection newConnection(String url, boolean post) throws IOException {
110-
HttpURLConnection newConn = (HttpURLConnection) new URL(url).openConnection();
111+
HttpURLConnection newConn = config.isUseNoProxy()
112+
? (HttpURLConnection) new URL(url).openConnection(Proxy.NO_PROXY)
113+
: (HttpURLConnection) new URL(url).openConnection();
111114

112115
if ((newConn instanceof HttpsURLConnection) && config.isSsl()) {
113116
HttpsURLConnection secureConn = (HttpsURLConnection) newConn;
@@ -143,12 +146,10 @@ private String getResponseHeader(String header, String defaultValue) {
143146
private void setHeaders(HttpURLConnection conn, Map<String, String> headers) {
144147
headers = mergeHeaders(headers);
145148

146-
if (headers == null || headers.isEmpty()) {
147-
return;
148-
}
149-
150-
for (Entry<String, String> header : headers.entrySet()) {
151-
conn.setRequestProperty(header.getKey(), header.getValue());
149+
if (headers != null && !headers.isEmpty()) {
150+
for (Entry<String, String> header : headers.entrySet()) {
151+
conn.setRequestProperty(header.getKey(), header.getValue());
152+
}
152153
}
153154
}
154155

clickhouse-http-client/src/main/java11/com/clickhouse/client/http/HttpClientConnectionImpl.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
import java.io.UncheckedIOException;
3030
import java.net.ConnectException;
3131
import java.net.HttpURLConnection;
32+
import java.net.Proxy;
33+
import java.net.ProxySelector;
34+
import java.net.SocketAddress;
3235
import java.net.URI;
3336
import java.net.http.HttpClient;
3437
import java.net.http.HttpConnectTimeoutException;
@@ -52,6 +55,25 @@
5255
import javax.net.ssl.SSLContext;
5356

5457
public class HttpClientConnectionImpl extends ClickHouseHttpConnection {
58+
static class NoProxySelector extends ProxySelector {
59+
static final NoProxySelector INSTANCE = new NoProxySelector();
60+
61+
private static final List<Proxy> NO_PROXY_LIST = List.of(Proxy.NO_PROXY);
62+
63+
private NoProxySelector() {
64+
}
65+
66+
@Override
67+
public void connectFailed(URI uri, SocketAddress sa, IOException e) {
68+
// ignore
69+
}
70+
71+
@Override
72+
public List<Proxy> select(URI uri) {
73+
return NO_PROXY_LIST;
74+
}
75+
}
76+
5577
private static final Logger log = LoggerFactory.getLogger(HttpClientConnectionImpl.class);
5678

5779
private final HttpClient httpClient;
@@ -147,6 +169,9 @@ protected HttpClientConnectionImpl(ClickHouseNode server, ClickHouseRequest<?> r
147169
if (executor != null) {
148170
builder.executor(executor);
149171
}
172+
if (config.isUseNoProxy()) {
173+
builder.proxy(NoProxySelector.INSTANCE);
174+
}
150175
if (config.isSsl()) {
151176
builder.sslContext(ClickHouseSslContextProvider.getProvider().getSslContext(SSLContext.class, config)
152177
.orElse(null));

0 commit comments

Comments
 (0)