Skip to content

Commit 421476f

Browse files
committed
Implemented Non SSL version of DatabricksHttpClient
1 parent 978878b commit 421476f

File tree

6 files changed

+73
-64
lines changed

6 files changed

+73
-64
lines changed

src/main/java/com/databricks/jdbc/client/http/DatabricksHttpClient.java

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,20 @@
99
import com.databricks.jdbc.client.DatabricksRetryHandlerException;
1010
import com.databricks.jdbc.client.IDatabricksHttpClient;
1111
import com.databricks.jdbc.commons.LogLevel;
12+
import com.databricks.jdbc.commons.util.HttpExecuteExceptionUtil;
1213
import com.databricks.jdbc.commons.util.LoggingUtil;
1314
import com.databricks.jdbc.driver.IDatabricksConnectionContext;
1415
import com.databricks.sdk.core.UserAgent;
1516
import com.google.common.annotations.VisibleForTesting;
1617
import java.io.IOException;
18+
import java.security.KeyManagementException;
19+
import java.security.KeyStoreException;
20+
import java.security.NoSuchAlgorithmException;
1721
import java.util.Objects;
1822
import java.util.Set;
1923
import java.util.concurrent.ConcurrentHashMap;
2024
import java.util.concurrent.TimeUnit;
25+
import javax.net.ssl.SSLContext;
2126
import org.apache.http.HttpException;
2227
import org.apache.http.HttpHost;
2328
import org.apache.http.HttpResponse;
@@ -30,13 +35,15 @@
3035
import org.apache.http.client.methods.HttpUriRequest;
3136
import org.apache.http.conn.UnsupportedSchemeException;
3237
import org.apache.http.conn.routing.HttpRoute;
38+
import org.apache.http.conn.ssl.NoopHostnameVerifier;
3339
import org.apache.http.impl.client.BasicCredentialsProvider;
3440
import org.apache.http.impl.client.CloseableHttpClient;
3541
import org.apache.http.impl.client.HttpClientBuilder;
3642
import org.apache.http.impl.client.ProxyAuthenticationStrategy;
3743
import org.apache.http.impl.conn.DefaultSchemePortResolver;
3844
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
3945
import org.apache.http.protocol.HttpContext;
46+
import org.apache.http.ssl.SSLContextBuilder;
4047

