Update custom jgit connection factory for uri placeholders (#1037)
Fixes gh-1028 Fixes gh-1032
This commit is contained in:
committed by
Ryan Baxter
parent
e6b2d9eec0
commit
cf6b1f0a49
@@ -53,7 +53,7 @@ import static org.hamcrest.Matchers.instanceOf;
|
||||
/**
|
||||
* @author Dylan Roberts
|
||||
*/
|
||||
public class JGitEnvironmentRepositoryHttpProxyTests {
|
||||
public class ConfigurableHttpConnectionFactoryIntegrationTests {
|
||||
private static final ProxyHostProperties AUTHENTICATED_HTTP_PROXY = new ProxyHostProperties();
|
||||
static {
|
||||
AUTHENTICATED_HTTP_PROXY.setHost("http://authenticated.http.proxy");
|
||||
@@ -112,6 +112,20 @@ public class JGitEnvironmentRepositoryHttpProxyTests {
|
||||
makeRequest(httpClient, "https://somehost");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void httpsProxy_placeholderUrl() throws Exception {
|
||||
new SpringApplicationBuilder(TestConfiguration.class)
|
||||
.web(WebApplicationType.NONE)
|
||||
.properties(gitProperties("https://myrepo/{placeholder1}/{placeholder2}-repo.git", null, HTTPS_PROXY))
|
||||
.run();
|
||||
HttpClient httpClient = getHttpClientForUrl("https://myrepo/someplaceholdervalue/anotherplaceholdervalue-repo.git");
|
||||
expectedException.expectCause(allOf(
|
||||
instanceOf(UnknownHostException.class),
|
||||
hasProperty("message", containsString(HTTPS_PROXY.getHost()))));
|
||||
|
||||
makeRequest(httpClient, "https://somehost");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void httpsProxy_notCalled() throws Exception {
|
||||
String repoUrl = "https://myrepo/repo.git";
|
||||
@@ -157,6 +171,20 @@ public class JGitEnvironmentRepositoryHttpProxyTests {
|
||||
makeRequest(httpClient, "http://somehost");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void httpProxy_placeholderUrl() throws Exception {
|
||||
new SpringApplicationBuilder(TestConfiguration.class)
|
||||
.web(WebApplicationType.NONE)
|
||||
.properties(gitProperties("https://myrepo/{placeholder}-repo.git", HTTP_PROXY, null))
|
||||
.run();
|
||||
HttpClient httpClient = getHttpClientForUrl("https://myrepo/someplaceholdervalue-repo.git");
|
||||
expectedException.expectCause(allOf(
|
||||
instanceOf(UnknownHostException.class),
|
||||
hasProperty("message", containsString(HTTP_PROXY.getHost()))));
|
||||
|
||||
makeRequest(httpClient, "http://somehost");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void httpProxy_notCalled() throws Exception {
|
||||
String repoUrl = "https://myrepo/repo.git";
|
||||
@@ -0,0 +1,185 @@
|
||||
package org.springframework.cloud.config.server.environment;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.eclipse.jgit.transport.http.HttpConnection;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class HttpClientConfigurableHttpConnectionFactoryTest {
|
||||
|
||||
private HttpClientConfigurableHttpConnectionFactory connectionFactory;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
connectionFactory = new HttpClientConfigurableHttpConnectionFactory();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noConfigAdded() throws Exception {
|
||||
HttpConnection actual = connectionFactory.create(new URL("http://localhost/test.git"));
|
||||
|
||||
assertThat(actual).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchingUrl() throws Exception {
|
||||
String url = "http://localhost/test.git";
|
||||
MultipleJGitEnvironmentProperties properties = new MultipleJGitEnvironmentProperties();
|
||||
properties.setUri(url);
|
||||
connectionFactory.addConfiguration(properties);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL(url));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.values().stream().findFirst().get();
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void longerUrl() throws Exception {
|
||||
MultipleJGitEnvironmentProperties properties = new MultipleJGitEnvironmentProperties();
|
||||
String url = "http://localhost/test.git";
|
||||
properties.setUri(url);
|
||||
connectionFactory.addConfiguration(properties);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL(url + "/some/path.properties"));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.values().stream().findFirst().get();
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void urlWithPlaceholders() throws Exception {
|
||||
MultipleJGitEnvironmentProperties properties = new MultipleJGitEnvironmentProperties();
|
||||
properties.setUri("http://localhost/{placeholder}-test.git");
|
||||
connectionFactory.addConfiguration(properties);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL("http://localhost/value-test.git" + "/some/path.properties"));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.values().stream().findFirst().get();
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void composite_sameHost() throws Exception {
|
||||
MultipleJGitEnvironmentProperties properties1 = new MultipleJGitEnvironmentProperties();
|
||||
properties1.setUri("http://localhost/test1.git");
|
||||
MultipleJGitEnvironmentProperties properties2 = new MultipleJGitEnvironmentProperties();
|
||||
properties2.setUri("http://localhost/test2.git");
|
||||
connectionFactory.addConfiguration(properties1);
|
||||
connectionFactory.addConfiguration(properties2);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL(properties1.getUri()));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.get(properties1.getUri());
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void composite_differentHost() throws Exception {
|
||||
MultipleJGitEnvironmentProperties properties1 = new MultipleJGitEnvironmentProperties();
|
||||
properties1.setUri("http://localhost1/test.git");
|
||||
MultipleJGitEnvironmentProperties properties2 = new MultipleJGitEnvironmentProperties();
|
||||
properties2.setUri("http://localhost2/test.git");
|
||||
connectionFactory.addConfiguration(properties1);
|
||||
connectionFactory.addConfiguration(properties2);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL(properties1.getUri()));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.get(properties1.getUri());
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void composite_urlsWithPlaceholders() throws Exception {
|
||||
MultipleJGitEnvironmentProperties properties1 = new MultipleJGitEnvironmentProperties();
|
||||
properties1.setUri("http://localhost/path/{placeholder3}/more/test.git");
|
||||
MultipleJGitEnvironmentProperties properties2 = new MultipleJGitEnvironmentProperties();
|
||||
properties2.setUri("http://localhost/{placeholder1}/path/{placeholder2}-test.git");
|
||||
connectionFactory.addConfiguration(properties1);
|
||||
connectionFactory.addConfiguration(properties2);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL(properties2.getUri()
|
||||
.replace("{placeholder1}", "value1")
|
||||
.replace("{placeholder2}", "value2")));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.get(properties2.getUri());
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void composite_urlsWithPlaceholders_identicalTemplatesWontBeResolvedProperly() throws Exception {
|
||||
MultipleJGitEnvironmentProperties properties1 = new MultipleJGitEnvironmentProperties();
|
||||
properties1.setUri("http://localhost/{placeholder3}/path/{placeholder4}-test.git");
|
||||
MultipleJGitEnvironmentProperties properties2 = new MultipleJGitEnvironmentProperties();
|
||||
properties2.setUri("http://localhost/{placeholder1}/path/{placeholder2}-test.git");
|
||||
connectionFactory.addConfiguration(properties1);
|
||||
connectionFactory.addConfiguration(properties2);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL(properties2.getUri()
|
||||
.replace("{placeholder1}", "value1")
|
||||
.replace("{placeholder2}", "value2")));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.get(properties2.getUri());
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isNotSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void composite_longerUrlsWithPlaceholders() throws Exception {
|
||||
MultipleJGitEnvironmentProperties properties1 = new MultipleJGitEnvironmentProperties();
|
||||
properties1.setUri("http://localhost/path/{placeholder3}/{placeholder4}-test.git");
|
||||
MultipleJGitEnvironmentProperties properties2 = new MultipleJGitEnvironmentProperties();
|
||||
properties2.setUri("http://localhost/{placeholder1}/path/{placeholder2}-test.git");
|
||||
connectionFactory.addConfiguration(properties1);
|
||||
connectionFactory.addConfiguration(properties2);
|
||||
|
||||
HttpConnection actualConnection = connectionFactory.create(new URL(properties2.getUri()
|
||||
.replace("{placeholder1}", "value1")
|
||||
.replace("{placeholder2}", "value2") + "/some/path.properties"));
|
||||
|
||||
HttpClientBuilder expectedHttpClientBuilder = connectionFactory.httpClientBuildersByUri.get(properties2.getUri());
|
||||
HttpClientBuilder actualHttpClientBuilder = getActualHttpClientBuilder(actualConnection);
|
||||
assertThat(actualHttpClientBuilder).isSameAs(expectedHttpClientBuilder);
|
||||
}
|
||||
|
||||
private HttpClient getActualHttpClient(HttpConnection actualConnection) {
|
||||
Field clientField = ReflectionUtils.findField(actualConnection.getClass(), "client");
|
||||
ReflectionUtils.makeAccessible(clientField);
|
||||
return (HttpClient) ReflectionUtils.getField(clientField, actualConnection);
|
||||
}
|
||||
|
||||
private HttpClientBuilder getActualHttpClientBuilder(HttpConnection actualConnection) {
|
||||
HttpClient actualHttpClient = getActualHttpClient(actualConnection);
|
||||
Field closeablesField = ReflectionUtils.findField(actualHttpClient.getClass(), "closeables");
|
||||
ReflectionUtils.makeAccessible(closeablesField);
|
||||
List<?> closables = (List<?>) ReflectionUtils.getField(closeablesField, actualHttpClient);
|
||||
return closables.stream()
|
||||
.map(o -> {
|
||||
Field builderField = Arrays.stream(o.getClass().getDeclaredFields()).filter(field -> HttpClientBuilder.class.isAssignableFrom(field.getType())).findFirst().orElse(null);
|
||||
if (builderField != null) {
|
||||
ReflectionUtils.makeAccessible(builderField);
|
||||
return ReflectionUtils.getField(builderField, o);
|
||||
}
|
||||
return null;
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.map(HttpClientBuilder.class::cast).findFirst().get();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user