|
1 | 1 | package com.databricks.jdbc.client.http; |
2 | 2 |
|
3 | 3 | import static com.databricks.jdbc.client.http.RetryHandler.*; |
4 | | -import static com.databricks.jdbc.driver.DatabricksJdbcConstants.FAKE_SERVICE_URI_PROP_SUFFIX; |
5 | | -import static com.databricks.jdbc.driver.DatabricksJdbcConstants.IS_FAKE_SERVICE_TEST_PROP; |
| 4 | +import static com.databricks.jdbc.driver.DatabricksJdbcConstants.*; |
6 | 5 | import static io.netty.util.NetUtil.LOCALHOST; |
7 | 6 |
|
8 | 7 | import com.databricks.jdbc.client.DatabricksHttpException; |
|
12 | 11 | import com.databricks.jdbc.commons.util.HttpExecuteExceptionUtil; |
13 | 12 | import com.databricks.jdbc.commons.util.LoggingUtil; |
14 | 13 | import com.databricks.jdbc.driver.IDatabricksConnectionContext; |
| 14 | +import com.databricks.sdk.core.DatabricksConfig; |
| 15 | +import com.databricks.sdk.core.ProxyConfig; |
15 | 16 | import com.databricks.sdk.core.UserAgent; |
| 17 | +import com.databricks.sdk.core.utils.ProxyUtils; |
16 | 18 | import com.google.common.annotations.VisibleForTesting; |
17 | 19 | import java.io.IOException; |
18 | 20 | import java.security.KeyManagementException; |
|
26 | 28 | import org.apache.http.HttpException; |
27 | 29 | import org.apache.http.HttpHost; |
28 | 30 | import org.apache.http.HttpResponse; |
29 | | -import org.apache.http.HttpResponseInterceptor; |
30 | | -import org.apache.http.auth.AuthScope; |
31 | | -import org.apache.http.auth.UsernamePasswordCredentials; |
32 | | -import org.apache.http.client.CredentialsProvider; |
33 | 31 | import org.apache.http.client.config.RequestConfig; |
34 | 32 | import org.apache.http.client.methods.CloseableHttpResponse; |
35 | 33 | import org.apache.http.client.methods.HttpUriRequest; |
36 | 34 | import org.apache.http.conn.UnsupportedSchemeException; |
37 | 35 | import org.apache.http.conn.routing.HttpRoute; |
38 | 36 | import org.apache.http.conn.ssl.NoopHostnameVerifier; |
39 | | -import org.apache.http.impl.client.BasicCredentialsProvider; |
40 | 37 | import org.apache.http.impl.client.CloseableHttpClient; |
41 | 38 | import org.apache.http.impl.client.HttpClientBuilder; |
42 | | -import org.apache.http.impl.client.ProxyAuthenticationStrategy; |
43 | 39 | import org.apache.http.impl.conn.DefaultSchemePortResolver; |
44 | 40 | import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; |
45 | 41 | import org.apache.http.protocol.HttpContext; |
@@ -147,16 +143,12 @@ private CloseableHttpClient makeClosableHttpClient( |
147 | 143 | .setConnectionManager(connectionManager) |
148 | 144 | .setUserAgent(getUserAgent()) |
149 | 145 | .setDefaultRequestConfig(makeRequestConfig()) |
150 | | - .setRetryHandler( |
151 | | - (exception, executionCount, context) -> |
152 | | - handleRetry(exception, executionCount, context)) |
153 | | - .addInterceptorFirst( |
154 | | - (HttpResponseInterceptor) |
155 | | - (httpResponse, httpContext) -> |
156 | | - handleResponseInterceptor(httpResponse, httpContext)); |
157 | | - |
158 | | - configureProxy(connectionContext, builder); |
159 | | - |
| 146 | + .setRetryHandler(this::handleRetry) |
| 147 | + .addInterceptorFirst(this::handleResponseInterceptor); |
| 148 | + setupProxy(connectionContext, builder); |
| 149 | + if (Boolean.parseBoolean(System.getProperty(IS_FAKE_SERVICE_TEST_PROP))) { |
| 150 | + setFakeServiceRouteInHttpClient(builder); |
| 151 | + } |
160 | 152 | return builder.build(); |
161 | 153 | } |
162 | 154 |
|
@@ -266,51 +258,39 @@ private void initializeRetryCounts(HttpContext httpContext) { |
266 | 258 | } |
267 | 259 | } |
268 | 260 |
|
269 | | - private void configureProxy( |
| 261 | + @VisibleForTesting |
| 262 | + public static void setupProxy( |
270 | 263 | IDatabricksConnectionContext connectionContext, HttpClientBuilder builder) { |
271 | | - if (connectionContext.getUseSystemProxy()) { |
272 | | - builder.useSystemProperties(); |
273 | | - } |
274 | | - // Override system proxy if proxy details are explicitly provided |
275 | | - // If cloud fetch proxy is provided use that, else use the regular proxy |
| 264 | + String proxyHost = null; |
| 265 | + Integer proxyPort = null; |
| 266 | + String proxyUser = null; |
| 267 | + String proxyPassword = null; |
| 268 | + ProxyConfig.ProxyAuthType proxyAuth = connectionContext.getProxyAuthType(); |
| 269 | + // System proxy is handled by the SDK. |
| 270 | + // If proxy details are explicitly provided use those for the connection. |
276 | 271 | if (connectionContext.getUseCloudFetchProxy()) { |
277 | | - setProxyDetailsInHttpClient( |
278 | | - builder, |
279 | | - connectionContext.getCloudFetchProxyHost(), |
280 | | - connectionContext.getCloudFetchProxyPort(), |
281 | | - connectionContext.getUseCloudFetchProxyAuth(), |
282 | | - connectionContext.getCloudFetchProxyUser(), |
283 | | - connectionContext.getCloudFetchProxyPassword()); |
| 272 | + proxyHost = connectionContext.getCloudFetchProxyHost(); |
| 273 | + proxyPort = connectionContext.getCloudFetchProxyPort(); |
| 274 | + proxyUser = connectionContext.getCloudFetchProxyUser(); |
| 275 | + proxyPassword = connectionContext.getCloudFetchProxyPassword(); |
| 276 | + proxyAuth = connectionContext.getCloudFetchProxyAuthType(); |
284 | 277 | } else if (connectionContext.getUseProxy()) { |
285 | | - setProxyDetailsInHttpClient( |
286 | | - builder, |
287 | | - connectionContext.getProxyHost(), |
288 | | - connectionContext.getProxyPort(), |
289 | | - connectionContext.getUseProxyAuth(), |
290 | | - connectionContext.getProxyUser(), |
291 | | - connectionContext.getProxyPassword()); |
292 | | - } else if (Boolean.parseBoolean(System.getProperty(IS_FAKE_SERVICE_TEST_PROP))) { |
293 | | - setFakeServiceRouteInHttpClient(builder); |
| 278 | + proxyHost = connectionContext.getProxyHost(); |
| 279 | + proxyPort = connectionContext.getProxyPort(); |
| 280 | + proxyUser = connectionContext.getProxyUser(); |
| 281 | + proxyPassword = connectionContext.getProxyPassword(); |
| 282 | + proxyAuth = connectionContext.getProxyAuthType(); |
294 | 283 | } |
295 | | - } |
296 | | - |
297 | | - @VisibleForTesting |
298 | | - public static void setProxyDetailsInHttpClient( |
299 | | - HttpClientBuilder builder, |
300 | | - String proxyHost, |
301 | | - int proxyPort, |
302 | | - Boolean useProxyAuth, |
303 | | - String proxyUser, |
304 | | - String proxyPassword) { |
305 | | - builder.setProxy(new HttpHost(proxyHost, proxyPort)); |
306 | | - if (useProxyAuth) { |
307 | | - CredentialsProvider credsProvider = new BasicCredentialsProvider(); |
308 | | - credsProvider.setCredentials( |
309 | | - new AuthScope(proxyHost, proxyPort), |
310 | | - new UsernamePasswordCredentials(proxyUser, proxyPassword)); |
311 | | - builder |
312 | | - .setDefaultCredentialsProvider(credsProvider) |
313 | | - .setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy()); |
| 284 | + if (proxyHost != null || connectionContext.getUseSystemProxy()) { |
| 285 | + ProxyConfig proxyConfig = |
| 286 | + new ProxyConfig(new DatabricksConfig()) |
| 287 | + .setUseSystemProperties(connectionContext.getUseSystemProxy()) |
| 288 | + .setHost(proxyHost) |
| 289 | + .setPort(proxyPort) |
| 290 | + .setUsername(proxyUser) |
| 291 | + .setPassword(proxyPassword) |
| 292 | + .setProxyAuthType(proxyAuth); |
| 293 | + ProxyUtils.setupProxy(proxyConfig, builder); |
314 | 294 | } |
315 | 295 | } |
316 | 296 |
|
|
0 commit comments