From f3161c201821d121260a60c2287fcb9396949b3d Mon Sep 17 00:00:00 2001 From: volyx Date: Thu, 28 Nov 2019 00:06:44 +0300 Subject: [PATCH] Update grpc-java to 1.25.0 #877 Motivation: Update grpc-java to 1.25.0 Modifications: added fallbackStatus to StatusSupplier Result: Fixes #877 --- .../io/servicetalk/grpc/api/GrpcUtils.java | 20 +++++++++++++++---- .../grpc/netty/ProtocolCompatibilityTest.java | 5 ++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/servicetalk-grpc-api/src/main/java/io/servicetalk/grpc/api/GrpcUtils.java b/servicetalk-grpc-api/src/main/java/io/servicetalk/grpc/api/GrpcUtils.java index c615549b90..dbea97a49c 100644 --- a/servicetalk-grpc-api/src/main/java/io/servicetalk/grpc/api/GrpcUtils.java +++ b/servicetalk-grpc-api/src/main/java/io/servicetalk/grpc/api/GrpcUtils.java @@ -201,8 +201,9 @@ private static GrpcStatusException extractGrpcExceptionFromHeaders(final HttpHea if (statusCode != null) { final GrpcStatusCode grpcStatusCode = GrpcStatusCode.fromCodeValue(statusCode); if (grpcStatusCode.value() != GrpcStatusCode.OK.value()) { - return new GrpcStatus(grpcStatusCode, null, headers.get(GRPC_STATUS_MESSAGE_TRAILER)) - .asException(new StatusSupplier(headers)); + final GrpcStatus grpcStatus = + new GrpcStatus(grpcStatusCode, null, headers.get(GRPC_STATUS_MESSAGE_TRAILER)); + return grpcStatus.asException(new StatusSupplier(headers, grpcStatus)); } } return null; @@ -234,11 +235,13 @@ static T uncheckedCast(Object o) { private static final class StatusSupplier implements Supplier { private final HttpHeaders headers; + private final GrpcStatus fallbackStatus; @Nullable private volatile StatusHolder statusHolder; - StatusSupplier(HttpHeaders headers) { + StatusSupplier(HttpHeaders headers, final GrpcStatus fallbackStatus) { this.headers = headers; + this.fallbackStatus = fallbackStatus; } @Nullable @@ -248,7 +251,16 @@ public Status get() { if (statusHolder == null) { // Cache the status (we don't bother caching any errors tho). Also its fine to only use a volatile here // as at worse this will just update to the "same" status again. - this.statusHolder = statusHolder = new StatusHolder(getStatusDetails(headers)); + final Status statusFromHeaders = getStatusDetails(headers); + if (statusFromHeaders == null) { + final Status.Builder builder = Status.newBuilder().setCode(fallbackStatus.code().value()); + if (fallbackStatus.description() != null) { + builder.setMessage(fallbackStatus.description()); + } + this.statusHolder = statusHolder = new StatusHolder(builder.build()); + } else { + this.statusHolder = statusHolder = new StatusHolder(statusFromHeaders); + } } return statusHolder.status; } diff --git a/servicetalk-grpc-netty/src/test/java/io/servicetalk/grpc/netty/ProtocolCompatibilityTest.java b/servicetalk-grpc-netty/src/test/java/io/servicetalk/grpc/netty/ProtocolCompatibilityTest.java index 91f786dca5..630efb3a9c 100644 --- a/servicetalk-grpc-netty/src/test/java/io/servicetalk/grpc/netty/ProtocolCompatibilityTest.java +++ b/servicetalk-grpc-netty/src/test/java/io/servicetalk/grpc/netty/ProtocolCompatibilityTest.java @@ -95,7 +95,6 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; @RunWith(Theories.class) @@ -542,11 +541,11 @@ private static void assertGrpcStatusException(final GrpcStatusException statusEx final GrpcStatus grpcStatus = statusException.status(); assertEquals(CUSTOM_ERROR_MESSAGE, grpcStatus.description()); final com.google.rpc.Status status = statusException.applicationStatus(); + assertNotNull(status); if (withStatus) { - assertNotNull(status); assertStatus(status, grpcStatus.code().value(), grpcStatus.description()); } else { - assertNull(status); + assertFallbackStatus(status, grpcStatus.code().value(), grpcStatus.description()); } }