From eed8f923afc700ca3bf882bf68a0745823de1a6b Mon Sep 17 00:00:00 2001 From: Xudong Ma Date: Fri, 29 May 2015 10:21:52 -0700 Subject: [PATCH] okhttp: Call onError for IOException thrown by FrameReader.nextFrame(). Since OkHttp wraps many protocol error as IOException, we need to send GoAway for such errors. Fixes #487 --- .../io/grpc/transport/okhttp/OkHttpClientTransport.java | 4 +++- .../io/grpc/transport/okhttp/OkHttpClientTransportTest.java | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java index 6cd37f4259..67039b1420 100644 --- a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java +++ b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java @@ -493,7 +493,9 @@ public class OkHttpClientTransport implements ClientTransport { while (frameReader.nextFrame(this)) { } } catch (IOException ioe) { - onIoException(ioe); + // We call onError instead of onIoException here, because OkHttp wraps many protocol errors + // as IOException, we should send GoAway for such errors. + onError(ErrorCode.PROTOCOL_ERROR, ioe.getMessage()); } finally { try { frameReader.close(); diff --git a/okhttp/src/test/java/io/grpc/transport/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/transport/okhttp/OkHttpClientTransportTest.java index 9c2fb2ff1e..79e4b5ff1a 100644 --- a/okhttp/src/test/java/io/grpc/transport/okhttp/OkHttpClientTransportTest.java +++ b/okhttp/src/test/java/io/grpc/transport/okhttp/OkHttpClientTransportTest.java @@ -162,9 +162,9 @@ public class OkHttpClientTransportTest { listener2.waitUntilStreamClosed(); assertEquals(0, streams.size()); assertEquals(Status.INTERNAL.getCode(), listener1.status.getCode()); - assertEquals(NETWORK_ISSUE_MESSAGE, listener2.status.getCause().getMessage()); - assertEquals(Status.INTERNAL.getCode(), listener1.status.getCode()); - assertEquals(NETWORK_ISSUE_MESSAGE, listener2.status.getCause().getMessage()); + assertEquals("Protocol error\n" + NETWORK_ISSUE_MESSAGE, listener1.status.getDescription()); + assertEquals(Status.INTERNAL.getCode(), listener2.status.getCode()); + assertEquals("Protocol error\n" + NETWORK_ISSUE_MESSAGE, listener2.status.getDescription()); verify(transportListener).transportShutdown(); verify(transportListener, timeout(TIME_OUT_MS)).transportTerminated(); }