From d1183d8a03eaa5ec541e245ee605c3832a07f23e Mon Sep 17 00:00:00 2001 From: jrhee17 Date: Sun, 7 Nov 2021 14:44:14 +0900 Subject: [PATCH] fix to send a goaway if should disconnect --- .../armeria/client/Http2ResponseDecoder.java | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java b/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java index 57f76605e16..ed31480731c 100644 --- a/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java +++ b/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java @@ -139,16 +139,18 @@ public void onStreamClosed(Http2Stream stream) { return; } - if (!goAwayHandler.receivedGoAway()) { - res.close(ClosedStreamException.get()); - return; - } + if (res.isOpen()) { + if (!goAwayHandler.receivedGoAway()) { + res.close(ClosedStreamException.get()); + return; + } - final int lastStreamId = conn.local().lastStreamKnownByPeer(); - if (stream.id() > lastStreamId) { - res.close(UnprocessedRequestException.of(GoAwayReceivedException.get())); - } else { - res.close(ClosedStreamException.get()); + final int lastStreamId = conn.local().lastStreamKnownByPeer(); + if (stream.id() > lastStreamId) { + res.close(UnprocessedRequestException.of(GoAwayReceivedException.get())); + } else { + res.close(ClosedStreamException.get()); + } } if (shouldSendGoAway()) { @@ -185,7 +187,7 @@ public void onSettingsAckRead(ChannelHandlerContext ctx) {} public void onHeadersRead(ChannelHandlerContext ctx, int streamId, Http2Headers headers, int padding, boolean endOfStream) throws Http2Exception { keepAliveChannelRead(); - final HttpResponseWrapper res = getResponse(streamIdToId(streamId), endOfStream); + final HttpResponseWrapper res = getResponse(streamIdToId(streamId)); if (res == null || !res.isOpen()) { if (conn.streamMayHaveExisted(streamId)) { if (logger.isDebugEnabled()) { @@ -212,10 +214,6 @@ public void onHeadersRead(ChannelHandlerContext ctx, int streamId, Http2Headers if (endOfStream) { res.close(); - - if (shouldSendGoAway()) { - channel().close(); - } } } @@ -234,7 +232,7 @@ public int onDataRead( keepAliveChannelRead(); final int dataLength = data.readableBytes(); - final HttpResponseWrapper res = getResponse(streamIdToId(streamId), endOfStream); + final HttpResponseWrapper res = getResponse(streamIdToId(streamId)); if (res == null || !res.isOpen()) { if (conn.streamMayHaveExisted(streamId)) { if (logger.isDebugEnabled()) { @@ -272,12 +270,6 @@ public int onDataRead( if (endOfStream) { res.close(); - - if (shouldSendGoAway()) { - // The connection has reached its lifespan. - // Should send a GOAWAY frame if it did not receive or send a GOAWAY frame. - channel().close(); - } } // All bytes have been processed. @@ -295,7 +287,7 @@ private boolean shouldSendGoAway() { @Override public void onRstStreamRead(ChannelHandlerContext ctx, int streamId, long errorCode) throws Http2Exception { keepAliveChannelRead(); - final HttpResponseWrapper res = removeResponse(streamIdToId(streamId)); + final HttpResponseWrapper res = getResponse(streamIdToId(streamId)); if (res == null || !res.isOpen()) { if (conn.streamMayHaveExisted(streamId)) { if (logger.isDebugEnabled()) {