Skip to content

Commit 8e68aa4

Browse files
authored
Merge pull request #548 from enqueue/basicauth
Use Basic auth for credentials instead of query params
2 parents 09ab375 + bf88177 commit 8e68aa4

15 files changed

+680
-133
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
<testcontainers.version>1.15.1</testcontainers.version>
6666
<testng.version>6.14.3</testng.version>
6767
<mockito.version>1.10.19</mockito.version>
68+
<wiremock.version>2.27.2</wiremock.version>
6869
<helper-plugin.version>3.2.0</helper-plugin.version>
6970
<deploy-plugin.version>3.0.0-M1</deploy-plugin.version>
7071
<staging-plugin.version>1.6.8</staging-plugin.version>
@@ -151,6 +152,12 @@
151152
<version>${mockito.version}</version>
152153
<scope>test</scope>
153154
</dependency>
155+
<dependency>
156+
<groupId>com.github.tomakehurst</groupId>
157+
<artifactId>wiremock-jre8</artifactId>
158+
<version>${wiremock.version}</version>
159+
<scope>test</scope>
160+
</dependency>
154161
</dependencies>
155162

156163
<distributionManagement>

src/main/java/ru/yandex/clickhouse/ClickHouseConnectionImpl.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,13 @@ public ClickHouseStatement createStatement() throws SQLException {
111111
}
112112

113113
public ClickHouseStatement createStatement(int resultSetType) throws SQLException {
114-
return LogProxy.wrap(ClickHouseStatement.class, new ClickHouseStatementImpl(httpclient, this, properties, resultSetType));
114+
return LogProxy.wrap(
115+
ClickHouseStatement.class,
116+
new ClickHouseStatementImpl(
117+
httpclient,
118+
this,
119+
properties,
120+
resultSetType));
115121
}
116122

117123
@Deprecated
@@ -126,15 +132,37 @@ public TimeZone getTimeZone() {
126132
}
127133

128134
private ClickHouseStatement createClickHouseStatement(CloseableHttpClient httpClient) throws SQLException {
129-
return LogProxy.wrap(ClickHouseStatement.class, new ClickHouseStatementImpl(httpClient, this, properties, DEFAULT_RESULTSET_TYPE));
135+
return LogProxy.wrap(
136+
ClickHouseStatement.class,
137+
new ClickHouseStatementImpl(
138+
httpClient,
139+
this,
140+
properties,
141+
DEFAULT_RESULTSET_TYPE));
130142
}
131143

132144
public PreparedStatement createPreparedStatement(String sql, int resultSetType) throws SQLException {
133-
return LogProxy.wrap(PreparedStatement.class, new ClickHousePreparedStatementImpl(httpclient, this, properties, sql, getTimeZone(), resultSetType));
145+
return LogProxy.wrap(
146+
PreparedStatement.class,
147+
new ClickHousePreparedStatementImpl(
148+
httpclient,
149+
this,
150+
properties,
151+
sql,
152+
getTimeZone(),
153+
resultSetType));
134154
}
135155

136156
public ClickHousePreparedStatement createClickHousePreparedStatement(String sql, int resultSetType) throws SQLException {
137-
return LogProxy.wrap(ClickHousePreparedStatement.class, new ClickHousePreparedStatementImpl(httpclient, this, properties, sql, getTimeZone(), resultSetType));
157+
return LogProxy.wrap(
158+
ClickHousePreparedStatement.class,
159+
new ClickHousePreparedStatementImpl(
160+
httpclient,
161+
this,
162+
properties,
163+
sql,
164+
getTimeZone(),
165+
resultSetType));
138166
}
139167

140168

@@ -408,12 +436,13 @@ public boolean isValid(int timeout) throws SQLException {
408436

409437
return false;
410438
} finally {
411-
if (isAnotherHttpClient)
439+
if (isAnotherHttpClient) {
412440
try {
413441
closeableHttpClient.close();
414442
} catch (IOException e) {
415443
log.warn("Can't close a http client", e);
416444
}
445+
}
417446
}
418447
}
419448

@@ -462,22 +491,27 @@ public boolean isWrapperFor(Class<?> iface) throws SQLException {
462491
return iface.isAssignableFrom(getClass());
463492
}
464493

494+
@Override
465495
public void setSchema(String schema) throws SQLException {
466496
properties.setDatabase(schema);
467497
}
468498

499+
@Override
469500
public String getSchema() throws SQLException {
470501
return properties.getDatabase();
471502
}
472503

504+
@Override
473505
public void abort(Executor executor) throws SQLException {
474506
this.close();
475507
}
476508

509+
@Override
477510
public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {
478511

479512
}
480513

514+
@Override
481515
public int getNetworkTimeout() throws SQLException {
482516
return 0;
483517
}

