View Javadoc
1   /*
2    * ====================================================================
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   * ====================================================================
20   *
21   * This software consists of voluntary contributions made by many
22   * individuals on behalf of the Apache Software Foundation.  For more
23   * information on the Apache Software Foundation, please see
24   * <http://www.apache.org/>.
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 }