Skip to content

Commit 7645694

Browse files
committed
[JENKINS-75160] NO_PROXY configuration seems to be ignored (#972)
Fix proxy configuration to be used in the Apache client created from the ProxyConfiguration class using only the hostname instead passing the configured serverURL. The NO_PROXY configuration matches only hostname, that means if the given hostname contains also scheme or port match fails.
1 parent c4dd43b commit 7645694

File tree

3 files changed

+41
-24
lines changed

3 files changed

+41
-24
lines changed

src/main/java/com/cloudbees/jenkins/plugins/bitbucket/impl/client/AbstractBitbucketApi.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -166,17 +166,17 @@ protected HttpClientBuilder setupClientBuilder(@Nullable String host) {
166166
context = HttpClientContext.create();
167167
authenticator.configureContext(context, getHost());
168168
}
169-
setClientProxyParams(host, httpClientBuilder);
169+
setClientProxyParams(httpClientBuilder);
170170
return httpClientBuilder;
171171
}
172172

173-
private void setClientProxyParams(String host, HttpClientBuilder builder) {
173+
protected void setClientProxyParams(HttpClientBuilder builder) {
174174
Jenkins jenkins = Jenkins.getInstanceOrNull(); // because unit test
175175
ProxyConfiguration proxyConfig = jenkins != null ? jenkins.proxy : null;
176176

177177
final Proxy proxy;
178178
if (proxyConfig != null) {
179-
proxy = proxyConfig.createProxy(host);
179+
proxy = proxyConfig.createProxy(getHost().getHostName());
180180
} else {
181181
proxy = Proxy.NO_PROXY;
182182
}

src/test/java/com/cloudbees/jenkins/plugins/bitbucket/client/BitbucketCloudApiClientTest.java

+15-21
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@
3131
import com.cloudbees.jenkins.plugins.bitbucket.client.repository.BitbucketCloudRepository;
3232
import com.cloudbees.jenkins.plugins.bitbucket.endpoints.BitbucketCloudEndpoint;
3333
import com.cloudbees.jenkins.plugins.bitbucket.impl.util.JsonParser;
34+
import edu.umd.cs.findbugs.annotations.NonNull;
3435
import hudson.ProxyConfiguration;
3536
import io.jenkins.cli.shaded.org.apache.commons.lang.RandomStringUtils;
3637
import java.io.IOException;
3738
import java.io.InputStream;
38-
import java.net.InetSocketAddress;
39-
import java.net.Proxy;
4039
import java.nio.charset.StandardCharsets;
4140
import java.util.Date;
4241
import java.util.Optional;
@@ -51,13 +50,9 @@
5150

5251
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
5352
import static org.assertj.core.api.Assertions.assertThat;
54-
import static org.mockito.ArgumentMatchers.anyString;
55-
import static org.mockito.ArgumentMatchers.eq;
56-
import static org.mockito.Mockito.doReturn;
57-
import static org.mockito.Mockito.mock;
5853
import static org.mockito.Mockito.reset;
54+
import static org.mockito.Mockito.spy;
5955
import static org.mockito.Mockito.verify;
60-
import static org.mockito.Mockito.when;
6156

6257
class BitbucketCloudApiClientTest {
6358

@@ -69,17 +64,13 @@ private String loadPayload(String api) throws IOException {
6964

7065
@Test
7166
@WithJenkins
72-
void test_proxy_configurad_without_password(JenkinsRule r) throws Exception {
73-
Proxy proxy = mock(Proxy.class);
74-
when(proxy.address()).thenReturn(new InetSocketAddress("proxy.lan", 8080));
75-
ProxyConfiguration proxyConfiguration = mock(ProxyConfiguration.class);
76-
doReturn(proxy).when(proxyConfiguration).createProxy(anyString());
77-
doReturn("username").when(proxyConfiguration).getUserName();
67+
void test_proxy_configurated_without_password(JenkinsRule r) throws Exception {
68+
ProxyConfiguration proxyConfiguration = spy(new ProxyConfiguration("proxy.lan", 8080, "username", null));
7869

7970
r.jenkins.setProxy(proxyConfiguration);
8071
BitbucketIntegrationClientFactory.getApiMockClient(BitbucketCloudEndpoint.SERVER_URL);
8172

82-
verify(proxyConfiguration).createProxy(eq("bitbucket.org"));
73+
verify(proxyConfiguration).createProxy("api.bitbucket.org");
8374
verify(proxyConfiguration).getUserName();
8475
verify(proxyConfiguration).getSecretPassword();
8576
}
@@ -94,8 +85,7 @@ void verify_status_notitication_name_max_length() throws Exception {
9485

9586
client.postBuildStatus(status);
9687

97-
IRequestAudit clientAudit = ((IRequestAudit) client).getAudit();
98-
HttpRequestBase request = extractRequest(clientAudit);
88+
HttpRequestBase request = extractRequest(client);
9989
assertThat(request).isNotNull()
10090
.isInstanceOf(HttpPost.class);
10191
try (InputStream content = ((HttpPost) request).getEntity().getContent()) {
@@ -104,12 +94,17 @@ void verify_status_notitication_name_max_length() throws Exception {
10494
}
10595
}
10696

107-
private HttpRequestBase extractRequest(IRequestAudit clientAudit) {
97+
private HttpRequestBase extractRequest(@NonNull BitbucketApi client) {
98+
IRequestAudit audit = ((IRequestAudit) client).getAudit();
10899
ArgumentCaptor<HttpRequestBase> captor = ArgumentCaptor.forClass(HttpRequestBase.class);
109-
verify(clientAudit).request(captor.capture());
100+
verify(audit).request(captor.capture());
110101
return captor.getValue();
111102
}
112103

104+
private void resetAudit(@NonNull BitbucketApi client) {
105+
reset(((IRequestAudit) client).getAudit());
106+
}
107+
113108
@Test
114109
void get_repository_parse_correctly_date_from_cloud() throws Exception {
115110
BitbucketCloudRepository repository = JsonParser.toJava(loadPayload("getRepository"), BitbucketCloudRepository.class);
@@ -121,15 +116,14 @@ void get_repository_parse_correctly_date_from_cloud() throws Exception {
121116
@Test
122117
void verifyUpdateWebhookURL() throws Exception {
123118
BitbucketApi client = BitbucketIntegrationClientFactory.getApiMockClient(BitbucketCloudEndpoint.SERVER_URL);
124-
IRequestAudit audit = ((IRequestAudit) client).getAudit();
125119
Optional<? extends BitbucketWebHook> webHook = client.getWebHooks().stream()
126120
.filter(h -> h.getDescription().contains("Jenkins"))
127121
.findFirst();
128122
assertThat(webHook).isPresent();
129123

130-
reset(audit);
124+
resetAudit(client);
131125
client.updateCommitWebHook(webHook.get());
132-
HttpRequestBase request = extractRequest(audit);
126+
HttpRequestBase request = extractRequest(client);
133127
assertThat(request).isNotNull()
134128
.isInstanceOfSatisfying(HttpPut.class, put ->
135129
assertThat(put.getURI()).hasToString("https://api.bitbucket.org/2.0/repositories/amuniz/test-repos/hooks/%7B202cf34e-7ccf-44b7-ba6b-8827a14d5324%7D"));

src/test/java/com/cloudbees/jenkins/plugins/bitbucket/server/client/BitbucketServerAPIClientTest.java

+23
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@
3131
import com.cloudbees.jenkins.plugins.bitbucket.client.BitbucketIntegrationClientFactory;
3232
import com.cloudbees.jenkins.plugins.bitbucket.client.BitbucketIntegrationClientFactory.BitbucketServerIntegrationClient;
3333
import com.cloudbees.jenkins.plugins.bitbucket.client.BitbucketIntegrationClientFactory.IRequestAudit;
34+
import hudson.ProxyConfiguration;
3435
import io.jenkins.cli.shaded.org.apache.commons.lang.RandomStringUtils;
3536
import java.io.InputStream;
3637
import java.nio.charset.StandardCharsets;
3738
import java.util.List;
39+
import java.util.concurrent.atomic.AtomicReference;
3840
import org.apache.commons.io.IOUtils;
3941
import org.apache.http.HttpHost;
4042
import org.apache.http.HttpRequest;
@@ -64,6 +66,7 @@
6466
import static org.mockito.Mockito.mock;
6567
import static org.mockito.Mockito.mockStatic;
6668
import static org.mockito.Mockito.never;
69+
import static org.mockito.Mockito.spy;
6770
import static org.mockito.Mockito.verify;
6871

6972
@WithJenkins
@@ -223,4 +226,24 @@ void verify_HttpHost_built_when_server_has_context_root() throws Exception {
223226
verify(authenticator).configureContext(any(HttpClientContext.class), eq(expectedHost));
224227
}
225228

229+
@Issue("JENKINS-75160")
230+
@Test
231+
void test_no_proxy_configurations() throws Exception {
232+
ProxyConfiguration proxyConfiguration = spy(new ProxyConfiguration("proxy.lan", 8080, null, null, "*.internaldomain.com"));
233+
234+
j.jenkins.setProxy(proxyConfiguration);
235+
236+
AtomicReference<HttpClientBuilder> builderReference = new AtomicReference<>();
237+
try(BitbucketApi client = new BitbucketServerAPIClient("https://git.internaldomain.com:7990/bitbucket", "amuniz", "test-repos", mock(BitbucketAuthenticator.class), false) {
238+
@Override
239+
protected void setClientProxyParams(HttpClientBuilder builder) {
240+
builderReference.set(spy(builder));
241+
super.setClientProxyParams(builderReference.get());
242+
}
243+
}) {}
244+
245+
verify(proxyConfiguration).createProxy("git.internaldomain.com");
246+
verify(builderReference.get(), never()).setProxy(any(HttpHost.class));
247+
}
248+
226249
}

0 commit comments

Comments
 (0)