src/main/java/ru/yandex/clickhouse/ClickHousePreparedStatementImpl.java

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,48 @@
11
package ru.yandex.clickhouse;
22

3-
import org.apache.http.entity.AbstractHttpEntity;
4-
import org.apache.http.impl.client.CloseableHttpClient;
5-
import ru.yandex.clickhouse.response.ClickHouseResponse;
6-
import ru.yandex.clickhouse.settings.ClickHouseProperties;
7-
import ru.yandex.clickhouse.settings.ClickHouseQueryParam;
8-
import ru.yandex.clickhouse.util.ClickHouseArrayUtil;
9-
import ru.yandex.clickhouse.util.ClickHouseValueFormatter;
10-
import ru.yandex.clickhouse.util.guava.StreamUtils;
11-
123
import java.io.IOException;
134
import java.io.InputStream;
145
import java.io.OutputStream;
156
import java.io.Reader;
167
import java.math.BigDecimal;
178
import java.net.URL;
9+
import java.sql.Array;
10+
import java.sql.Blob;
11+
import java.sql.Clob;
1812
import java.sql.Date;
19-
import java.sql.*;
20-
import java.util.*;
13+
import java.sql.NClob;
14+
import java.sql.ParameterMetaData;
15+
import java.sql.Ref;
16+
import java.sql.ResultSet;
17+
import java.sql.ResultSetMetaData;
18+
import java.sql.RowId;
19+
import java.sql.SQLException;
20+
import java.sql.SQLFeatureNotSupportedException;
21+
import java.sql.SQLSyntaxErrorException;
22+
import java.sql.SQLXML;
23+
import java.sql.Time;
24+
import java.sql.Timestamp;
25+
import java.util.ArrayList;
26+
import java.util.Arrays;
27+
import java.util.Calendar;
28+
import java.util.Collection;
29+
import java.util.Collections;
30+
import java.util.List;
31+
import java.util.Map;
32+
import java.util.TimeZone;
2133
import java.util.regex.Matcher;
2234
import java.util.regex.Pattern;
2335

36+
import org.apache.http.entity.AbstractHttpEntity;
37+
import org.apache.http.impl.client.CloseableHttpClient;
38+
39+
import ru.yandex.clickhouse.response.ClickHouseResponse;
40+
import ru.yandex.clickhouse.settings.ClickHouseProperties;
41+
import ru.yandex.clickhouse.settings.ClickHouseQueryParam;
42+
import ru.yandex.clickhouse.util.ClickHouseArrayUtil;
43+
import ru.yandex.clickhouse.util.ClickHouseValueFormatter;
44+
import ru.yandex.clickhouse.util.guava.StreamUtils;
45+
2446

