From 9aeebb13689d6b320383516a1f8f8e6eafa4b6ef Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Fri, 21 Dec 2018 13:18:42 +0100 Subject: [PATCH] Fixes #3212 - java.io.IOException: 1/unexpected_rst_stream_frame. Client and server need to to treat an incoming RST_STREAM frame differently, testing whether the stream is closed for respectively local and remote streams. Signed-off-by: Simone Bordet --- .../jetty/http2/client/HTTP2ClientSession.java | 12 ++++++++++++ .../java/org/eclipse/jetty/http2/HTTP2Session.java | 7 +++---- .../jetty/http2/server/HTTP2ServerSession.java | 12 ++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientSession.java b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientSession.java index 3be563d093c..a577e03732e 100644 --- a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientSession.java +++ b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientSession.java @@ -29,6 +29,7 @@ import org.eclipse.jetty.http2.api.Session; import org.eclipse.jetty.http2.api.Stream; import org.eclipse.jetty.http2.frames.HeadersFrame; import org.eclipse.jetty.http2.frames.PushPromiseFrame; +import org.eclipse.jetty.http2.frames.ResetFrame; import org.eclipse.jetty.http2.generator.Generator; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.util.Callback; @@ -117,6 +118,17 @@ public class HTTP2ClientSession extends HTTP2Session } } + @Override + protected void onResetForUnknownStream(ResetFrame frame) + { + int streamId = frame.getStreamId(); + boolean closed = isClientStream(streamId) ? isLocalStreamClosed(streamId) : isRemoteStreamClosed(streamId); + if (closed) + notifyReset(this, frame); + else + onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "unexpected_rst_stream_frame"); + } + @Override public void onPushPromise(PushPromiseFrame frame) { diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java index e1079aeb0ff..098f11d8334 100644 --- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java +++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java @@ -295,13 +295,12 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio } else { - if (isRemoteStreamClosed(streamId)) - notifyReset(this, frame); - else - onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "unexpected_rst_stream_frame"); + onResetForUnknownStream(frame); } } + protected abstract void onResetForUnknownStream(ResetFrame frame); + @Override public void onSettings(SettingsFrame frame) { diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerSession.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerSession.java index c89c72ed9ca..37d709c1385 100644 --- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerSession.java +++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerSession.java @@ -32,6 +32,7 @@ import org.eclipse.jetty.http2.api.server.ServerSessionListener; import org.eclipse.jetty.http2.frames.Frame; import org.eclipse.jetty.http2.frames.HeadersFrame; import org.eclipse.jetty.http2.frames.PushPromiseFrame; +import org.eclipse.jetty.http2.frames.ResetFrame; import org.eclipse.jetty.http2.frames.SettingsFrame; import org.eclipse.jetty.http2.frames.WindowUpdateFrame; import org.eclipse.jetty.http2.generator.Generator; @@ -139,6 +140,17 @@ public class HTTP2ServerSession extends HTTP2Session implements ServerParser.Lis } } + @Override + protected void onResetForUnknownStream(ResetFrame frame) + { + int streamId = frame.getStreamId(); + boolean closed = isClientStream(streamId) ? isRemoteStreamClosed(streamId) : isLocalStreamClosed(streamId); + if (closed) + notifyReset(this, frame); + else + onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "unexpected_rst_stream_frame"); + } + @Override public void onPushPromise(PushPromiseFrame frame) {