This is an automated email from the ASF dual-hosted git repository. gaul pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jclouds.git
The following commit(s) were added to refs/heads/master by this push: new 88f0c341cf JCLOUDS-1616: Proxy credentials validation is missing in OkHttpCommandExecutorService API request 88f0c341cf is described below commit 88f0c341cfc4a6508db63794846e7c3902b8e255 Author: SATYANAN-ANAND <satyanan.an...@gmail.com> AuthorDate: Tue Aug 2 05:39:34 2022 -0700 JCLOUDS-1616: Proxy credentials validation is missing in OkHttpCommandExecutorService API request Added support for credentials validation --- .../http/okhttp/OkHttpCommandExecutorService.java | 33 ++++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java b/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java index 750d78820e..d3144de57f 100644 --- a/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java +++ b/drivers/okhttp/src/main/java/org/jclouds/http/okhttp/OkHttpCommandExecutorService.java @@ -32,11 +32,14 @@ import java.util.Map; import javax.annotation.Nullable; import javax.inject.Named; +import okhttp3.Authenticator; +import okhttp3.Credentials; import okhttp3.internal.http.HttpMethod; import okhttp3.Headers; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.Route; import okhttp3.RequestBody; import okhttp3.Response; @@ -55,6 +58,7 @@ import org.jclouds.http.internal.HttpWire; import org.jclouds.io.ContentMetadataCodec; import org.jclouds.io.MutableContentMetadata; import org.jclouds.io.Payload; +import org.jclouds.proxy.internal.GuiceProxyConfig; import com.google.common.base.Function; import com.google.common.collect.ImmutableMultimap; @@ -66,17 +70,19 @@ public final class OkHttpCommandExecutorService extends BaseHttpCommandExecutorS private final Function<URI, Proxy> proxyForURI; private final OkHttpClient globalClient; private final String userAgent; + private final GuiceProxyConfig proxyConfig; @Inject OkHttpCommandExecutorService(HttpUtils utils, ContentMetadataCodec contentMetadataCodec, DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler, DelegatingErrorHandler errorHandler, HttpWire wire, Function<URI, Proxy> proxyForURI, OkHttpClient okHttpClient, @Named(PROPERTY_IDEMPOTENT_METHODS) String idempotentMethods, - @Named(PROPERTY_USER_AGENT) String userAgent) { + @Named(PROPERTY_USER_AGENT) String userAgent, GuiceProxyConfig proxyConfig) { super(utils, contentMetadataCodec, retryHandler, ioRetryHandler, errorHandler, wire, idempotentMethods); this.proxyForURI = proxyForURI; this.globalClient = okHttpClient; this.userAgent = userAgent; + this.proxyConfig = proxyConfig; } @Override @@ -172,10 +178,27 @@ public final class OkHttpCommandExecutorService extends BaseHttpCommandExecutorS @Override protected HttpResponse invoke(Request nativeRequest) throws IOException, InterruptedException { - OkHttpClient requestScopedClient = globalClient.newBuilder() - .proxy(proxyForURI.apply(nativeRequest.url().uri())) - .build(); - + + OkHttpClient.Builder okHttpClientBuilder = globalClient.newBuilder() + .proxy(proxyForURI.apply(nativeRequest.url().uri())); + + if (proxyConfig.getCredentials().isPresent()) { + Authenticator proxyAuthenticator = new Authenticator() { + @Override + public Request authenticate(Route route, Response response) throws IOException { + if (response != null && response.code() == 407 + && !response.message().toLowerCase().contains("preemptive authenticate")) { + return null; + } + String credential = Credentials.basic(proxyConfig.getCredentials().get().identity, + proxyConfig.getCredentials().get().credential); + return response.request().newBuilder().header("Proxy-Authorization", credential).build(); + } + }; + okHttpClientBuilder.proxyAuthenticator(proxyAuthenticator); + } + OkHttpClient requestScopedClient = okHttpClientBuilder.build(); + Response response = requestScopedClient.newCall(nativeRequest).execute(); HttpResponse.Builder<?> builder = HttpResponse.builder();