Skip to content

Commit bd4cb56

Browse files
committed
resolve comments
1 parent ce4e16c commit bd4cb56

3 files changed

Lines changed: 40 additions & 26 deletions

File tree

xds/src/main/java/io/grpc/xds/internal/matcher/HeadersWrapper.java

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ final class HeadersWrapper extends AbstractMap<String, String> {
3232
private static final ImmutableSet<String> PSEUDO_HEADERS =
3333
ImmutableSet.of(":method", ":authority", ":path");
3434
private final MatchContext context;
35+
@Nullable
36+
private volatile Set<String> cachedKeySet;
3537

3638
HeadersWrapper(MatchContext context) {
3739
this.context = context;
@@ -115,21 +117,45 @@ public boolean containsKey(Object key) {
115117
}
116118
}
117119

120+
private boolean isMetadataKeyResolvable(String headerName) {
121+
try {
122+
if (headerName.endsWith(Metadata.BINARY_HEADER_SUFFIX)) {
123+
Metadata.Key.of(headerName, Metadata.BINARY_BYTE_MARSHALLER);
124+
} else {
125+
Metadata.Key.of(headerName, Metadata.ASCII_STRING_MARSHALLER);
126+
}
127+
return true;
128+
} catch (IllegalArgumentException e) {
129+
return false;
130+
}
131+
}
132+
118133
@Override
119134
public Set<String> keySet() {
120-
ImmutableSet.Builder<String> builder = ImmutableSet.builder();
121-
for (String key : context.getMetadata().keys()) {
122-
String lowerKey = key.toLowerCase(java.util.Locale.ROOT);
123-
// Filter out any keys we provide specialized aliases/values for.
124-
if (!lowerKey.equals("te")
125-
&& !lowerKey.equals("host")
126-
&& !PSEUDO_HEADERS.contains(lowerKey)) {
127-
builder.add(key);
135+
Set<String> result = cachedKeySet;
136+
if (result == null) {
137+
synchronized (this) {
138+
result = cachedKeySet;
139+
if (result == null) {
140+
ImmutableSet.Builder<String> builder = ImmutableSet.builder();
141+
for (String key : context.getMetadata().keys()) {
142+
String lowerKey = key.toLowerCase(java.util.Locale.ROOT);
143+
// Filter out any keys we provide specialized aliases/values for.
144+
if (!lowerKey.equals("te")
145+
&& !lowerKey.equals("host")
146+
&& !PSEUDO_HEADERS.contains(lowerKey)
147+
&& isMetadataKeyResolvable(lowerKey)) {
148+
builder.add(key);
149+
}
150+
}
151+
builder.addAll(PSEUDO_HEADERS);
152+
builder.add("host");
153+
result = builder.build();
154+
cachedKeySet = result;
155+
}
128156
}
129157
}
130-
builder.addAll(PSEUDO_HEADERS);
131-
builder.add("host");
132-
return builder.build();
158+
return result;
133159
}
134160

135161
@Override

xds/src/test/java/io/grpc/xds/internal/matcher/CelEnvironmentTest.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -290,20 +290,6 @@ public void celEnvironment_runtime_disabledFeatures_throwsException() throws Exc
290290
}
291291
}
292292

293-
@Test
294-
public void celEnvironment_method_fallback() {
295-
MatchContext context = MatchContext.newBuilder()
296-
.setPath("/").setHost("example.com").setMethod("POST").build();
297-
298-
GrpcCelEnvironment env = new GrpcCelEnvironment(context);
299-
300-
Optional<Object> result = env.find("request");
301-
assertThat(result.isPresent()).isTrue();
302-
@SuppressWarnings("unchecked")
303-
Map<String, Object> requestMap = (Map<String, Object>) result.get();
304-
assertThat(requestMap.get("method")).isEqualTo("POST");
305-
}
306-
307293
@Test
308294
public void celEnvironment_resolvesLazyRequestMap() {
309295
MatchContext context = MatchContext.newBuilder()

xds/src/test/java/io/grpc/xds/internal/matcher/CelStringExtractorTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,10 @@ public void compile_invalidSyntax_throws() {
152152
try {
153153
CelMatcherTestHelper.compileStringExtractor("invalid syntax ???");
154154
fail("Should throw CelValidationException");
155+
} catch (dev.cel.common.CelValidationException e) {
156+
assertThat(e).hasMessageThat().contains("mismatched input");
155157
} catch (Exception e) {
156-
// Expected
158+
fail("Threw wrong exception type: " + e.getClass().getName());
157159
}
158160
}
159161

0 commit comments

Comments
 (0)