Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,25 +67,18 @@ private void applyHeaderUpdates(final Iterable<HeaderValueOption> headerOptions,
private void updateHeader(final HeaderValueOption option, Metadata mutableHeaders) {
HeaderValue header = option.header();
HeaderAppendAction action = option.appendAction();
boolean keepEmptyValue = option.keepEmptyValue();
Comment thread
sauravzg marked this conversation as resolved.

if (header.key().endsWith(Metadata.BINARY_HEADER_SUFFIX)) {
if (header.rawValue().isPresent()) {
byte[] value = header.rawValue().get().toByteArray();
if (value.length > 0 || keepEmptyValue) {
updateHeader(action, Metadata.Key.of(header.key(), Metadata.BINARY_BYTE_MARSHALLER),
value, mutableHeaders);
}
Metadata.Key<byte[]> key = Metadata.Key.of(header.key(), Metadata.BINARY_BYTE_MARSHALLER);
updateHeader(action, key, header.rawValue().get().toByteArray(), mutableHeaders);
} else {
logger.fine("Missing binary rawValue for header: " + header.key());
}
} else {
if (header.value().isPresent()) {
String value = header.value().get();
if (!value.isEmpty() || keepEmptyValue) {
updateHeader(action, Metadata.Key.of(header.key(), Metadata.ASCII_STRING_MARSHALLER),
value, mutableHeaders);
}
Metadata.Key<String> key = Metadata.Key.of(header.key(), Metadata.ASCII_STRING_MARSHALLER);
updateHeader(action, key, header.value().get(), mutableHeaders);
} else {
logger.fine("Missing value for header: " + header.key());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,14 @@
public abstract class HeaderValueOption {

public static HeaderValueOption create(
HeaderValue header, HeaderAppendAction appendAction, boolean keepEmptyValue) {
return new AutoValue_HeaderValueOption(header, appendAction, keepEmptyValue);
HeaderValue header, HeaderAppendAction appendAction) {
return new AutoValue_HeaderValueOption(header, appendAction);
}

public abstract HeaderValue header();

public abstract HeaderAppendAction appendAction();

public abstract boolean keepEmptyValue();

/**
* Defines the action to take when appending headers.
* Mirrors io.envoyproxy.envoy.config.core.v3.HeaderValueOption.HeaderAppendAction.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ public class HeaderMutationFilterTest {

private static HeaderValueOption header(String key, ByteString value) {
return HeaderValueOption.create(io.grpc.xds.internal.grpcservice.HeaderValue.create(key, value),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, false);
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);
}

private static HeaderValueOption header(String key, String value) {
return HeaderValueOption.create(io.grpc.xds.internal.grpcservice.HeaderValue.create(key, value),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, false);
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class HeaderMutationsTest {
public void testCreate() {
HeaderValueOption header = HeaderValueOption.create(
HeaderValue.create("key", "value"),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, false);
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);
HeaderMutations mutations = HeaderMutations.create(
ImmutableList.of(header), ImmutableList.of("remove-key"));
assertThat(mutations.headers()).containsExactly(header);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void tearDown() {
}

private static HeaderValueOption header(String key, String value, HeaderAppendAction action) {
return HeaderValueOption.create(HeaderValue.create(key, value), action, false);
return HeaderValueOption.create(HeaderValue.create(key, value), action);
}

@Test
Expand Down Expand Up @@ -147,8 +147,7 @@ public void applyMutations_binary() {
HeaderValueOption option =
HeaderValueOption.create(
HeaderValue.create(BINARY_KEY.name(), ByteString.copyFrom(value)),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD,
false);
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);
headerMutator.applyMutations(
HeaderMutations.create(ImmutableList.of(option), ImmutableList.of()), headers);
assertThat(headers.get(BINARY_KEY)).isEqualTo(value);
Expand Down Expand Up @@ -195,15 +194,14 @@ public void applyResponseMutations_binary() {
HeaderValueOption option =
HeaderValueOption.create(
HeaderValue.create(BINARY_KEY.name(), ByteString.copyFrom(value)),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD,
false);
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);
headerMutator.applyMutations(
HeaderMutations.create(ImmutableList.of(option), ImmutableList.of()), headers);
assertThat(headers.get(BINARY_KEY)).isEqualTo(value);
}

@Test
public void applyMutations_keepEmptyValue() {
public void applyMutations_emptyValuesAreKept() {
Metadata headers = new Metadata();
headers.put(APPEND_KEY, "existing-value");
headers.put(OVERWRITE_KEY, "existing-value");
Expand All @@ -219,21 +217,19 @@ public void applyMutations_keepEmptyValue() {
header(OVERWRITE_IF_EXISTS_KEY.name(), "", HeaderAppendAction.OVERWRITE_IF_EXISTS),
HeaderValueOption.create(
HeaderValue.create("keep-empty-key", ""),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD,
true),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD),
HeaderValueOption.create(
HeaderValue.create("keep-empty-overwrite-key", ""),
HeaderAppendAction.OVERWRITE_IF_EXISTS_OR_ADD,
true),
HeaderAppendAction.OVERWRITE_IF_EXISTS_OR_ADD),
HeaderValueOption.create(
HeaderValue.create("keep-empty-bin-key-bin", ByteString.EMPTY),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, true),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD),
HeaderValueOption.create(
HeaderValue.create("ignore-empty-bin-key-bin", ByteString.EMPTY),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, false),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD),
HeaderValueOption.create(
HeaderValue.create("overwrite-empty-bin-key-bin", ByteString.EMPTY),
HeaderAppendAction.OVERWRITE_IF_EXISTS_OR_ADD, false)),
HeaderAppendAction.OVERWRITE_IF_EXISTS_OR_ADD)),
ImmutableList.of());

headers.put(
Expand All @@ -246,31 +242,28 @@ public void applyMutations_keepEmptyValue() {

headerMutator.applyMutations(mutations, headers);

assertThat(headers.containsKey(NEW_ADD_KEY)).isFalse();
assertThat(headers.getAll(APPEND_KEY)).containsExactly("existing-value");
assertThat(headers.get(OVERWRITE_KEY)).isEqualTo("existing-value");
assertThat(headers.containsKey(ADD_KEY)).isFalse();
assertThat(headers.get(OVERWRITE_IF_EXISTS_KEY)).isEqualTo("existing-value");
assertThat(headers.get(NEW_ADD_KEY)).isEqualTo("");
assertThat(headers.getAll(APPEND_KEY)).containsExactly("existing-value", "");
assertThat(headers.get(OVERWRITE_KEY)).isEqualTo("");
assertThat(headers.get(ADD_KEY)).isEqualTo("");
assertThat(headers.get(OVERWRITE_IF_EXISTS_KEY)).isEqualTo("");

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

assertThat(headers.containsKey(keepEmptyKey)).isTrue();
assertThat(headers.get(keepEmptyKey)).isEqualTo("");
assertThat(headers.containsKey(keepEmptyOverwriteKey)).isTrue();
assertThat(headers.get(keepEmptyOverwriteKey)).isEqualTo("");

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

assertThat(headers.containsKey(keepEmptyBinKey)).isTrue();
assertThat(headers.get(keepEmptyBinKey)).isEqualTo(new byte[0]);
assertThat(headers.containsKey(ignoreEmptyBinKey)).isFalse();
assertThat(headers.get(overwriteEmptyBinKey)).isEqualTo(originalBinValue);
assertThat(headers.get(ignoreEmptyBinKey)).isEqualTo(new byte[0]);
assertThat(headers.get(overwriteEmptyBinKey)).isEqualTo(new byte[0]);
}

@Test
Expand All @@ -290,7 +283,7 @@ public void applyMutations_binaryRemoval() {
public void applyMutations_stringValueWithBinaryKey_ignored() {
Metadata headers = new Metadata();
HeaderValueOption option = HeaderValueOption.create(HeaderValue.create("some-key-bin", "value"),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, false);
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);

headerMutator.applyMutations(
HeaderMutations.create(ImmutableList.of(option), ImmutableList.of()), headers);
Expand All @@ -304,7 +297,7 @@ public void applyMutations_binaryValueWithAsciiKey_ignored() {
Metadata headers = new Metadata();
HeaderValueOption option = HeaderValueOption.create(
HeaderValue.create("some-key", ByteString.copyFrom(new byte[] {1})),
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, false);
HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);

headerMutator.applyMutations(
HeaderMutations.create(ImmutableList.of(option), ImmutableList.of()), headers);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,9 @@ public class HeaderValueOptionTest {
public void create_withAllFields_success() {
HeaderValue header = HeaderValue.create("key1", "value1");
HeaderValueOption option = HeaderValueOption.create(
header, HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD, true);
header, HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);

assertThat(option.header()).isEqualTo(header);
assertThat(option.appendAction()).isEqualTo(HeaderAppendAction.APPEND_IF_EXISTS_OR_ADD);
assertThat(option.keepEmptyValue()).isTrue();
}
}