1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.http.impl.routing;
29
30 import org.apache.hc.core5.http.MisdirectedRequestException;
31 import org.apache.hc.core5.http.protocol.HttpCoreContext;
32 import org.apache.hc.core5.http.protocol.UriPatternType;
33 import org.apache.hc.core5.http.support.BasicRequestBuilder;
34 import org.apache.hc.core5.net.URIAuthority;
35 import org.junit.jupiter.api.Assertions;
36 import org.junit.jupiter.api.Test;
37
38 public class TestRequestRouter {
39
40 @Test
41 public void testRequestRouting() throws Exception {
42 final RequestRouter<Long> requestRouter = RequestRouter.<Long>builder(UriPatternType.URI_PATTERN)
43 .addRoute("somehost.somedomain", "/*", 0L)
44 .addRoute("someotherhost.somedomain", "/foo/*", 1L)
45 .addRoute("somehost.somedomain", "/foo/*", 2L)
46 .addRoute("somehost.somedomain", "/bar/*", 3L)
47 .addRoute("somehost.somedomain", "/stuff", 4L)
48 .build();
49
50 final HttpCoreContext context = HttpCoreContext.create();
51 Assertions.assertEquals(1L, requestRouter.resolve(
52 BasicRequestBuilder.get("http://someotherhost.somedomain/foo/blah").build(), context));
53 Assertions.assertEquals(2L, requestRouter.resolve(
54 BasicRequestBuilder.get("http://somehost.somedomain/foo/blah").build(), context));
55 Assertions.assertEquals(3L, requestRouter.resolve(
56 BasicRequestBuilder.get("http://somehost.somedomain/bar/blah").build(), context));
57 Assertions.assertEquals(4L, requestRouter.resolve(
58 BasicRequestBuilder.get("http://somehost.somedomain/stuff").build(), context));
59 Assertions.assertEquals(4L, requestRouter.resolve(
60 BasicRequestBuilder.get("http://somehost.somedomain/stuff?huh").build(), context));
61 Assertions.assertEquals(0L, requestRouter.resolve(
62 BasicRequestBuilder.get("http://somehost.somedomain/stuffed").build(), context));
63 Assertions.assertNull(requestRouter.resolve(
64 BasicRequestBuilder.get("http://someotherhost.somedomain/stuff").build(), context));
65 Assertions.assertThrows(MisdirectedRequestException.class, () -> requestRouter.resolve(
66 BasicRequestBuilder.get("http://somehere.in.pampa/stuff").build(), context));
67 }
68
69 @Test
70 public void testDefaultAuthorityResolution() throws Exception {
71 final RequestRouter<Long> requestRouter = RequestRouter.<Long>builder(UriPatternType.URI_PATTERN)
72 .addRoute(new URIAuthority("somehost", -1), "/*", 0L)
73 .addRoute(new URIAuthority("somehost", 80), "/*", 1L)
74 .addRoute(new URIAuthority("somehost", 8080), "/*", 2L)
75 .addRoute(new URIAuthority("someotherhost", 80), "/*", 10L)
76 .build();
77
78 final HttpCoreContext context = HttpCoreContext.create();
79 Assertions.assertEquals(0L, requestRouter.resolve(
80 BasicRequestBuilder.get("http://somehost/blah").build(), context));
81 Assertions.assertEquals(10L, requestRouter.resolve(
82 BasicRequestBuilder.get("http://someotherhost:80/blah").build(), context));
83 Assertions.assertEquals(1L, requestRouter.resolve(
84 BasicRequestBuilder.get("http://somehost:80/blah").build(), context));
85 Assertions.assertEquals(2L, requestRouter.resolve(
86 BasicRequestBuilder.get("http://somehost:8080/blah").build(), context));
87 Assertions.assertThrows(MisdirectedRequestException.class, () -> requestRouter.resolve(
88 BasicRequestBuilder.get("http://somehere.in.pampa/stuff").build(), context));
89 }
90
91 @Test
92 public void testCustomAuthorityResolution() throws Exception {
93 final RequestRouter<Long> requestRouter = RequestRouter.<Long>builder(UriPatternType.URI_PATTERN)
94 .addRoute(new URIAuthority("somehost", -1), "/*", 1L)
95 .addRoute(new URIAuthority("someotherhost", -1), "/*", 2L)
96 .resolveAuthority((scheme, authority) -> authority != null ? new URIAuthority(authority.getHostName(), -1) : new URIAuthority("somehost"))
97 .build();
98
99 final HttpCoreContext context = HttpCoreContext.create();
100 Assertions.assertEquals(1L, requestRouter.resolve(
101 BasicRequestBuilder.get("http://somehost/blah").build(), context));
102 Assertions.assertEquals(2L, requestRouter.resolve(
103 BasicRequestBuilder.get("http://someotherhost:80/blah").build(), context));
104 Assertions.assertEquals(1L, requestRouter.resolve(
105 BasicRequestBuilder.get("http://somehost:80/blah").build(), context));
106 Assertions.assertEquals(1L, requestRouter.resolve(
107 BasicRequestBuilder.get("http://somehost:8080/blah").build(), context));
108 Assertions.assertEquals(1L, requestRouter.resolve(
109 BasicRequestBuilder.get("/blah").build(), context));
110 Assertions.assertThrows(MisdirectedRequestException.class, () -> requestRouter.resolve(
111 BasicRequestBuilder.get("http://somehere.in.pampa/stuff").build(), context));
112 }
113
114 @Test
115 public void testDownstreamResolution() throws Exception {
116 final RequestRouter<Long> requestRouter = RequestRouter.<Long>builder(UriPatternType.URI_PATTERN)
117 .addRoute(new URIAuthority("somehost", 80), "/*", 1L)
118 .addRoute(new URIAuthority("someotherhost", 80), "/*", 10L)
119 .resolveAuthority((scheme, authority) -> authority)
120 .downstream(((request, context) -> -1L))
121 .build();
122
123 final HttpCoreContext context = HttpCoreContext.create();
124 Assertions.assertEquals(-1L, requestRouter.resolve(
125 BasicRequestBuilder.get("http://somehost/blah").build(), context));
126 Assertions.assertEquals(10L, requestRouter.resolve(
127 BasicRequestBuilder.get("http://someotherhost:80/blah").build(), context));
128 Assertions.assertEquals(1L, requestRouter.resolve(
129 BasicRequestBuilder.get("http://somehost:80/blah").build(), context));
130 Assertions.assertEquals(-1L, requestRouter.resolve(
131 BasicRequestBuilder.get("http://somehost:8080/blah").build(), context));
132 Assertions.assertEquals(-1L, requestRouter.resolve(
133 BasicRequestBuilder.get("/blah").build(), context));
134 Assertions.assertEquals(-1L, requestRouter.resolve(
135 BasicRequestBuilder.get("http://somehere.in.pampa/stuff").build(), context));
136 }
137
138 }