Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimone Bordet2015-12-11 11:25:54 +0000
committerSimone Bordet2015-12-11 11:25:54 +0000
commitc3889873f66c946f8848291d887d20d6f125a02b (patch)
treea609153aa074ae0d1bf241abd61c94d9a98f5fed /jetty-http2
parente7d8980952bddd172b1580462032e8c6221f3841 (diff)
downloadorg.eclipse.jetty.project-c3889873f66c946f8848291d887d20d6f125a02b.tar.gz
org.eclipse.jetty.project-c3889873f66c946f8848291d887d20d6f125a02b.tar.xz
org.eclipse.jetty.project-c3889873f66c946f8848291d887d20d6f125a02b.zip
484167 - GOAWAY frames aren't handling disconnects appropriately on Client.
Fixed by overriding onClose() to listen for GOAWAY frames, and acting appropriately.
Diffstat (limited to 'jetty-http2')
-rw-r--r--jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java67
-rw-r--r--jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java2
2 files changed, 43 insertions, 26 deletions
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java
index ea16c18fea..6e2adcb1f1 100644
--- a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java
@@ -32,6 +32,7 @@ import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.http2.api.Session;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.client.HTTP2ClientConnectionFactory;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
import org.eclipse.jetty.io.ClientConnectionFactory;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
@@ -107,37 +108,15 @@ public class HttpClientTransportOverHTTP2 extends ContainerLifeCycle implements
final HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
@SuppressWarnings("unchecked")
- final Promise<Connection> connection = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY);
+ final Promise<Connection> connectionPromise = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY);
- Session.Listener listener = new Session.Listener.Adapter()
- {
- @Override
- public void onFailure(Session session, Throwable failure)
- {
- destination.abort(failure);
- }
- };
-
- final Promise<Session> promise = new Promise<Session>()
- {
- @Override
- public void succeeded(Session session)
- {
- connection.succeeded(newHttpConnection(destination, session));
- }
-
- @Override
- public void failed(Throwable failure)
- {
- connection.failed(failure);
- }
- };
+ SessionListenerPromise listenerPromise = new SessionListenerPromise(destination, connectionPromise);
SslContextFactory sslContextFactory = null;
if (HttpScheme.HTTPS.is(destination.getScheme()))
sslContextFactory = httpClient.getSslContextFactory();
- client.connect(sslContextFactory, address, listener, promise, context);
+ client.connect(sslContextFactory, address, listenerPromise, listenerPromise, context);
}
@Override
@@ -154,4 +133,42 @@ public class HttpClientTransportOverHTTP2 extends ContainerLifeCycle implements
{
return new HttpConnectionOverHTTP2(destination, session);
}
+
+ private class SessionListenerPromise extends Session.Listener.Adapter implements Promise<Session>
+ {
+ private final HttpDestination destination;
+ private final Promise<Connection> promise;
+ private HttpConnectionOverHTTP2 connection;
+
+ public SessionListenerPromise(HttpDestination destination, Promise<Connection> promise)
+ {
+ this.destination = destination;
+ this.promise = promise;
+ }
+
+ @Override
+ public void succeeded(Session session)
+ {
+ connection = newHttpConnection(destination, session);
+ promise.succeeded(connection);
+ }
+
+ @Override
+ public void failed(Throwable failure)
+ {
+ promise.failed(failure);
+ }
+
+ @Override
+ public void onClose(Session session, GoAwayFrame frame)
+ {
+ connection.close();
+ }
+
+ @Override
+ public void onFailure(Session session, Throwable failure)
+ {
+ connection.abort(failure);
+ }
+ }
}
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java
index 0ad973f28f..98bff3286a 100644
--- a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java
@@ -69,7 +69,7 @@ public class HttpConnectionOverHTTP2 extends HttpConnection
abort(new AsynchronousCloseException());
}
- private void abort(Throwable failure)
+ protected void abort(Throwable failure)
{
for (HttpChannel channel : channels)
{

Back to the top