Skip to content

Commit b289519

Browse files
authored
xds: fixed RouteConfiguration not supporting contain and stringMatcher (#9845)
1 parent 706646f commit b289519

File tree

2 files changed

+29
-33
lines changed

2 files changed

+29
-33
lines changed

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

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import io.grpc.xds.XdsClient.ResourceUpdate;
5151
import io.grpc.xds.XdsClientImpl.ResourceInvalidException;
5252
import io.grpc.xds.XdsRouteConfigureResource.RdsUpdate;
53+
import io.grpc.xds.internal.MatcherParser;
5354
import io.grpc.xds.internal.Matchers;
5455
import io.grpc.xds.internal.Matchers.FractionMatcher;
5556
import io.grpc.xds.internal.Matchers.HeaderMatcher;
@@ -392,39 +393,11 @@ private static StructOrError<FractionMatcher> parseFractionMatcher(FractionalPer
392393
@VisibleForTesting
393394
static StructOrError<HeaderMatcher> parseHeaderMatcher(
394395
io.envoyproxy.envoy.config.route.v3.HeaderMatcher proto) {
395-
switch (proto.getHeaderMatchSpecifierCase()) {
396-
case EXACT_MATCH:
397-
return StructOrError.fromStruct(HeaderMatcher.forExactValue(
398-
proto.getName(), proto.getExactMatch(), proto.getInvertMatch()));
399-
case SAFE_REGEX_MATCH:
400-
String rawPattern = proto.getSafeRegexMatch().getRegex();
401-
Pattern safeRegExMatch;
402-
try {
403-
safeRegExMatch = Pattern.compile(rawPattern);
404-
} catch (PatternSyntaxException e) {
405-
return StructOrError.fromError(
406-
"HeaderMatcher [" + proto.getName() + "] contains malformed safe regex pattern: "
407-
+ e.getMessage());
408-
}
409-
return StructOrError.fromStruct(Matchers.HeaderMatcher.forSafeRegEx(
410-
proto.getName(), safeRegExMatch, proto.getInvertMatch()));
411-
case RANGE_MATCH:
412-
Matchers.HeaderMatcher.Range rangeMatch = Matchers.HeaderMatcher.Range.create(
413-
proto.getRangeMatch().getStart(), proto.getRangeMatch().getEnd());
414-
return StructOrError.fromStruct(Matchers.HeaderMatcher.forRange(
415-
proto.getName(), rangeMatch, proto.getInvertMatch()));
416-
case PRESENT_MATCH:
417-
return StructOrError.fromStruct(Matchers.HeaderMatcher.forPresent(
418-
proto.getName(), proto.getPresentMatch(), proto.getInvertMatch()));
419-
case PREFIX_MATCH:
420-
return StructOrError.fromStruct(Matchers.HeaderMatcher.forPrefix(
421-
proto.getName(), proto.getPrefixMatch(), proto.getInvertMatch()));
422-
case SUFFIX_MATCH:
423-
return StructOrError.fromStruct(Matchers.HeaderMatcher.forSuffix(
424-
proto.getName(), proto.getSuffixMatch(), proto.getInvertMatch()));
425-
case HEADERMATCHSPECIFIER_NOT_SET:
426-
default:
427-
return StructOrError.fromError("Unknown header matcher type");
396+
try {
397+
Matchers.HeaderMatcher headerMatcher = MatcherParser.parseHeaderMatcher(proto);
398+
return StructOrError.fromStruct(headerMatcher);
399+
} catch (IllegalArgumentException e) {
400+
return StructOrError.fromError(e.getMessage());
428401
}
429402
}
430403

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
import io.grpc.xds.XdsClientImpl.ResourceInvalidException;
132132
import io.grpc.xds.XdsClusterResource.CdsUpdate;
133133
import io.grpc.xds.XdsResourceType.StructOrError;
134+
import io.grpc.xds.internal.Matchers;
134135
import io.grpc.xds.internal.Matchers.FractionMatcher;
135136
import io.grpc.xds.internal.Matchers.HeaderMatcher;
136137
import java.util.Arrays;
@@ -481,6 +482,28 @@ public void parseHeaderMatcher_malformedRegExPattern() {
481482
assertThat(struct.getStruct()).isNull();
482483
}
483484

485+
@Test
486+
@SuppressWarnings("deprecation")
487+
public void parseHeaderMatcher_withStringMatcher() {
488+
io.envoyproxy.envoy.type.matcher.v3.StringMatcher stringMatcherProto =
489+
io.envoyproxy.envoy.type.matcher.v3.StringMatcher.newBuilder()
490+
.setPrefix("service-foo")
491+
.setIgnoreCase(false)
492+
.build();
493+
494+
io.envoyproxy.envoy.config.route.v3.HeaderMatcher proto =
495+
io.envoyproxy.envoy.config.route.v3.HeaderMatcher.newBuilder()
496+
.setName("authority")
497+
.setStringMatch(stringMatcherProto)
498+
.setInvertMatch(false)
499+
.build();
500+
StructOrError<HeaderMatcher> struct = XdsRouteConfigureResource.parseHeaderMatcher(proto);
501+
assertThat(struct.getErrorDetail()).isNull();
502+
assertThat(struct.getStruct()).isEqualTo(
503+
HeaderMatcher.forString("authority", Matchers.StringMatcher
504+
.forPrefix("service-foo", false), false));
505+
}
506+
484507
@Test
485508
public void parseRouteAction_withCluster() {
486509
io.envoyproxy.envoy.config.route.v3.RouteAction proto =

0 commit comments

Comments
 (0)