Skip to content

Commit 4265498

Browse files
committed
refactor(xds): Remove unused matchHostName from XdsNameResolver, move tests to RoutingUtilsTest
1 parent cb2e509 commit 4265498

3 files changed

Lines changed: 77 additions & 134 deletions

File tree

xds/src/main/java/io/grpc/xds/XdsNameResolver.java

Lines changed: 0 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -341,75 +341,6 @@ private void updateResolutionResult(XdsConfig xdsConfig) {
341341
}
342342
}
343343

344-
/**
345-
* Returns {@code true} iff {@code hostName} matches the domain name {@code pattern} with
346-
* case-insensitive.
347-
*
348-
* <p>Wildcard pattern rules:
349-
* <ol>
350-
* <li>A single asterisk (*) matches any domain.</li>
351-
* <li>Asterisk (*) is only permitted in the left-most or the right-most part of the pattern,
352-
* but not both.</li>
353-
* </ol>
354-
*/
355-
@VisibleForTesting
356-
static boolean matchHostName(String hostName, String pattern) {
357-
checkArgument(hostName.length() != 0 && !hostName.startsWith("."),
358-
"Invalid host name");
359-
checkArgument(pattern.length() != 0 && !pattern.startsWith("."),
360-
"Invalid pattern/domain name");
361-
362-
hostName = hostName.toLowerCase(Locale.US);
363-
pattern = pattern.toLowerCase(Locale.US);
364-
// hostName and pattern are now in lower case -- domain names are case-insensitive.
365-
366-
// Strip trailing dot to normalize FQDN (e.g. "example.com.") to a relative form,
367-
// as per RFC 1034 Section 3.1 the two are semantically equivalent.
368-
if (hostName.endsWith(".")) {
369-
hostName = hostName.substring(0, hostName.length() - 1);
370-
}
371-
if (pattern.endsWith(".")) {
372-
pattern = pattern.substring(0, pattern.length() - 1);
373-
}
374-
375-
if (!pattern.contains("*")) {
376-
// Not a wildcard pattern -- hostName and pattern must match exactly.
377-
return hostName.equals(pattern);
378-
}
379-
// Wildcard pattern
380-
381-
if (pattern.length() == 1) {
382-
return true;
383-
}
384-
385-
int index = pattern.indexOf('*');
386-
387-
// At most one asterisk (*) is allowed.
388-
if (pattern.indexOf('*', index + 1) != -1) {
389-
return false;
390-
}
391-
392-
// Asterisk can only match prefix or suffix.
393-
if (index != 0 && index != pattern.length() - 1) {
394-
return false;
395-
}
396-
397-
// HostName must be at least as long as the pattern because asterisk has to
398-
// match one or more characters.
399-
if (hostName.length() < pattern.length()) {
400-
return false;
401-
}
402-
403-
if (index == 0 && hostName.endsWith(pattern.substring(1))) {
404-
// Prefix matching fails.
405-
return true;
406-
}
407-
408-
// Pattern matches hostname if suffix matching succeeds.
409-
return index == pattern.length() - 1
410-
&& hostName.startsWith(pattern.substring(0, pattern.length() - 1));
411-
}
412-
413344
private final class ConfigSelector extends InternalConfigSelector {
414345
@Override
415346
public Result selectConfig(PickSubchannelArgs args) {

xds/src/test/java/io/grpc/xds/RoutingUtilsTest.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,83 @@ public void findVirtualHostForHostName_trailingDot() {
136136
virtualHosts3, "b.googleapis.com.")).isEqualTo(vHost5);
137137
}
138138

