Skip to content

Commit 232b3aa

Browse files
qwordgastaldi
andcommitted
FORGE-2793: Add custom proxy exceptions support with property nonProxyHosts (#633)
Co-authored-by: George Gastaldi <gegastaldi@gmail.com>
1 parent b849f35 commit 232b3aa

File tree

3 files changed

+119
-10
lines changed

3 files changed

+119
-10
lines changed

configuration/impl/src/main/java/org/jboss/forge/addon/configuration/proxy/ForgeProxySelector.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ public List<Proxy> select(URI uri)
4141
{
4242
throw new IllegalArgumentException("URI can't be null.");
4343
}
44-
String protocol = uri.getScheme();
45-
if ("http".equalsIgnoreCase(protocol) || "https".equalsIgnoreCase(protocol))
44+
45+
if (proxySettings != null && isProxyAvailable(uri))
4646
{
4747
ArrayList<Proxy> result = new ArrayList<Proxy>();
4848
result.add(new Proxy(Type.HTTP, new InetSocketAddress(proxySettings.getProxyHost(),
@@ -73,6 +73,20 @@ protected PasswordAuthentication getPasswordAuthentication()
7373
}
7474
}
7575

76+
private boolean isProxyAvailable(final URI uri)
77+
{
78+
final String host = uri.getHost();
79+
final String protocol = uri.getScheme();
80+
81+
boolean isValidProtocol =
82+
"http".equalsIgnoreCase(protocol) || "https".equalsIgnoreCase(protocol);
83+
84+
boolean isHostExcluded =
85+
proxySettings.getNonProxyHosts() != null
86+
&& proxySettings.getNonProxyHosts().contains(host);
87+
return isValidProtocol && !isHostExcluded;
88+
}
89+
7690
@Override
7791
public void connectFailed(URI uri, SocketAddress sa, IOException ioe)
7892
{

configuration/impl/src/main/java/org/jboss/forge/addon/configuration/proxy/ProxySettings.java

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/**
22
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
33
*
4-
* Licensed under the Eclipse Public License version 1.0, available at
5-
* http://www.eclipse.org/legal/epl-v10.html
4+
* Licensed under the Eclipse Public License version 1.0, available at http://www.eclipse.org/legal/epl-v10.html
65
*/
76
package org.jboss.forge.addon.configuration.proxy;
87

8+
import java.util.Arrays;
9+
import java.util.List;
910
import org.jboss.forge.addon.configuration.Configuration;
1011

1112
public class ProxySettings
@@ -15,29 +16,38 @@ public class ProxySettings
1516
private static final String PROXY_CONFIG_PORT_KEY = "port";
1617
private static final String PROXY_CONFIG_USERNAME_KEY = "username";
1718
private static final String PROXY_CONFIG_PASSWORD_KEY = "password";
19+
private static final String PROXY_CONFIG_NON_PROXY_HOSTS = "nonProxyHosts";
1820

1921
private final String proxyHost;
2022
private final int proxyPort;
2123
private final String proxyUserName;
2224
private final String proxyPassword;
25+
private final List<String> nonProxyHosts;
2326

24-
private ProxySettings(String proxyHost, int proxyPort, String proxyUserName, String proxyPassword)
27+
private ProxySettings(String proxyHost, int proxyPort, String proxyUserName, String proxyPassword,
28+
List<String> nonProxyHosts)
2529
{
2630
this.proxyHost = proxyHost;
2731
this.proxyPort = proxyPort;
2832
this.proxyUserName = proxyUserName;
2933
this.proxyPassword = proxyPassword;
34+
this.nonProxyHosts = nonProxyHosts;
3035
}
3136

3237
public static ProxySettings fromHostAndPort(String proxyHost, int proxyPort)
3338
{
34-
return new ProxySettings(proxyHost, proxyPort, null, null);
39+
return new ProxySettings(proxyHost, proxyPort, null, null, null);
40+
}
41+
42+
public static ProxySettings fromHostPortAndNonProxyHosts(String proxyHost, int proxyPort, List<String> nonProxyHosts)
43+
{
44+
return new ProxySettings(proxyHost, proxyPort, null, null, nonProxyHosts);
3545
}
3646

3747
public static ProxySettings fromHostPortAndCredentials(String proxyHost, int proxyPort,
3848
String proxyUserName, String proxyPassword)
3949
{
40-
return new ProxySettings(proxyHost, proxyPort, proxyUserName, proxyPassword);
50+
return new ProxySettings(proxyHost, proxyPort, proxyUserName, proxyPassword, null);
4151
}
4252

4353
public static ProxySettings fromForgeConfiguration(Configuration configuration)
@@ -46,9 +56,20 @@ public static ProxySettings fromForgeConfiguration(Configuration configuration)
4656
Configuration proxyConfig = configuration.subset("proxy");
4757
if (proxyConfig != null && !proxyConfig.isEmpty())
4858
{
49-
return new ProxySettings(proxyConfig.getString(PROXY_CONFIG_HOST_KEY),
50-
proxyConfig.getInt(PROXY_CONFIG_PORT_KEY), proxyConfig.getString(PROXY_CONFIG_USERNAME_KEY),
51-
proxyConfig.getString(PROXY_CONFIG_PASSWORD_KEY));
59+
final String nonProxyHosts = proxyConfig.getString(PROXY_CONFIG_NON_PROXY_HOSTS);
60+
List<String> nonProxyHostsList = null;
61+
if (nonProxyHosts != null)
62+
{
63+
nonProxyHostsList = Arrays.asList(nonProxyHosts.split(","));
64+
}
65+
66+
return new ProxySettings(
67+
proxyConfig.getString(PROXY_CONFIG_HOST_KEY),
68+
proxyConfig.getInt(PROXY_CONFIG_PORT_KEY),
69+
proxyConfig.getString(PROXY_CONFIG_USERNAME_KEY),
70+
proxyConfig.getString(PROXY_CONFIG_PASSWORD_KEY),
71+
nonProxyHostsList
72+
);
5273
}
5374
else
5475
{
@@ -76,6 +97,11 @@ public String getProxyPassword()
7697
return proxyPassword;
7798
}
7899

100+
public List<String> getNonProxyHosts()
101+
{
102+
return nonProxyHosts;
103+
}
104+
79105
public boolean isAuthenticationSupported()
80106
{
81107
return proxyUserName != null && !"".equals(proxyUserName);
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.jboss.forge.addon.configuration.proxy;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.net.Proxy;
6+
import java.net.URI;
7+
import java.net.URISyntaxException;
8+
import java.util.Collections;
9+
import java.util.List;
10+
import org.apache.commons.configuration.BaseConfiguration;
11+
import org.jboss.forge.addon.configuration.Configuration;
12+
import org.jboss.forge.addon.configuration.ConfigurationAdapter;
13+
import org.junit.Test;
14+
15+
public class ForgeProxySelectorTest
16+
{
17+
private static final String PROXY_HOST = "test.proxy.org";
18+
private static final int PROXY_PORT = 8080;
19+
20+
@Test
21+
public void testNoProxy() throws URISyntaxException
22+
{
23+
final Configuration configuration = new ConfigurationAdapter(new BaseConfiguration());
24+
final ProxySettings proxySettings = ProxySettings.fromForgeConfiguration(configuration);
25+
final ForgeProxySelector forgeProxySelector = new ForgeProxySelector(null, proxySettings);
26+
27+
final URI testURI = new URI("https://host.org/resource.html");
28+
final List<Proxy> expectedProxies = forgeProxySelector.select(testURI);
29+
30+
31+
assertEquals(1, expectedProxies.size());
32+
assertEquals(Proxy.NO_PROXY, expectedProxies.get(0));
33+
}
34+
35+
@Test
36+
public void testProxy() throws URISyntaxException
37+
{
38+
final ProxySettings proxySettings = ProxySettings.fromHostAndPort(PROXY_HOST, PROXY_PORT);
39+
final ForgeProxySelector forgeProxySelector = new ForgeProxySelector(null, proxySettings);
40+
41+
final URI testURI = new URI("https://host.org/resource.html");
42+
final List<Proxy> expectedProxies = forgeProxySelector.select(testURI);
43+
44+
45+
assertEquals(1, expectedProxies.size());
46+
assertEquals(PROXY_HOST + ":" + PROXY_PORT, expectedProxies.get(0).address().toString());
47+
}
48+
49+
@Test
50+
public void testProxyWithExclusion() throws URISyntaxException
51+
{
52+
final List<String> nonProxyHosts = Collections.singletonList("non.proxied.org");
53+
final ProxySettings proxySettings =
54+
ProxySettings.fromHostPortAndNonProxyHosts(PROXY_HOST, PROXY_PORT, nonProxyHosts);
55+
final ForgeProxySelector forgeProxySelector = new ForgeProxySelector(null, proxySettings);
56+
57+
final URI testProxiedURI = new URI("https://host.org/resource.html");
58+
final List<Proxy> expectedProxies = forgeProxySelector.select(testProxiedURI);
59+
60+
assertEquals(1, expectedProxies.size());
61+
assertEquals(PROXY_HOST + ":" + PROXY_PORT, expectedProxies.get(0).address().toString());
62+
63+
final URI testNonProxiedURI = new URI("https://non.proxied.org/other-resource.html");
64+
final List<Proxy> expectedNoProxies = forgeProxySelector.select(testNonProxiedURI);
65+
66+
assertEquals(1, expectedNoProxies.size());
67+
assertEquals(Proxy.NO_PROXY, expectedNoProxies.get(0));
68+
}
69+
}

0 commit comments

Comments
 (0)