From 47d1a67923c5613bf1fcc19642e37995f51a873c Mon Sep 17 00:00:00 2001 From: Murtadha Hubail Date: Wed, 23 Feb 2022 00:11:55 +0300 Subject: [PATCH] [NO ISSUE][TEST] Use preemptive basic auth in test requests - user model changes: no - storage format changes: no - interface changes: no Details: - When executing test http requests, use preemptive basic auth when set to avoid unnecessary request re-tries Change-Id: Ib847fc4faea8497b1dd1b635d7378891d4b7c0ce Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/15403 Integration-Tests: Jenkins Tested-by: Jenkins Reviewed-by: Murtadha Hubail Reviewed-by: Michael Blow --- .../asterix/test/common/TestExecutor.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index e2f50d37b5..14784c5645 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@ -130,10 +130,16 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.http.Consts; +import org.apache.http.HttpException; +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.auth.AuthScope; +import org.apache.http.auth.AuthState; +import org.apache.http.auth.Credentials; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.AuthCache; import org.apache.http.client.CredentialsProvider; @@ -157,6 +163,7 @@ import org.apache.http.impl.client.StandardHttpRequestRetryHandler; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HttpContext; +import org.apache.http.protocol.HttpCoreContext; import org.apache.http.util.EntityUtils; import org.apache.hyracks.algebricks.common.utils.Pair; import org.apache.hyracks.http.server.utils.HttpUtil; @@ -673,8 +680,8 @@ protected HttpResponse executeAndCheckHttpRequest(HttpUriRequest method, Predica protected HttpResponse executeHttpRequest(HttpUriRequest method) throws Exception { // https://issues.apache.org/jira/browse/ASTERIXDB-2315 ExecutorService executor = Executors.newSingleThreadExecutor(); - CloseableHttpClient client = - HttpClients.custom().setRetryHandler(StandardHttpRequestRetryHandler.INSTANCE).build(); + CloseableHttpClient client = HttpClients.custom().addInterceptorFirst(new PreemptiveAuthInterceptor()) + .setRetryHandler(StandardHttpRequestRetryHandler.INSTANCE).build(); Future future = executor.submit(() -> { try { return client.execute(method, getHttpContext()); @@ -2902,4 +2909,25 @@ private static boolean isCcEndPointPath(String endPoint) { private static boolean containsPort(String endPoint) { return StringUtils.contains(endPoint, ':'); } + + // adapted from https://stackoverflow.com/questions/2014700/preemptive-basic-authentication-with-apache-httpclient-4 + static class PreemptiveAuthInterceptor implements HttpRequestInterceptor { + + public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { + AuthState authState = (AuthState) context.getAttribute(HttpClientContext.TARGET_AUTH_STATE); + // if no auth scheme available yet, try to initialize it preemptively + if (authState.getAuthScheme() == null) { + CredentialsProvider credsProvider = + (CredentialsProvider) context.getAttribute(HttpClientContext.CREDS_PROVIDER); + if (credsProvider != null) { + HttpHost targetHost = (HttpHost) context.getAttribute(HttpCoreContext.HTTP_TARGET_HOST); + Credentials creds = + credsProvider.getCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort())); + if (creds != null) { + authState.update(new BasicScheme(), creds); + } + } + } + } + } }