From 15e2f7226446f1a9f4ba4a6fb4bbd94f8be303e2 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Tue, 27 Aug 2019 11:33:06 +1000 Subject: [PATCH] updated after merge to fix tests Signed-off-by: Greg Wilkins --- .../jetty/http2/server/HTTP2ServerConnection.java | 5 ++--- .../jetty/http2/server/HttpTransportOverHTTP2.java | 5 +++-- .../java/org/eclipse/jetty/server/HttpChannel.java | 13 ++++++++++--- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java index 2dd10e670e6..4173eb5f1d0 100644 --- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java +++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java @@ -376,10 +376,9 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection } @Override - protected void checkAndPrepareUpgrade() + protected boolean checkAndPrepareUpgrade() { - if (isTunnel()) - getHttpTransport().prepareUpgrade(); + return isTunnel() && getHttpTransport().prepareUpgrade(); } @Override diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java index 1f53feba058..2664adceb7a 100644 --- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java +++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java @@ -322,7 +322,7 @@ public class HttpTransportOverHTTP2 implements HttpTransport return transportCallback.onIdleTimeout(failure); } - void prepareUpgrade() + boolean prepareUpgrade() { HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttachment(); Request request = channel.getRequest(); @@ -331,7 +331,8 @@ public class HttpTransportOverHTTP2 implements HttpTransport endPoint.upgrade(connection); stream.setAttachment(endPoint); if (request.getHttpInput().hasContent()) - channel.sendErrorOrAbort("Unexpected content in CONNECT request"); + return channel.sendErrorOrAbort("Unexpected content in CONNECT request"); + return true; } @Override diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java index 21b27f69047..0df6668f113 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java @@ -491,11 +491,15 @@ public class HttpChannel implements Runnable, HttpOutput.Interceptor if (sendErrorOrAbort("Insufficient content written")) break; } + + // Check if an update is done (if so, do not close) + if (checkAndPrepareUpgrade()) + break; + // TODO Currently a blocking/aborting consumeAll is done in the handling of the TERMINATED // TODO Action triggered by the completed callback below. It would be possible to modify the // TODO callback to do a non-blocking consumeAll at this point and only call completed when // TODO that is done. - checkAndPrepareUpgrade(); // Set a close callback on the HttpOutput to make it an async callback _response.closeOutput(Callback.from(_state::completed)); @@ -731,9 +735,12 @@ public class HttpChannel implements Runnable, HttpOutput.Interceptor * response is sent back to the client.

*

This avoids a race where the server is unprepared if the client sends * data immediately after having received the upgrade response.

+ * @return true if the channel is not complete and more processing is required, + * either because the upgrade has succeeded or sendError has been called. */ - protected void checkAndPrepareUpgrade() + protected boolean checkAndPrepareUpgrade() { + return false; } public void onCompleted() @@ -791,7 +798,7 @@ public class HttpChannel implements Runnable, HttpOutput.Interceptor if (handler != null) content = handler.badMessageError(status, reason, fields); - sendResponse(new MetaData.Response(HttpVersion.HTTP_1_1, status, reason, fields, BufferUtil.length(content)), content, true); + sendResponse(new MetaData.Response(HttpVersion.HTTP_1_1, status, null, fields, BufferUtil.length(content)), content, true); } } catch (IOException e)