2547
public class ClickHousePreparedStatementImpl extends ClickHouseStatementImpl implements ClickHousePreparedStatement {
2648

@@ -36,11 +58,11 @@ public class ClickHousePreparedStatementImpl extends ClickHouseStatementImpl imp
3658
private final ClickHousePreparedStatementParameter[] binds;
3759
private final List<List<String>> parameterList;
3860
private final boolean insertBatchMode;
39-
private List<byte[]> batchRows = new ArrayList<byte[]>();
61+
private List<byte[]> batchRows = new ArrayList<>();
4062

41-
public ClickHousePreparedStatementImpl(CloseableHttpClient client, ClickHouseConnection connection,
42-
ClickHouseProperties properties, String sql, TimeZone serverTimeZone,
43-
int resultSetType) throws SQLException
63+
public ClickHousePreparedStatementImpl(CloseableHttpClient client,
64+
ClickHouseConnection connection, ClickHouseProperties properties, String sql,
65+
TimeZone serverTimeZone, int resultSetType) throws SQLException
4466
{
4567
super(client, connection, properties, resultSetType);
4668
this.sql = sql;
@@ -295,7 +317,7 @@ public void addBatch() throws SQLException {
295317

296318
private List<byte[]> buildBatch() throws SQLException {
297319
checkBinded();
298-
List<byte[]> newBatches = new ArrayList<byte[]>(parameterList.size());
320+
List<byte[]> newBatches = new ArrayList<>(parameterList.size());
299321
StringBuilder sb = new StringBuilder();
300322
for (int i = 0, p = 0; i < parameterList.size(); i++) {
301323
List<String> pList = parameterList.get(i);
@@ -338,7 +360,7 @@ public int[] executeBatch(Map<ClickHouseQueryParam, String> additionalDBParams)
338360
sendStream(entity, insertSql, additionalDBParams);
339361
int[] result = new int[batchRows.size()];
340362
Arrays.fill(result, 1);
341-
batchRows = new ArrayList<byte[]>();
363+
batchRows = new ArrayList<>();
342364
return result;
343365
}
344366

src/main/java/ru/yandex/clickhouse/ClickHouseStatementImpl.java

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,28 @@
11
package ru.yandex.clickhouse;
22

3-
import com.google.common.base.Strings;
3+
import java.io.ByteArrayInputStream;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
import java.net.HttpURLConnection;
7+
import java.net.URI;
8+
import java.net.URISyntaxException;
9+
import java.sql.ResultSet;
10+
import java.sql.SQLException;
11+
import java.sql.SQLWarning;
12+
import java.util.ArrayList;
13+
import java.util.EnumMap;
14+
import java.util.List;
15+
import java.util.Map;
16+
import java.util.TimeZone;
17+
import java.util.UUID;
18+
419
import org.apache.http.Header;
520
import org.apache.http.HttpEntity;
621
import org.apache.http.HttpResponse;
722
import org.apache.http.NameValuePair;
823
import org.apache.http.client.methods.HttpGet;
924
import org.apache.http.client.methods.HttpPost;
25+
import org.apache.http.client.protocol.HttpClientContext;
1026
import org.apache.http.client.utils.URIBuilder;
1127
import org.apache.http.entity.ContentType;
1228
import org.apache.http.entity.StringEntity;
@@ -16,35 +32,34 @@
1632
import org.apache.http.util.EntityUtils;
1733
import org.slf4j.Logger;
1834
import org.slf4j.LoggerFactory;
35+
36+
import com.google.common.base.Strings;
37+
1938
import ru.yandex.clickhouse.domain.ClickHouseFormat;
2039
import ru.yandex.clickhouse.except.ClickHouseException;
2140
import ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier;
22-
import ru.yandex.clickhouse.response.*;
41+
import ru.yandex.clickhouse.response.ClickHouseLZ4Stream;
42+
import ru.yandex.clickhouse.response.ClickHouseResponse;
43+
import ru.yandex.clickhouse.response.ClickHouseResponseSummary;
44+
import ru.yandex.clickhouse.response.ClickHouseResultSet;
45+
import ru.yandex.clickhouse.response.ClickHouseScrollableResultSet;
46+
import ru.yandex.clickhouse.response.FastByteArrayOutputStream;
2347
import ru.yandex.clickhouse.settings.ClickHouseProperties;
2448
import ru.yandex.clickhouse.settings.ClickHouseQueryParam;
49+
import ru.yandex.clickhouse.util.ClickHouseHttpClientBuilder;
2550
import ru.yandex.clickhouse.util.ClickHouseRowBinaryInputStream;
2651
import ru.yandex.clickhouse.util.ClickHouseStreamCallback;
2752
import ru.yandex.clickhouse.util.Utils;
2853
import ru.yandex.clickhouse.util.guava.StreamUtils;
2954

30-
import java.io.ByteArrayInputStream;
31-
import java.io.IOException;
32-
import java.io.InputStream;
33-
import java.net.HttpURLConnection;
34-
import java.net.URI;
35-
import java.net.URISyntaxException;
36-
import java.sql.ResultSet;
37-
import java.sql.SQLException;
38-
import java.sql.SQLWarning;
39-
import java.util.*;
40-
41-
4255
public class ClickHouseStatementImpl extends ConfigurableApi<ClickHouseStatement> implements ClickHouseStatement {
4356

4457
private static final Logger log = LoggerFactory.getLogger(ClickHouseStatementImpl.class);
4558

4659
private final CloseableHttpClient client;
4760

61+
private final HttpClientContext httpContext;
62+
4863
protected ClickHouseProperties properties;
4964

5065
private ClickHouseConnection connection;
@@ -79,10 +94,12 @@ public class ClickHouseStatementImpl extends ConfigurableApi<ClickHouseStatement
7994
private static final String[] selectKeywords = new String[]{"SELECT", "WITH", "SHOW", "DESC", "EXISTS", "EXPLAIN"};
8095
private static final String databaseKeyword = "CREATE DATABASE";
8196

97+
8298
public ClickHouseStatementImpl(CloseableHttpClient client, ClickHouseConnection connection,
8399
ClickHouseProperties properties, int resultSetType) {
84100
super(null);
85101
this.client = client;
102+
this.httpContext = ClickHouseHttpClientBuilder.createClientContext(properties);
86103
this.connection = connection;
87104
this.properties = properties == null ? new ClickHouseProperties() : properties;
88105
this.initialDatabase = this.properties.getDatabase();
@@ -112,9 +129,9 @@ public ResultSet executeQuery(String sql,
112129

113130
// forcibly disable extremes for ResultSet queries
114131
if (additionalDBParams == null || additionalDBParams.isEmpty()) {
115-
additionalDBParams = new EnumMap<ClickHouseQueryParam, String>(ClickHouseQueryParam.class);
132+
additionalDBParams = new EnumMap<>(ClickHouseQueryParam.class);
116133
} else {
117-
additionalDBParams = new EnumMap<ClickHouseQueryParam, String>(additionalDBParams);
134+
additionalDBParams = new EnumMap<>(additionalDBParams);
118135
}
119136
additionalDBParams.put(ClickHouseQueryParam.EXTREMES, "0");
120137

@@ -621,7 +638,7 @@ private InputStream getInputStream(
621638
HttpPost post = new HttpPost(uri);
622639
post.setEntity(requestEntity);
623640

624-
HttpResponse response = client.execute(post);
641+
HttpResponse response = client.execute(post, httpContext);
625642
entity = response.getEntity();
626643
checkForErrorAndThrow(entity, response);
627644

@@ -687,7 +704,7 @@ private List<NameValuePair> getUrlQueryParams(
687704
Map<String, String> additionalRequestParams,
688705
boolean ignoreDatabase
689706
) {
690-
List<NameValuePair> result = new ArrayList<NameValuePair>();
707+
List<NameValuePair> result = new ArrayList<>();
691708

692709
if (sql != null) {
693710
result.add(new BasicNameValuePair("query", sql));
@@ -755,17 +772,21 @@ private boolean isQueryParamSet(ClickHouseQueryParam param, Map<ClickHouseQueryP
755772
}
756773

757774
private String getQueryParamValue(ClickHouseQueryParam param, Map<ClickHouseQueryParam, String> additionalClickHouseDBParams, Map<String, String> additionalRequestParams) {
758-
if (additionalRequestParams != null && additionalRequestParams.containsKey(param.getKey()) && !Strings.isNullOrEmpty(additionalRequestParams.get(param.getKey())))
775+
if (additionalRequestParams != null && additionalRequestParams.containsKey(param.getKey()) && !Strings.isNullOrEmpty(additionalRequestParams.get(param.getKey()))) {
759776
return additionalRequestParams.get(param.getKey());
777+
}
760778

761-
if (getRequestParams().containsKey(param.getKey()) && !Strings.isNullOrEmpty(getRequestParams().get(param.getKey())))
779+
if (getRequestParams().containsKey(param.getKey()) && !Strings.isNullOrEmpty(getRequestParams().get(param.getKey()))) {
762780
return getRequestParams().get(param.getKey());
781+
}
763782

764-
if (additionalClickHouseDBParams != null && additionalClickHouseDBParams.containsKey(param) && !Strings.isNullOrEmpty(additionalClickHouseDBParams.get(param)))
783+
if (additionalClickHouseDBParams != null && additionalClickHouseDBParams.containsKey(param) && !Strings.isNullOrEmpty(additionalClickHouseDBParams.get(param))) {
765784
return additionalClickHouseDBParams.get(param);
785+
}
766786

767-
if (getAdditionalDBParams().containsKey(param) && !Strings.isNullOrEmpty(getAdditionalDBParams().get(param)))
787+
if (getAdditionalDBParams().containsKey(param) && !Strings.isNullOrEmpty(getAdditionalDBParams().get(param))) {
768788
return getAdditionalDBParams().get(param);
789+
}
769790

770791
return properties.asProperties().getProperty(param.getKey());
771792
}
@@ -775,7 +796,7 @@ private URI followRedirects(URI uri) throws IOException, URISyntaxException {
775796
int redirects = 0;
776797
while (redirects < properties.getMaxRedirects()) {
777798
HttpGet httpGet = new HttpGet(uri);
778-
HttpResponse response = client.execute(httpGet);
799+
HttpResponse response = client.execute(httpGet, httpContext);
779800
if (response.getStatusLine().getStatusCode() == 307) {
780801
uri = new URI(response.getHeaders("Location")[0].getValue());
781802
redirects++;
@@ -896,7 +917,7 @@ void sendStream(Writer writer, HttpEntity content) throws ClickHouseException {
896917
httpPost.addHeader("Content-Encoding", writer.getCompression().name());
897918
}
898919
httpPost.setEntity(content);
899-
HttpResponse response = client.execute(httpPost);
920+
HttpResponse response = client.execute(httpPost, httpContext);
900921
entity = response.getEntity();
901922
checkForErrorAndThrow(entity, response);
902923

@@ -932,10 +953,12 @@ private void checkForErrorAndThrow(HttpEntity entity, HttpResponse response) thr
932953
}
933954
}
934955

956+
@Override
935957
public void closeOnCompletion() throws SQLException {
936958
closeOnCompletion = true;
937959
}
938960

961+
@Override
939962
public boolean isCloseOnCompletion() throws SQLException {
940963
return closeOnCompletion;
941964
}

0 commit comments

Comments
 (0)