139+
@Test
140+
public void findVirtualHostForHostName_exactMatch() {
141+
List<Route> routes = Collections.emptyList();
142+
VirtualHost vHostFoo = VirtualHost.create("vhost-foo",
143+
Collections.singletonList("foo.googleapis.com"), routes,
144+
ImmutableMap.of());
145+
VirtualHost vHostBar = VirtualHost.create("vhost-bar",
146+
Collections.singletonList("bar.googleapis.com"), routes,
147+
ImmutableMap.of());
148+
List<VirtualHost> virtualHosts =
149+
Arrays.asList(vHostFoo, vHostBar);
150+
151+
assertThat(RoutingUtils.findVirtualHostForHostName(
152+
virtualHosts, "foo.googleapis.com")).isEqualTo(vHostFoo);
153+
assertThat(RoutingUtils.findVirtualHostForHostName(
154+
virtualHosts, "bar.googleapis.com")).isEqualTo(vHostBar);
155+
// No match returns null.
156+
assertThat(RoutingUtils.findVirtualHostForHostName(
157+
virtualHosts, "baz.googleapis.com")).isNull();
158+
assertThat(RoutingUtils.findVirtualHostForHostName(
159+
virtualHosts, "foo.googleapis")).isNull();
160+
}
161+
162+
@Test
163+
public void findVirtualHostForHostName_prefixWildcard() {
164+
List<Route> routes = Collections.emptyList();
165+
VirtualHost vHostWild = VirtualHost.create("vhost-wild",
166+
Collections.singletonList("*.foo.googleapis.com"),
167+
routes, ImmutableMap.of());
168+
VirtualHost vHostOther = VirtualHost.create("vhost-other",
169+
Collections.singletonList("other.googleapis.com"),
170+
routes, ImmutableMap.of());
171+
List<VirtualHost> virtualHosts =
172+
Arrays.asList(vHostWild, vHostOther);
173+
174+
// Prefix wildcard matches.
175+
assertThat(RoutingUtils.findVirtualHostForHostName(
176+
virtualHosts, "bar.foo.googleapis.com"))
177+
.isEqualTo(vHostWild);
178+
// Base domain without subdomain does not match *.foo.googleapis.com.
179+
assertThat(RoutingUtils.findVirtualHostForHostName(
180+
virtualHosts, "foo.googleapis.com")).isNull();
181+
182+
// Longer prefix wildcard is preferred over shorter one.
183+
VirtualHost vHostLong = VirtualHost.create("vhost-long",
184+
Collections.singletonList("*.bar.foo.googleapis.com"),
185+
routes, ImmutableMap.of());
186+
List<VirtualHost> virtualHosts2 =
187+
Arrays.asList(vHostLong, vHostWild);
188+
assertThat(RoutingUtils.findVirtualHostForHostName(
189+
virtualHosts2, "baz.bar.foo.googleapis.com"))
190+
.isEqualTo(vHostLong);
191+
}
192+
193+
@Test
194+
public void findVirtualHostForHostName_postfixWildcard() {
195+
List<Route> routes = Collections.emptyList();
196+
VirtualHost vHostWild = VirtualHost.create("vhost-wild",
197+
Collections.singletonList("foo.*"), routes,
198+
ImmutableMap.of());
199+
VirtualHost vHostOther = VirtualHost.create("vhost-other",
200+
Collections.singletonList("bar.googleapis.com"),
201+
routes, ImmutableMap.of());
202+
List<VirtualHost> virtualHosts =
203+
Arrays.asList(vHostWild, vHostOther);
204+
205+
// Postfix wildcard matches.
206+
assertThat(RoutingUtils.findVirtualHostForHostName(
207+
virtualHosts, "foo.googleapis.com"))
208+
.isEqualTo(vHostWild);
209+
assertThat(RoutingUtils.findVirtualHostForHostName(
210+
virtualHosts, "foo.com")).isEqualTo(vHostWild);
211+
// Different prefix does not match foo.*.
212+
assertThat(RoutingUtils.findVirtualHostForHostName(
213+
virtualHosts, "bar.foo.googleapis.com")).isNull();
214+
}
215+
139216
@Test
140217
public void routeMatching_pathOnly() {
141218
Metadata headers = new Metadata();

xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2020,71 +2020,6 @@ public void generateServiceConfig_forPerMethodConfig() throws IOException {
20202020
.isEqualTo(expectedServiceConfig);
20212021
}
20222022

2023-
@Test
2024-
public void matchHostName_exactlyMatch() {
2025-
String pattern = "foo.googleapis.com";
2026-
assertThat(XdsNameResolver.matchHostName("bar.googleapis.com", pattern)).isFalse();
2027-
assertThat(XdsNameResolver.matchHostName("fo.googleapis.com", pattern)).isFalse();
2028-
assertThat(XdsNameResolver.matchHostName("oo.googleapis.com", pattern)).isFalse();
2029-
assertThat(XdsNameResolver.matchHostName("googleapis.com", pattern)).isFalse();
2030-
assertThat(XdsNameResolver.matchHostName("foo.googleapis", pattern)).isFalse();
2031-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com", pattern)).isTrue();
2032-
}
2033-
2034-
@Test
2035-
public void matchHostName_prefixWildcard() {
2036-
String pattern = "*.foo.googleapis.com";
2037-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com", pattern)).isFalse();
2038-
assertThat(XdsNameResolver.matchHostName("bar-baz.foo.googleapis", pattern)).isFalse();
2039-
assertThat(XdsNameResolver.matchHostName("bar.foo.googleapis.com", pattern)).isTrue();
2040-
pattern = "*-bar.foo.googleapis.com";
2041-
assertThat(XdsNameResolver.matchHostName("bar.foo.googleapis.com", pattern)).isFalse();
2042-
assertThat(XdsNameResolver.matchHostName("baz-bar.foo.googleapis", pattern)).isFalse();
2043-
assertThat(XdsNameResolver.matchHostName("-bar.foo.googleapis.com", pattern)).isFalse();
2044-
assertThat(XdsNameResolver.matchHostName("baz-bar.foo.googleapis.com", pattern))
2045-
.isTrue();
2046-
}
2047-
2048-
@Test
2049-
public void matchHostName_postfixWildCard() {
2050-
String pattern = "foo.*";
2051-
assertThat(XdsNameResolver.matchHostName("bar.googleapis.com", pattern)).isFalse();
2052-
assertThat(XdsNameResolver.matchHostName("bar.foo.googleapis.com", pattern)).isFalse();
2053-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com", pattern)).isTrue();
2054-
assertThat(XdsNameResolver.matchHostName("foo.com", pattern)).isTrue();
2055-
pattern = "foo-*";
2056-
assertThat(XdsNameResolver.matchHostName("bar-.googleapis.com", pattern)).isFalse();
2057-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com", pattern)).isFalse();
2058-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com", pattern)).isFalse();
2059-
assertThat(XdsNameResolver.matchHostName("foo-", pattern)).isFalse();
2060-
assertThat(XdsNameResolver.matchHostName("foo-bar.com", pattern)).isTrue();
2061-
assertThat(XdsNameResolver.matchHostName("foo-.com", pattern)).isTrue();
2062-
assertThat(XdsNameResolver.matchHostName("foo-bar", pattern)).isTrue();
2063-
}
2064-
2065-
@Test
2066-
public void matchHostName_trailingDot() {
2067-
// FQDN (trailing dot) is semantically equivalent to the relative form per RFC 1034 Section 3.1.
2068-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com.", "foo.googleapis.com")).isTrue();
2069-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com", "foo.googleapis.com.")).isTrue();
2070-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com.", "foo.googleapis.com."))
2071-
.isTrue();
2072-
assertThat(XdsNameResolver.matchHostName("bar.googleapis.com.", "foo.googleapis.com"))
2073-
.isFalse();
2074-
2075-
// Wildcard + trailing dot combinations.
2076-
String pattern = "*.foo.googleapis.com";
2077-
assertThat(XdsNameResolver.matchHostName("bar.foo.googleapis.com.", pattern)).isTrue();
2078-
assertThat(XdsNameResolver.matchHostName("bar.foo.googleapis.com", pattern + ".")).isTrue();
2079-
assertThat(XdsNameResolver.matchHostName("bar.foo.googleapis.com.", pattern + ".")).isTrue();
2080-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com.", pattern)).isFalse();
2081-
2082-
pattern = "foo.*";
2083-
assertThat(XdsNameResolver.matchHostName("foo.googleapis.com.", pattern)).isTrue();
2084-
assertThat(XdsNameResolver.matchHostName("foo.com.", pattern)).isTrue();
2085-
assertThat(XdsNameResolver.matchHostName("bar.googleapis.com.", pattern)).isFalse();
2086-
}
2087-
20882023
@Test
20892024
public void resolved_faultAbortInLdsUpdate() {
20902025
resolver.start(mockListener);

0 commit comments

Comments
 (0)