4148
/** Http client implementation to be used for executing http requests. */
4249
public class DatabricksHttpClient implements IDatabricksHttpClient {
@@ -76,6 +83,7 @@ public class DatabricksHttpClient implements IDatabricksHttpClient {
7683
private static boolean shouldRetryRateLimitError;
7784
private static int rateLimitRetryTimeout;
7885
protected static int idleHttpConnectionExpiry;
86+
private CloseableHttpClient httpDisabledSSLClient;
7987

8088
private DatabricksHttpClient(IDatabricksConnectionContext connectionContext) {
8189
initializeConnectionManager();
@@ -85,6 +93,7 @@ private DatabricksHttpClient(IDatabricksConnectionContext connectionContext) {
8593
shouldRetryRateLimitError = connectionContext.shouldRetryRateLimitError();
8694
rateLimitRetryTimeout = connectionContext.getRateLimitRetryTimeout();
8795
httpClient = makeClosableHttpClient(connectionContext);
96+
httpDisabledSSLClient = makeClosableDisabledSslHttpClient();
8897
idleHttpConnectionExpiry = connectionContext.getIdleHttpConnectionExpiry();
8998
}
9099

@@ -151,6 +160,23 @@ private CloseableHttpClient makeClosableHttpClient(
151160
return builder.build();
152161
}
153162

163+
private CloseableHttpClient makeClosableDisabledSslHttpClient() {
164+
try {
165+
// Create SSL context that trusts all certificates
166+
SSLContext sslContext =
167+
new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
168+
169+
// Create HttpClient with the SSL context
170+
return HttpClientBuilder.create()
171+
.setSSLContext(sslContext)
172+
.setSSLHostnameVerifier(new NoopHostnameVerifier())
173+
.build();
174+
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
175+
System.out.println("Error in creating HttpClient with the SSL context");
176+
}
177+
return null;
178+
}
179+
154180
private boolean handleRetry(IOException exception, int executionCount, HttpContext context) {
155181
int errCode = getErrorCode(exception);
156182
if (!isErrorCodeRetryable(errCode)) {
@@ -342,20 +368,22 @@ public CloseableHttpResponse execute(HttpUriRequest request) throws DatabricksHt
342368
try {
343369
return httpClient.execute(request);
344370
} catch (IOException e) {
345-
Throwable cause = e;
346-
while (cause != null) {
347-
if (cause instanceof DatabricksRetryHandlerException) {
348-
throw new DatabricksHttpException(cause.getMessage(), cause);
349-
}
350-
cause = cause.getCause();
351-
}
352-
String errorMsg =
353-
String.format(
354-
"Caught error while executing http request: [%s]. Error Message: [%s]",
355-
RequestSanitizer.sanitizeRequest(request), e);
356-
LoggingUtil.log(LogLevel.ERROR, errorMsg);
357-
throw new DatabricksHttpException(errorMsg, e);
371+
HttpExecuteExceptionUtil.throwException(e, request);
372+
}
373+
return null;
374+
}
375+
376+
public CloseableHttpResponse executeWithoutSSL(HttpUriRequest request)
377+
throws DatabricksHttpException {
378+
LoggingUtil.log(
379+
LogLevel.DEBUG,
380+
String.format("Executing HTTP request [{%s}]", RequestSanitizer.sanitizeRequest(request)));
381+
try {
382+
return httpDisabledSSLClient.execute(request);
383+
} catch (Exception e) {
384+
HttpExecuteExceptionUtil.throwException(e, request);
358385
}
386+
return null;
359387
}
360388

361389
@Override

src/main/java/com/databricks/jdbc/commons/util/DefaultHttpClientUtil.java

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.databricks.jdbc.commons.util;
2+
3+
import com.databricks.jdbc.client.DatabricksHttpException;
4+
import com.databricks.jdbc.client.DatabricksRetryHandlerException;
5+
import com.databricks.jdbc.client.http.RequestSanitizer;
6+
import com.databricks.jdbc.commons.LogLevel;
7+
import org.apache.http.client.methods.HttpUriRequest;
8+
9+
public class HttpExecuteExceptionUtil {
10+
public static void throwException(Exception e, HttpUriRequest request)
11+
throws DatabricksHttpException {
12+
Throwable cause = e;
13+
while (cause != null) {
14+
if (cause instanceof DatabricksRetryHandlerException) {
15+
throw new DatabricksHttpException(cause.getMessage(), cause);
16+
}
17+
cause = cause.getCause();
18+
}
19+
String errorMsg =
20+
String.format(
21+
"Caught error while executing http request: [%s]. Error Message: [%s]",
22+
RequestSanitizer.sanitizeRequest(request), e);
23+
LoggingUtil.log(LogLevel.ERROR, errorMsg);
24+
throw new DatabricksHttpException(errorMsg, e);
25+
}
26+
}

src/main/java/com/databricks/jdbc/core/DatabricksConnection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import java.util.stream.Collectors;
1919

2020
/** Implementation for Databricks specific connection. */
21-
public class DatabricksConnection implements IDatabricksConnection, Connection {
21+
public class DatabricksConnection implements IDatabricksConnection, Connection, AutoCloseable {
2222
private IDatabricksSession session;
2323
private final Set<IDatabricksStatement> statementSet = ConcurrentHashMap.newKeySet();
2424
private SQLWarning warnings = null;

src/main/java/com/databricks/jdbc/core/DatabricksSession.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import javax.annotation.Nullable;
2020

2121
/** Implementation for Session interface, which maintains an underlying session in SQL Gateway. */
22-
public class DatabricksSession implements IDatabricksSession {
22+
public class DatabricksSession implements IDatabricksSession, AutoCloseable {
2323
private final DatabricksClient databricksClient;
2424
private DatabricksMetadataClient databricksMetadataClient;
2525
private final ComputeResource computeResource;

src/main/java/com/databricks/jdbc/telemetry/DatabricksMetrics.java

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

33
import com.databricks.jdbc.client.DatabricksHttpException;
4-
import com.databricks.jdbc.commons.util.DefaultHttpClientUtil;
4+
import com.databricks.jdbc.client.http.DatabricksHttpClient;
55
import com.databricks.jdbc.core.DatabricksSQLException;
66
import com.databricks.jdbc.driver.IDatabricksConnectionContext;
77
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -15,7 +15,6 @@
1515
import org.apache.http.client.methods.HttpPost;
1616
import org.apache.http.client.methods.HttpUriRequest;
1717
import org.apache.http.client.utils.URIBuilder;
18-
import org.apache.http.impl.client.DefaultHttpClient;
1918
import org.apache.http.util.EntityUtils;
2019

2120
// TODO (Bhuvan) Flush out metrics once the driver connection is closed
@@ -31,7 +30,7 @@ public class DatabricksMetrics {
3130
private final String METRICS_TYPE = "metrics_type";
3231
private Boolean hasInitialExportOccurred = false;
3332
private String workspaceId = null;
34-
private DefaultHttpClient telemetryClient = null;
33+
private final DatabricksHttpClient telemetryClient;
3534

3635
private void setWorkspaceId(String workspaceId) {
3736
this.workspaceId = workspaceId;
@@ -68,13 +67,7 @@ public DatabricksMetrics(IDatabricksConnectionContext context) throws Databricks
6867
}
6968
String resourceId = context.getComputeResource().getWorkspaceId();
7069
setWorkspaceId(resourceId);
71-
// TODO: Bhuvan: Replace telemetry client with DatabricksHttpClient when non-SSL variation is
72-
// implemented
73-
try {
74-
telemetryClient = DefaultHttpClientUtil.getDefaultHttpClient();
75-
} catch (Exception e) {
76-
throw new DatabricksSQLException("Failed to create telemetry client");
77-
}
70+
this.telemetryClient = DatabricksHttpClient.getInstance(context);
7871
scheduleExportMetrics();
7972
}
8073

@@ -101,7 +94,7 @@ public String sendRequest(Map<String, Double> map, MetricsType metricsType) thro
10194
uriBuilder.addParameter(METRICS_TYPE, metricsType.name().equals("GAUGE") ? "1" : "0");
10295
HttpUriRequest request = new HttpPost(uriBuilder.build());
10396
// TODO (Bhuvan): Add authentication headers
104-
CloseableHttpResponse response = telemetryClient.execute(request);
97+
CloseableHttpResponse response = telemetryClient.executeWithoutSSL(request);
10598

10699
// Error handling
107100
if (response == null) {

0 commit comments

Comments
 (0)