Skip to content

Commit 6ce419c

Browse files
committed
fixed for HttpURLConnection. Fixed bugwith one role
1 parent 8ac72ec commit 6ce419c

File tree

8 files changed

+68
-47
lines changed

8 files changed

+68
-47
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import java.net.Socket;
6161
import java.net.StandardSocketOptions;
6262
import java.nio.charset.StandardCharsets;
63+
import java.util.Collections;
6364
import java.util.List;
6465
import java.util.Map;
6566
import java.util.TimeZone;
@@ -76,7 +77,7 @@ public class ApacheHttpConnectionImpl extends ClickHouseHttpConnection {
7677

7778
protected ApacheHttpConnectionImpl(ClickHouseNode server, ClickHouseRequest<?> request, ExecutorService executor)
7879
throws IOException {
79-
super(server, request);
80+
super(server, request, Collections.emptyMap());
8081

8182
client = newConnection(config);
8283
}

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ protected ClickHouseHttpConnection newConnection(ClickHouseHttpConnection connec
114114
}
115115

116116
try {
117-
return ClickHouseHttpConnectionFactory.createConnection(server, request, getExecutor());
117+
118+
return ClickHouseHttpConnectionFactory.createConnection(server, request, getExecutor(), buildAdditionalReqParams(request));
118119
} catch (IOException e) {
119120
throw new CompletionException(e);
120121
}
@@ -146,6 +147,18 @@ protected String buildQueryParams(Map<String, String> params) {
146147
return builder.toString();
147148
}
148149

150+
private Map<String, Serializable> buildAdditionalReqParams(ClickHouseRequest<?> sealedRequest) {
151+
ClickHouseConfig config = sealedRequest.getConfig();
152+
if (config.getBoolOption(ClickHouseHttpOption.REMEMBER_LAST_SET_ROLES)) {
153+
if (sealedRequest.hasSetting("_set_roles_stmt")) {
154+
return Collections.singletonMap("_roles", sealedRequest.getSettings().get("_set_roles_stmt"));
155+
} else if (!roles.isEmpty()) {
156+
return Collections.singletonMap("_roles", roles);
157+
}
158+
}
159+
return Collections.emptyMap();
160+
}
161+
149162
@Override
150163
protected ClickHouseResponse send(ClickHouseRequest<?> sealedRequest) throws ClickHouseException, IOException {
151164
ClickHouseHttpConnection conn = getConnection(sealedRequest);
@@ -174,19 +187,10 @@ protected ClickHouseResponse send(ClickHouseRequest<?> sealedRequest) throws Cli
174187
}
175188
}
176189
: null;
177-
Map<String, Serializable> additionalParams = null;
178-
179-
if (config.getBoolOption(ClickHouseHttpOption.REMEMBER_LAST_SET_ROLES)) {
180-
if (sealedRequest.hasSetting("_set_roles_stmt")) {
181-
additionalParams = Collections.singletonMap("_roles", sealedRequest.getSettings().get("_set_roles_stmt"));
182-
} else if (!roles.isEmpty()) {
183-
additionalParams = Collections.singletonMap("_roles", roles);
184-
}
185-
} else {
186-
additionalParams = Collections.emptyMap();
187-
}
188190

