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)