Skip to content

Commit f8af0d0

Browse files
author
Maryum Styles
committed
customRoutePlanner: add implementation
implenting customRoutePlanner with the code from I89591e7c3452be2dc65df9fb705eb54356f61e3c Bug: T278385 Change-Id: I17a594d7fc36d185add884075d492c07b85b4f6b
1 parent 4a697d2 commit f8af0d0

File tree

2 files changed

+109
-4
lines changed

2 files changed

+109
-4
lines changed
Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,56 @@
11
package org.wikimedia.utils.http;
22

3-
public class CustomRoutePlanner {
4-
// TODO: stub
3+
import static java.util.Arrays.stream;
4+
import static java.util.stream.Collectors.toMap;
5+
6+
import java.util.Map;
7+
8+
import org.apache.http.HttpException;
9+
import org.apache.http.HttpHost;
10+
import org.apache.http.HttpRequest;
11+
import org.apache.http.conn.routing.HttpRoute;
12+
import org.apache.http.conn.routing.HttpRoutePlanner;
13+
import org.apache.http.protocol.HttpContext;
14+
15+
public class CustomRoutePlanner implements HttpRoutePlanner {
16+
17+
private final Map<String, HttpHost> customRouteMap;
18+
private final HttpRoutePlanner defaultRoutePlanner;
19+
20+
public CustomRoutePlanner(Map<String, HttpHost> customRouteMap, HttpRoutePlanner defaultRoutePlanner) {
21+
this.customRouteMap = customRouteMap;
22+
this.defaultRoutePlanner = defaultRoutePlanner;
23+
}
24+
25+
/**
26+
* @param mapProxyProperty has a format of url=url
27+
* separated by commas with no space between them
28+
* for example: www.wikidata.org=http://proxy.local:9999,www.metawiki.org=https://proxy.local:8080
29+
*/
30+
public static Map<String, HttpHost> createMapFromString(String mapProxyProperty) {
31+
String[] pairs = mapProxyProperty.split(",");
32+
return stream(pairs).map(p -> p.split("=")).
33+
collect(toMap(pair -> pair[0], pair -> HttpHost.create(pair[1])));
34+
}
35+
36+
public void addRoute(String sourceURL, String targetURL) {
37+
customRouteMap.put(sourceURL, HttpHost.create(targetURL));
38+
}
39+
40+
@Override
41+
public HttpRoute determineRoute(HttpHost httpHost, HttpRequest httpRequest, HttpContext httpContext) throws HttpException {
42+
HttpHost destHost = customRouteMap.get(httpHost.getHostName());
43+
if (destHost != null) {
44+
return new HttpRoute(
45+
new HttpHost(
46+
destHost.getHostName(),
47+
// If the dest port was not set, then assume we want use the same one as the request url.
48+
destHost.getPort() != -1 ? destHost.getPort() : httpHost.getPort(),
49+
destHost.getSchemeName()
50+
)
51+
);
52+
} else {
53+
return defaultRoutePlanner.determineRoute(httpHost, httpRequest, httpContext);
54+
}
55+
}
556
}

http-client-utils/src/test/java/org/wikimedia/utils/http/CustomRoutePlannerUnitTest.java

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,65 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
import org.apache.http.HttpException;
9+
import org.apache.http.HttpHost;
10+
import org.apache.http.client.methods.HttpGet;
11+
import org.apache.http.conn.routing.HttpRoute;
12+
import org.apache.http.conn.routing.HttpRoutePlanner;
13+
import org.apache.http.impl.conn.DefaultRoutePlanner;
14+
import org.apache.http.impl.conn.DefaultSchemePortResolver;
15+
import org.apache.http.protocol.BasicHttpContext;
16+
import org.junit.jupiter.api.BeforeEach;
517
import org.junit.jupiter.api.Test;
618

719
class CustomRoutePlannerUnitTest {
20+
21+
Map<String, HttpHost> customRouteMapTest = new HashMap<>();
22+
HttpRoutePlanner defaultRoutePlanner = new DefaultRoutePlanner(DefaultSchemePortResolver.INSTANCE);
23+
24+
@BeforeEach
25+
public void setUp() {
26+
customRouteMapTest.put("managed.test", new HttpHost("route.test", 9999, "someScheme"));
27+
customRouteMapTest.put("proxy.test", new HttpHost("route.test", 8080, "diffScheme"));
28+
}
29+
30+
@Test
31+
void shouldCreateMapFromString() {
32+
String mapString = "www.wikidata.org=http://proxy.local:9999,www.metawiki.org=https://proxy.local:8080";
33+
Map<String, HttpHost> stringMap = new HashMap<>();
34+
stringMap.put("www.wikidata.org", new HttpHost("proxy.local", 9999, "http"));
35+
stringMap.put("www.metawiki.org", new HttpHost("proxy.local", 8080, "https"));
36+
assertThat(CustomRoutePlanner.createMapFromString(mapString)).isEqualTo(stringMap);
37+
}
38+
39+
40+
@Test
41+
void shouldNotGetSameHost() throws HttpException {
42+
Map<String, HttpHost> emptyMap = new HashMap<>();
43+
CustomRoutePlanner customRoutePlanner = new CustomRoutePlanner(emptyMap, defaultRoutePlanner);
44+
HttpHost testHost = new HttpHost("wikidata.org", 9999, "someScheme");
45+
HttpRoute actualRoute = customRoutePlanner.determineRoute(testHost, new HttpGet(), new BasicHttpContext());
46+
assertThat(actualRoute.getTargetHost()).isEqualTo(testHost);
47+
}
48+
49+
@Test
50+
void shouldGetCustomRoute() throws HttpException {
51+
CustomRoutePlanner customRoutePlanner = new CustomRoutePlanner(customRouteMapTest, defaultRoutePlanner);
52+
HttpHost testHost = new HttpHost("managed.test", 9999, "someScheme");
53+
HttpHost expectedHost = new HttpHost("route.test", 9999, "someScheme");
54+
HttpRoute actualRoute = customRoutePlanner.determineRoute(testHost, new HttpGet(), new BasicHttpContext());
55+
assertThat(actualRoute.getTargetHost()).isEqualTo(expectedHost);
56+
}
57+
858
@Test
9-
void test() {
10-
assertThat(new CustomRoutePlanner()).isInstanceOf(CustomRoutePlanner.class);
59+
void shouldUseProxyRoute() throws HttpException {
60+
CustomRoutePlanner customRoutePlanner = new CustomRoutePlanner(customRouteMapTest, defaultRoutePlanner);
61+
HttpHost testHost = new HttpHost("proxy.test", 9999, "someScheme");
62+
HttpHost expectedHost = new HttpHost("route.test", 8080, "diffScheme");
63+
HttpRoute actualRoute = customRoutePlanner.determineRoute(testHost, new HttpGet(), new BasicHttpContext());
64+
assertThat(actualRoute.getTargetHost()).isEqualTo(expectedHost);
1165
}
1266
}

0 commit comments

Comments
 (0)