189191
if (conn.isReusable()) {
192+
Map<String, Serializable> additionalParams = buildAdditionalReqParams(sealedRequest);
193+
190194
ClickHouseNode server = sealedRequest.getServer();
191195
httpResponse = conn.post(config, sql, sealedRequest.getInputStream().orElse(null),
192196
sealedRequest.getExternalTables(), sealedRequest.getOutputStream().orElse(null),

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,8 @@ protected static void postData(ClickHouseConfig config, byte[] boundary, String
374374
protected final Map<String, String> defaultHeaders;
375375
protected final String url;
376376

377-
protected ClickHouseHttpConnection(ClickHouseNode server, ClickHouseRequest<?> request) {
377+
protected ClickHouseHttpConnection(ClickHouseNode server, ClickHouseRequest<?> request,
378+
Map<String, Serializable> additionalParams) {
378379
if (server == null || request == null) {
379380
throw new IllegalArgumentException("Non-null server and request are required");
380381
}
@@ -385,7 +386,7 @@ protected ClickHouseHttpConnection(ClickHouseNode server, ClickHouseRequest<?> r
385386
ClickHouseConfig c = request.getConfig();
386387
this.config = c;
387388
this.defaultHeaders = Collections.unmodifiableMap(createDefaultHeaders(c, server, getUserAgent(), ClickHouseHttpClient.getReferer(config)));
388-
this.url = buildUrl(server.getBaseUri(), request, Collections.emptyMap());
389+
this.url = buildUrl(server.getBaseUri(), request, additionalParams);
389390
log.debug("url [%s]", this.url);
390391
}
391392

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.clickhouse.client.http;
22

33
import java.io.IOException;
4+
import java.io.Serializable;
5+
import java.util.Collections;
6+
import java.util.Map;
47
import java.util.concurrent.ExecutorService;
58

69
import com.clickhouse.client.ClickHouseNode;
@@ -14,7 +17,14 @@ public final class ClickHouseHttpConnectionFactory {
1417
private static final Logger log = LoggerFactory.getLogger(ClickHouseHttpConnectionFactory.class);
1518

1619
public static ClickHouseHttpConnection createConnection(ClickHouseNode server, ClickHouseRequest<?> request,
17-
ExecutorService executor) throws IOException {
20+
ExecutorService executor) throws IOException
21+
{
22+
return createConnection(server, request, executor, Collections.emptyMap());
23+
}
24+
25+
public static ClickHouseHttpConnection createConnection(ClickHouseNode server, ClickHouseRequest<?> request,
26+
ExecutorService executor, Map<String,
27+
Serializable> additionalRequestParams) throws IOException {
1828
HttpConnectionProvider provider = request.getConfig().getOption(ClickHouseHttpOption.CONNECTION_PROVIDER,
1929
HttpConnectionProvider.class);
2030
if (provider == HttpConnectionProvider.APACHE_HTTP_CLIENT) {
@@ -27,7 +37,7 @@ public static ClickHouseHttpConnection createConnection(ClickHouseNode server, C
2737
log.warn("HTTP_CLIENT is only supported in JDK 11 or above, fall back to HTTP_URL_CONNECTION");
2838
}
2939

30-
return new HttpUrlConnectionImpl(server, request, executor);
40+
return new HttpUrlConnectionImpl(server, request, executor, additionalRequestParams);
3141
}
3242

3343
private ClickHouseHttpConnectionFactory() {

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717
import com.clickhouse.logging.Logger;
1818
import com.clickhouse.logging.LoggerFactory;
1919

20+
import javax.net.ssl.HostnameVerifier;
21+
import javax.net.ssl.HttpsURLConnection;
22+
import javax.net.ssl.SSLContext;
2023
import java.io.BufferedReader;
2124
import java.io.ByteArrayInputStream;
2225
import java.io.ByteArrayOutputStream;
2326
import java.io.IOException;
2427
import java.io.InputStream;
2528
import java.io.InputStreamReader;
2629
import java.io.OutputStream;
30+
import java.io.Serializable;
2731
import java.io.UncheckedIOException;
28-
2932
import java.net.ConnectException;
3033
import java.net.HttpURLConnection;
3134
import java.net.Proxy;
@@ -35,15 +38,11 @@
3538
import java.util.HashSet;
3639
import java.util.List;
3740
import java.util.Map;
41+
import java.util.Map.Entry;
3842
import java.util.Set;
3943
import java.util.TimeZone;
40-
import java.util.Map.Entry;
4144
import java.util.concurrent.ExecutorService;
4245

43-
import javax.net.ssl.HostnameVerifier;
44-
import javax.net.ssl.HttpsURLConnection;
45-
import javax.net.ssl.SSLContext;
46-
4746
public class HttpUrlConnectionImpl extends ClickHouseHttpConnection {
4847
private static final Logger log = LoggerFactory.getLogger(HttpUrlConnectionImpl.class);
4948

@@ -205,9 +204,9 @@ private void checkResponse(HttpURLConnection conn) throws IOException {
205204
}
206205
}
207206

208-
protected HttpUrlConnectionImpl(ClickHouseNode server, ClickHouseRequest<?> request, ExecutorService executor)
209-
throws IOException {
210-
super(server, request);
207+
protected HttpUrlConnectionImpl(ClickHouseNode server, ClickHouseRequest<?> request, ExecutorService executor,
208+
Map<String, Serializable> additionalParams) throws IOException {
209+
super(server, request, additionalParams);
211210

212211
conn = newConnection(url, true);
213212
}

clickhouse-http-client/src/test/java/com/clickhouse/client/http/ClickHouseHttpConnectionTest.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
package com.clickhouse.client.http;
22

3-
import java.io.IOException;
4-
import java.io.Serializable;
5-
import java.net.URI;
6-
import java.net.URL;
7-
import java.net.URLDecoder;
8-
import java.util.Collections;
9-
import java.util.HashMap;
10-
import java.util.HashSet;
11-
import java.util.List;
12-
import java.util.Map;
13-
143
import com.clickhouse.client.ClickHouseClient;
154
import com.clickhouse.client.ClickHouseConfig;
165
import com.clickhouse.client.ClickHouseNode;
@@ -21,18 +10,23 @@
2110
import com.clickhouse.data.ClickHouseFormat;
2211
import com.clickhouse.data.ClickHouseInputStream;
2312
import com.clickhouse.data.ClickHouseOutputStream;
24-
2513
import org.apache.hc.core5.net.URIBuilder;
2614
import org.testng.Assert;
2715
import org.testng.annotations.DataProvider;
2816
import org.testng.annotations.Test;
2917
import org.testng.collections.Sets;
30-
import org.testng.internal.invokers.Arguments;
18+
19+
import java.io.IOException;
20+
import java.io.Serializable;
21+
import java.net.URI;
22+
import java.util.Collections;
23+
import java.util.List;
24+
import java.util.Map;
3125

3226
public class ClickHouseHttpConnectionTest {
3327
static class SimpleHttpConnection extends ClickHouseHttpConnection {
3428
protected SimpleHttpConnection(ClickHouseNode server, ClickHouseRequest<?> request) {
35-
super(server, request);
29+
super(server, request, Collections.emptyMap());
3630
}
3731

3832
@Override

clickhouse-jdbc/src/main/javacc/ClickHouseSqlParser.jj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ public class ClickHouseSqlParser {
155155
roleBuff.append(ch);
156156
}
157157
}
158+
if (roleBuff.length() > 0) {
159+
roles.add(roleBuff.toString());
160+
}
158161
}
159162
anyArgsListStart = -1;
160163
}

clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/AccessManagementTest.java

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

3-
import com.clickhouse.client.ClickHouseClient;
43
import com.clickhouse.client.ClickHouseException;
54
import com.clickhouse.client.ClickHouseProtocol;
65
import com.clickhouse.client.http.config.ClickHouseHttpOption;
6+
import com.clickhouse.client.http.config.HttpConnectionProvider;
77
import com.clickhouse.data.ClickHouseVersion;
88
import org.testng.Assert;
99
import org.testng.annotations.DataProvider;
@@ -19,12 +19,14 @@
1919
public class AccessManagementTest extends JdbcIntegrationTest {
2020

2121
@Test(groups = "integration", dataProvider = "setRolesArgsForTestSetRole")
22-
public void testSetRoleDifferentConnections(String[] roles, String setRoleExpr, String[] activeRoles) throws SQLException {
22+
public void testSetRoleDifferentConnections(String[] roles, String setRoleExpr, String[] activeRoles,
23+
String connectionProvider) throws SQLException {
2324

2425
String httpEndpoint = "http://" + getServerAddress(ClickHouseProtocol.HTTP) + "/";
2526
String url = String.format("jdbc:ch:%s", httpEndpoint);
2627
Properties properties = new Properties();
2728
properties.setProperty(ClickHouseHttpOption.REMEMBER_LAST_SET_ROLES.getKey(), "true");
29+
properties.setProperty(ClickHouseHttpOption.CONNECTION_PROVIDER.getKey(), connectionProvider);
2830
ClickHouseDataSource dataSource = new ClickHouseDataSource(url, properties);
2931

3032
try (Connection connection = dataSource.getConnection("access_dba", "123")) {
@@ -59,13 +61,20 @@ public void testSetRoleDifferentConnections(String[] roles, String setRoleExpr,
5961
@DataProvider(name = "setRolesArgsForTestSetRole")
6062
private static Object[][] setRolesArgsForTestSetRole() {
6163
return new Object[][]{
62-
{new String[]{"ROL1", "ROL2"}, "set role ROL2, ROL1", new String[]{"ROL2"}},
63-
{new String[]{"ROL1", "ROL2"}, "set role ROL1,ROL2", new String[]{"ROL1"}},
64-
{new String[]{"ROL1", "\"ROL2,☺\""}, "set role \"ROL2,☺\", ROL1", new String[]{"ROL2,☺"}},
64+
{new String[]{"ROL1", "ROL2"}, "set role ROL2", new String[]{"ROL2"},
65+
HttpConnectionProvider.HTTP_URL_CONNECTION.name()},
66+
{new String[]{"ROL1", "ROL2"}, "set role ROL2", new String[]{"ROL2"},
67+
HttpConnectionProvider.APACHE_HTTP_CLIENT.name()},
68+
{new String[]{"ROL1", "ROL2"}, "set role ROL2, ROL1", new String[]{"ROL1", "ROL2"},
69+
HttpConnectionProvider.APACHE_HTTP_CLIENT.name()},
70+
{new String[]{"ROL1", "\"ROL2,☺\""}, "set role \"ROL2,☺\", ROL1", new String[]{"ROL2,☺", "ROL1"},
71+
HttpConnectionProvider.APACHE_HTTP_CLIENT.name()},
72+
{new String[]{"ROL1", "ROL2"}, "set role ROL2 , ROL1, ", new String[]{"ROL", "ROL1"},
73+
HttpConnectionProvider.APACHE_HTTP_CLIENT.name()},
6574
};
6675
}
6776

68-
private void assertRolesEquals(Connection connection, String ...expected) {
77+
private void assertRolesEquals(Connection connection, String... expected) {
6978
try {
7079
Statement st = connection.createStatement();
7180
ResultSet resultSet = st.executeQuery("select currentRoles()");
@@ -76,7 +85,7 @@ private void assertRolesEquals(Connection connection, String ...expected) {
7685
Arrays.sort(expected);
7786
System.out.print("Roles: ");
7887
for (String role : roles) {
79-
System.out.print("'" + role+ "', ");
88+
System.out.print("'" + role + "', ");
8089
}
8190
System.out.println();
8291
Assert.assertEquals(roles, expected);

0 commit comments

Comments
 (0)