From 6407d9877b55942fb49bee4015e109f28f3eac3d Mon Sep 17 00:00:00 2001 From: Aaron Steinfeld Date: Mon, 17 Oct 2022 17:42:29 -0400 Subject: [PATCH] refactor: add support for trailer building and update deps --- grpc-context-utils/build.gradle.kts | 8 ++++++-- .../core/grpcutils/context/RequestContext.java | 15 +++++++++++++++ .../grpcutils/context/RequestContextTest.java | 15 +++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/grpc-context-utils/build.gradle.kts b/grpc-context-utils/build.gradle.kts index 314fffa..946c8f8 100644 --- a/grpc-context-utils/build.gradle.kts +++ b/grpc-context-utils/build.gradle.kts @@ -19,8 +19,12 @@ dependencies { implementation("org.slf4j:slf4j-api:1.7.36") constraints { - implementation("com.fasterxml.jackson.core:jackson-databind:2.13.4") { - because("https://nvd.nist.gov/vuln/detail/CVE-2022-42004") + implementation("com.fasterxml.jackson.core:jackson-databind:2.13.4.2") { + because("https://nvd.nist.gov/vuln/detail/CVE-2022-42003") + } + implementation("com.google.protobuf:protobuf-java:3.21.7") { + // Not used directly, but typically used together for since we always use proto and grpc together + because("CVE-2022-3171") } } diff --git a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContext.java b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContext.java index 9c50393..7b837d8 100644 --- a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContext.java +++ b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContext.java @@ -1,11 +1,13 @@ package org.hypertrace.core.grpcutils.context; +import static io.grpc.Metadata.ASCII_STRING_MARSHALLER; import static org.hypertrace.core.grpcutils.context.RequestContextConstants.CACHE_MEANINGFUL_HEADERS; import static org.hypertrace.core.grpcutils.context.RequestContextConstants.TENANT_ID_HEADER_KEY; import com.google.common.collect.Maps; import io.grpc.Context; import io.grpc.Metadata; +import io.grpc.Metadata.Key; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.HashMap; @@ -183,6 +185,19 @@ public ContextualKey buildInternalContextualKey(T data) { return new DefaultContextualKey<>(this, data, List.of(TENANT_ID_HEADER_KEY)); } + /** Converts the request context into metadata to be used as trailers */ + public Metadata buildTrailers() { + Metadata trailers = new Metadata(); + // For now, the only context item to use as a trailer is the request id + this.getRequestId() + .ifPresent( + requestId -> + trailers.put( + Key.of(RequestContextConstants.REQUEST_ID_HEADER_KEY, ASCII_STRING_MARSHALLER), + requestId)); + return trailers; + } + private Map getHeadersOtherThanAuth() { return Maps.filterKeys( headers, key -> !key.equals(RequestContextConstants.AUTHORIZATION_HEADER)); diff --git a/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java b/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java index c327d17..3b69363 100644 --- a/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java +++ b/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import com.google.common.collect.ImmutableList; import io.grpc.Metadata; @@ -156,4 +157,18 @@ public void testMetadataKeys() { Assertions.assertEquals( "AAARf5ZpQwlN/8FVe1axOPlaAQIdRU/Y8j0LAgE", requestContext.get("grpc-trace-bin").get()); } + + @Test + public void buildsTrailers() { + RequestContext requestContext = RequestContext.forTenantId("test"); + + // Try building trailers and then request context from them. + RequestContext requestContextFromBuiltTrailers = + RequestContext.fromMetadata(requestContext.buildTrailers()); + + // Should not be equal because tenant id is not a trailer so should be lost + assertNotEquals(requestContext, requestContextFromBuiltTrailers); + // Request IDs should however be equal + assertEquals(requestContext.getRequestId(), requestContextFromBuiltTrailers.getRequestId()); + } }