aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahooinc.com>2023-06-08 14:55:32 +0200
committerBjørn Christian Seime <bjorncs@yahooinc.com>2023-06-08 14:55:32 +0200
commit6d2740288679db4c6310dada934cceef31590e31 (patch)
treed967111398f2567f5f9ee50db92501978b9fcad5 /container-core/src/main/java/com/yahoo/jdisc/http/server/jetty
parentc3d8c532e0f5b1db896d8693409098e8c2980da1 (diff)
Add workaround for stale requests
Diffstat (limited to 'container-core/src/main/java/com/yahoo/jdisc/http/server/jetty')
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java6
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java13
2 files changed, 15 insertions, 4 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java
index b92a723fac8..6fdcc96bdc9 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java
@@ -85,13 +85,13 @@ class HttpRequestDispatch {
return;
}
- servletRequestReader.finishedFuture().whenComplete((__, t) -> {
+ var readCompleted = servletRequestReader.finishedFuture().whenComplete((__, t) -> {
if (t != null) servletResponseController.trySendErrorResponse(t);
});
- servletResponseController.finishedFuture().whenComplete((__, t) -> {
+ var writeCompleted = servletResponseController.finishedFuture().whenComplete((__, t) -> {
if (t != null) servletRequestReader.fail(t);
});
- CompletableFuture.allOf(servletRequestReader.finishedFuture(), servletResponseController.finishedFuture())
+ CompletableFuture.allOf(readCompleted, writeCompleted)
.whenComplete((r, t) -> {
if (t != null) requestCompletion.completeExceptionally(t);
else requestCompletion.complete(null);
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java
index d853282a5f5..97aea01b6ab 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletOutputStreamWriter.java
@@ -4,6 +4,9 @@ package com.yahoo.jdisc.http.server.jetty;
import com.yahoo.jdisc.handler.CompletionHandler;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.WriteListener;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnection;
+import org.eclipse.jetty.http2.server.HTTP2ServerSession;
+import org.eclipse.jetty.server.HttpOutput;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -87,7 +90,15 @@ class ServletOutputStreamWriter {
switch (state) {
case NOT_STARTED:
try {
- outputStream.setWriteListener(writeListener);
+ // Experimental workaround for write listener not being invoked when the connection is closed
+ if (outputStream instanceof HttpOutput out
+ && out.getHttpChannel().getConnection() instanceof HTTP2ServerConnection conn
+ && conn.getSession() instanceof HTTP2ServerSession session
+ && (session.isStopping() || session.isStopped())) {
+ throw new IOException("HTTP/2 session has stopped");
+ } else {
+ outputStream.setWriteListener(writeListener);
+ }
state = State.WAITING_FOR_WRITE_POSSIBLE_CALLBACK;
} catch (Throwable t) {
registrationFailure = t;