Skip to content

Commit 0ac325d

Browse files
committed
xds: always keep empty mutated headers and ignore keep_empty_value
Updates the HeaderMutator library to always apply mutations even if the resulting value is empty, ignoring the keep_empty_value setting altogether. Empty mutated values are now kept in the metadata and the header key is no longer discarded. - Removes containsEmpty check and helper from HeaderMutator. - Updates HeaderMutatorTest to assert that empty mutations are kept.
1 parent fa8c735 commit 0ac325d

2 files changed

Lines changed: 11 additions & 36 deletions

File tree

xds/src/main/java/io/grpc/xds/internal/headermutations/HeaderMutator.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,13 @@ private void updateHeader(final HeaderValueOption option, Metadata mutableHeader
7272
if (header.rawValue().isPresent()) {
7373
Metadata.Key<byte[]> key = Metadata.Key.of(header.key(), Metadata.BINARY_BYTE_MARSHALLER);
7474
updateHeader(action, key, header.rawValue().get().toByteArray(), mutableHeaders);
75-
if (containsEmpty(key, mutableHeaders)) {
76-
mutableHeaders.discardAll(key);
77-
}
7875
} else {
7976
logger.fine("Missing binary rawValue for header: " + header.key());
8077
}
8178
} else {
8279
if (header.value().isPresent()) {
8380
Metadata.Key<String> key = Metadata.Key.of(header.key(), Metadata.ASCII_STRING_MARSHALLER);
8481
updateHeader(action, key, header.value().get(), mutableHeaders);
85-
if (containsEmpty(key, mutableHeaders)) {
86-
mutableHeaders.discardAll(key);
87-
}
8882
} else {
8983
logger.fine("Missing value for header: " + header.key());
9084
}
@@ -118,24 +112,5 @@ private <T> void updateHeader(final HeaderAppendAction action, final Metadata.Ke
118112
logger.fine("Unknown HeaderAppendAction: " + action);
119113
}
120114
}
121-
122-
private <T> boolean containsEmpty(Metadata.Key<T> key, Metadata headers) {
123-
Iterable<T> values = headers.getAll(key);
124-
if (values == null) {
125-
return false;
126-
}
127-
for (T val : values) {
128-
if (val instanceof String) {
129-
if (((String) val).isEmpty()) {
130-
return true;
131-
}
132-
} else if (val instanceof byte[]) {
133-
if (((byte[]) val).length == 0) {
134-
return true;
135-
}
136-
}
137-
}
138-
return false;
139-
}
140115
}
141116

xds/src/test/java/io/grpc/xds/internal/headermutations/HeaderMutatorTest.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ public void applyResponseMutations_binary() {
201201
}
202202

203203
@Test
204-
public void applyMutations_keepEmptyValue() {
204+
public void applyMutations_emptyValuesAreKept() {
205205
Metadata headers = new Metadata();
206206
headers.put(APPEND_KEY, "existing-value");
207207
headers.put(OVERWRITE_KEY, "existing-value");
@@ -242,28 +242,28 @@ public void applyMutations_keepEmptyValue() {
242242

243243
headerMutator.applyMutations(mutations, headers);
244244

245-
assertThat(headers.containsKey(NEW_ADD_KEY)).isFalse();
246-
assertThat(headers.containsKey(APPEND_KEY)).isFalse();
247-
assertThat(headers.containsKey(OVERWRITE_KEY)).isFalse();
248-
assertThat(headers.containsKey(ADD_KEY)).isFalse();
249-
assertThat(headers.containsKey(OVERWRITE_IF_EXISTS_KEY)).isFalse();
245+
assertThat(headers.get(NEW_ADD_KEY)).isEqualTo("");
246+
assertThat(headers.getAll(APPEND_KEY)).containsExactly("existing-value", "");
247+
assertThat(headers.get(OVERWRITE_KEY)).isEqualTo("");
248+
assertThat(headers.get(ADD_KEY)).isEqualTo("");
249+
assertThat(headers.get(OVERWRITE_IF_EXISTS_KEY)).isEqualTo("");
250250

251251
Metadata.Key<String> keepEmptyKey =
252252
Metadata.Key.of("keep-empty-key", Metadata.ASCII_STRING_MARSHALLER);
253253
Metadata.Key<String> keepEmptyOverwriteKey =
254254
Metadata.Key.of("keep-empty-overwrite-key", Metadata.ASCII_STRING_MARSHALLER);
255255

256-
assertThat(headers.containsKey(keepEmptyKey)).isFalse();
257-
assertThat(headers.containsKey(keepEmptyOverwriteKey)).isFalse();
256+
assertThat(headers.get(keepEmptyKey)).isEqualTo("");
257+
assertThat(headers.get(keepEmptyOverwriteKey)).isEqualTo("");
258258

259259
Metadata.Key<byte[]> keepEmptyBinKey =
260260
Metadata.Key.of("keep-empty-bin-key-bin", Metadata.BINARY_BYTE_MARSHALLER);
261261
Metadata.Key<byte[]> ignoreEmptyBinKey =
262262
Metadata.Key.of("ignore-empty-bin-key-bin", Metadata.BINARY_BYTE_MARSHALLER);
263263

264-
assertThat(headers.containsKey(keepEmptyBinKey)).isFalse();
265-
assertThat(headers.containsKey(ignoreEmptyBinKey)).isFalse();
266-
assertThat(headers.containsKey(overwriteEmptyBinKey)).isFalse();
264+
assertThat(headers.get(keepEmptyBinKey)).isEqualTo(new byte[0]);
265+
assertThat(headers.get(ignoreEmptyBinKey)).isEqualTo(new byte[0]);
266+
assertThat(headers.get(overwriteEmptyBinKey)).isEqualTo(new byte[0]);
267267
}
268268

269269
@Test

0 commit comments

Comments
 (0)