diff --git a/auth/src/main/java/io/grpc/auth/ClientAuthInterceptor.java b/auth/src/main/java/io/grpc/auth/ClientAuthInterceptor.java index b64cc0d77a..6f7574d046 100644 --- a/auth/src/main/java/io/grpc/auth/ClientAuthInterceptor.java +++ b/auth/src/main/java/io/grpc/auth/ClientAuthInterceptor.java @@ -41,7 +41,9 @@ import io.grpc.ClientInterceptor; import io.grpc.ClientInterceptors.CheckedForwardingClientCall; import io.grpc.Metadata; import io.grpc.MethodDescriptor; +import io.grpc.Status; +import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; @@ -82,8 +84,8 @@ public class ClientAuthInterceptor implements ClientInterceptor { // metadata map until the next refresh cycle. This will be fixed once // https://github.com/google/google-auth-library-java/issues/3 // is resolved. - if (lastMetadata == null || lastMetadata != credentials.getRequestMetadata()) { - lastMetadata = credentials.getRequestMetadata(); + if (lastMetadata == null || lastMetadata != getRequestMetadata()) { + lastMetadata = getRequestMetadata(); cached = toHeaders(lastMetadata); } cachedSaved = cached; @@ -94,6 +96,14 @@ public class ClientAuthInterceptor implements ClientInterceptor { }; } + private Map> getRequestMetadata() { + try { + return credentials.getRequestMetadata(); + } catch (IOException e) { + throw Status.UNAUTHENTICATED.withCause(e).asRuntimeException(); + } + } + private static final Metadata.Headers toHeaders(Map> metadata) { Metadata.Headers headers = new Metadata.Headers(); if (metadata != null) { diff --git a/auth/src/test/java/io/grpc/auth/ClientAuthInterceptorTests.java b/auth/src/test/java/io/grpc/auth/ClientAuthInterceptorTests.java index 42f3ac8434..f1daabe363 100644 --- a/auth/src/test/java/io/grpc/auth/ClientAuthInterceptorTests.java +++ b/auth/src/test/java/io/grpc/auth/ClientAuthInterceptorTests.java @@ -137,7 +137,7 @@ public class ClientAuthInterceptorTests { Mockito.verify(listener).onClose(statusCaptor.capture(), isA(Metadata.Trailers.class)); Assert.assertNull(headers.getAll(AUTHORIZATION)); Mockito.verify(call, never()).start(listener, headers); - Assert.assertEquals(Status.Code.UNKNOWN, statusCaptor.getValue().getCode()); + Assert.assertEquals(Status.Code.UNAUTHENTICATED, statusCaptor.getValue().getCode()); Assert.assertNotNull(statusCaptor.getValue().getCause()); } diff --git a/core/src/main/java/io/grpc/internal/Http2ClientStream.java b/core/src/main/java/io/grpc/internal/Http2ClientStream.java index 774bdb89ab..2114339b5c 100644 --- a/core/src/main/java/io/grpc/internal/Http2ClientStream.java +++ b/core/src/main/java/io/grpc/internal/Http2ClientStream.java @@ -181,7 +181,7 @@ public abstract class Http2ClientStream extends AbstractClientStream { if (status == null) { status = statusFromHttpStatus(trailers); if (status == null || status.isOk()) { - status = Status.INTERNAL.withDescription("missing GRPC status in response"); + status = Status.UNKNOWN.withDescription("missing GRPC status in response"); } else { status = status.withDescription( "missing GRPC status, inferred error from HTTP status code"); diff --git a/core/src/main/java/io/grpc/internal/MessageDeframer.java b/core/src/main/java/io/grpc/internal/MessageDeframer.java index aeb2f66130..b0c8bf5fcd 100644 --- a/core/src/main/java/io/grpc/internal/MessageDeframer.java +++ b/core/src/main/java/io/grpc/internal/MessageDeframer.java @@ -39,6 +39,7 @@ import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.util.zip.GZIPInputStream; +import java.util.zip.ZipException; import javax.annotation.concurrent.NotThreadSafe; @@ -352,11 +353,14 @@ public class MessageDeframer implements Closeable { } if (compression != Compression.GZIP) { - throw new AssertionError("Unknown compression type"); + throw Status.INVALID_ARGUMENT.withDescription("Unknown compression type") + .asRuntimeException(); } try { return new GZIPInputStream(ReadableBuffers.openStream(nextFrame, true)); + } catch (ZipException e) { + throw Status.INTERNAL.withDescription("Decompression failed").asRuntimeException(); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java index e340b45558..4c64d88db3 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java @@ -437,7 +437,7 @@ class OkHttpClientTransport implements ClientTransport { */ void onIoException(IOException failureCause) { log.log(Level.SEVERE, "Transport failed", failureCause); - onGoAway(0, Status.INTERNAL.withCause(failureCause)); + onGoAway(0, Status.UNAVAILABLE.withCause(failureCause)); } /** diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java index 85fa6715fa..53889800cc 100644 --- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java +++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java @@ -1058,7 +1058,7 @@ public class OkHttpClientTransportTest { // ping failed on error assertEquals(1, callback.invocationCount); assertTrue(callback.failureCause instanceof StatusException); - assertEquals(Status.Code.INTERNAL, + assertEquals(Status.Code.UNAVAILABLE, ((StatusException) callback.failureCause).getStatus().getCode()); // now that handler is in terminal state, all future pings fail immediately @@ -1066,7 +1066,7 @@ public class OkHttpClientTransportTest { clientTransport.ping(callback, MoreExecutors.directExecutor()); assertEquals(1, callback.invocationCount); assertTrue(callback.failureCause instanceof StatusException); - assertEquals(Status.Code.INTERNAL, + assertEquals(Status.Code.UNAVAILABLE, ((StatusException) callback.failureCause).getStatus().getCode()); }