This is an automated email from the ASF dual-hosted git repository. cschneider pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-distribution-core.git
commit 32f8d671edcfcaacdd32c6907f17b05cf3c7b4cd Author: Christian Schneider <[email protected]> AuthorDate: Mon Nov 25 14:38:31 2024 +0100 SLING-12460 - Use system proxy for http --- .../impl/SimpleHttpDistributionTransport.java | 34 ++++++++++---------- .../impl/SimpleHttpDistributionTransportTest.java | 36 ++++++++++++++++++++++ 2 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java b/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java index 663ed2e4..7e994a22 100644 --- a/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java +++ b/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java @@ -31,6 +31,8 @@ import org.apache.http.client.fluent.Request; import org.apache.http.client.fluent.Response; import org.apache.http.conn.HttpHostConnectException; import org.apache.http.entity.ContentType; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import org.apache.http.protocol.HTTP; import org.apache.sling.api.resource.ResourceResolver; @@ -118,7 +120,6 @@ public class SimpleHttpDistributionTransport implements DistributionTransport { try { Executor executor = getExecutor(distributionContext); - Request req = Request.Post(distributionEndpoint.getUri()) .connectTimeout(httpConfiguration.getConnectTimeout()) .socketTimeout(httpConfiguration.getSocketTimeout()) @@ -215,24 +216,23 @@ public class SimpleHttpDistributionTransport implements DistributionTransport { return executor; } - private Executor buildAuthExecutor(String username, String password) { - URI uri = distributionEndpoint.getUri(); - Executor executor = Executor.newInstance() - .auth(new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()), username, password) - .authPreemptive(new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme())); - log.debug("authenticate user={}, endpoint={}", username, uri); - return executor; - } - - private Executor buildAuthExecutor(Map<String, String> credentialsMap) { - return (null != credentialsMap && !credentialsMap.containsKey(AUTHORIZATION)) - ? buildAuthExecutor(credentialsMap.get(USERNAME), credentialsMap.get(PASSWORD)) - : Executor.newInstance(); - } - private Executor buildExecutor() { + CloseableHttpClient client = HttpClients.createSystem(); Map<String, String> credentialsMap = getCredentialsMap(); - return buildAuthExecutor(credentialsMap); + if (needsAuthentication(credentialsMap)) { + String username = credentialsMap.get(USERNAME); + String password = credentialsMap.get(PASSWORD); + URI uri = distributionEndpoint.getUri(); + HttpHost host = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()); + log.debug("authenticate user={}, endpoint={}", username, uri); + return Executor.newInstance(client).auth(host, username, password).authPreemptive(host); + } else { + return Executor.newInstance(client); + } + } + + private boolean needsAuthentication(Map<String, String> credentialsMap) { + return null != credentialsMap && !credentialsMap.containsKey(AUTHORIZATION); } private String getAuthSecret() { diff --git a/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java b/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java index c8c56e3b..99692baf 100644 --- a/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java +++ b/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java @@ -19,19 +19,23 @@ package org.apache.sling.distribution.transport.impl; import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.fluent.Executor; import org.apache.http.client.fluent.Request; import org.apache.http.client.fluent.Response; +import org.apache.http.conn.HttpHostConnectException; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.distribution.DistributionRequest; import org.apache.sling.distribution.DistributionRequestType; import org.apache.sling.distribution.SimpleDistributionRequest; +import org.apache.sling.distribution.common.RecoverableDistributionException; import org.apache.sling.distribution.log.impl.DefaultDistributionLog; import org.apache.sling.distribution.packaging.DistributionPackage; import org.apache.sling.distribution.packaging.DistributionPackageBuilder; import org.apache.sling.distribution.packaging.DistributionPackageInfo; +import org.apache.sling.distribution.packaging.impl.InMemoryDistributionPackage; import org.apache.sling.distribution.transport.DistributionTransportSecret; import org.apache.sling.distribution.transport.DistributionTransportSecretProvider; import org.junit.Test; @@ -42,6 +46,8 @@ import java.net.URI; import java.util.HashMap; import java.util.Map; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Matchers.any; @@ -148,4 +154,34 @@ public class SimpleHttpDistributionTransportTest { RemoteDistributionPackage retrievedPackage = simpleHttpDistributionTransport.retrievePackage(resourceResolver, distributionRequest, distributionContext); assertNotNull(retrievedPackage); } + + @Test + public void testSetupTransport() throws Exception { + System.setProperty("http.proxyHost", "10.0.0.100"); + System.setProperty("http.proxyPort", "8800"); + + DistributionTransportSecret secret = mock(DistributionTransportSecret.class); + Map<String, String> credentialsMap = new HashMap<String, String>(); + credentialsMap.put("username", "foo"); + credentialsMap.put("password", "foo"); + when(secret.asCredentialsMap()).thenReturn(credentialsMap); + DistributionTransportSecretProvider secretProvider = mock(DistributionTransportSecretProvider.class); + when(secretProvider.getSecret(any(URI.class))).thenReturn(secret); + + DistributionEndpoint endpoint = new DistributionEndpoint("http://127.0.0.1:8080/some/resource"); + DistributionPackageBuilder packageBuilder = mock(DistributionPackageBuilder.class); + DistributionPackage distributionPackage = new InMemoryDistributionPackage("myid", "type", new byte[] {}, new HashMap<String, Object>()); + ResourceResolver resourceResolver = mock(ResourceResolver.class); + + SimpleHttpDistributionTransport transport = new SimpleHttpDistributionTransport(mock(DefaultDistributionLog.class), + endpoint, packageBuilder, secretProvider, new HttpConfiguration(1000, 1000)); + DistributionTransportContext context = new DistributionTransportContext(); + try { + transport.deliverPackage(resourceResolver, distributionPackage, context); + } catch (RecoverableDistributionException e) { + HttpHostConnectException cause = (HttpHostConnectException)e.getCause(); + HttpHost host = cause.getHost(); + assertThat(host.getHostName(), equalTo("127.0.0.1")); + } + } } \ No newline at end of file
