diff options
author | Simone Bordet | 2015-11-04 12:26:27 +0000 |
---|---|---|
committer | Simone Bordet | 2015-11-04 12:26:27 +0000 |
commit | 0172b68301786e8b29e62865afe9ec9edfdf13d2 (patch) | |
tree | 0c05a5ac42b81dce8a055e29fad7024805c6d379 | |
parent | b02783220eeebd68a29cbd0a2bdcdd79312247dd (diff) | |
download | org.eclipse.jetty.project-0172b68301786e8b29e62865afe9ec9edfdf13d2.tar.gz org.eclipse.jetty.project-0172b68301786e8b29e62865afe9ec9edfdf13d2.tar.xz org.eclipse.jetty.project-0172b68301786e8b29e62865afe9ec9edfdf13d2.zip |
481006 - SSL requests intermittently fail with EOFException when SSL renegotiation is disallowed.
Fixed by notifying the Connection promise from onOpen() rather than
just after the creation of the connection.
10 files changed, 132 insertions, 28 deletions
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java index fe6617f32e..e45d78dc07 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java @@ -49,17 +49,26 @@ public class HttpClientTransportOverHTTP extends AbstractHttpClientTransport @Override public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException { - HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY); - HttpConnectionOverHTTP connection = newHttpConnection(endPoint, destination); @SuppressWarnings("unchecked") Promise<Connection> promise = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY); - promise.succeeded(connection); + HttpConnectionOverHTTP connection = newHttpConnection(endPoint, destination, promise); + if (LOG.isDebugEnabled()) + LOG.debug("Created {}", connection); return connection; } + protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise) + { + return new HttpConnectionOverHTTP(endPoint, destination, promise); + } + + /** + * @deprecated use {@link #newHttpConnection(EndPoint, HttpDestination, Promise)} instead + */ + @Deprecated protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination) { - return new HttpConnectionOverHTTP(endPoint, destination); + throw new UnsupportedOperationException("Deprecated, override newHttpConnection(EndPoint, HttpDestination, Promise<Connection>) instead"); } } diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java index 28c4c2ecd9..d4f350bb53 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.io.AbstractConnection; import org.eclipse.jetty.io.EndPoint; +import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.thread.Sweeper; @@ -41,13 +42,25 @@ public class HttpConnectionOverHTTP extends AbstractConnection implements Connec private final AtomicBoolean closed = new AtomicBoolean(); private final AtomicInteger sweeps = new AtomicInteger(); + private final Promise<Connection> promise; private final Delegate delegate; private final HttpChannelOverHTTP channel; private long idleTimeout; + /** + * @deprecated use {@link #HttpConnectionOverHTTP(EndPoint, HttpDestination, Promise)} instead + */ + @Deprecated public HttpConnectionOverHTTP(EndPoint endPoint, HttpDestination destination) { + this(endPoint, destination, new Promise.Adapter<Connection>()); + throw new UnsupportedOperationException("Deprecated, use HttpConnectionOverHTTP(EndPoint, HttpDestination, Promise<Connection>) instead"); + } + + public HttpConnectionOverHTTP(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise) + { super(endPoint, destination.getHttpClient().getExecutor(), destination.getHttpClient().isDispatchIO()); + this.promise = promise; this.delegate = new Delegate(destination); this.channel = newHttpChannel(); } @@ -83,6 +96,7 @@ public class HttpConnectionOverHTTP extends AbstractConnection implements Connec { super.onOpen(); fillInterested(); + promise.succeeded(this); } public boolean isClosed() diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java index 1ca753c1d8..70303ba3e3 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java @@ -60,6 +60,12 @@ public abstract class AbstractHttpClientServerTest public void start(Handler handler) throws Exception { + startServer(handler); + startClient(); + } + + protected void startServer(Handler handler) throws Exception + { if (sslContextFactory != null) { sslContextFactory.setEndpointIdentificationAlgorithm(""); @@ -79,8 +85,6 @@ public abstract class AbstractHttpClientServerTest server.addConnector(connector); server.setHandler(handler); server.start(); - - startClient(); } protected void startClient() throws Exception diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java index 585ff24c62..9453025ba6 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java @@ -24,6 +24,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import org.eclipse.jetty.client.api.Connection; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.api.Result; @@ -35,6 +36,7 @@ import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.junit.After; import org.junit.Assert; @@ -75,9 +77,9 @@ public class HttpClientFailureTest client = new HttpClient(new HttpClientTransportOverHTTP() { @Override - protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination) + protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise) { - HttpConnectionOverHTTP connection = super.newHttpConnection(endPoint, destination); + HttpConnectionOverHTTP connection = super.newHttpConnection(endPoint, destination, promise); connectionRef.set(connection); return connection; } @@ -119,9 +121,9 @@ public class HttpClientFailureTest client = new HttpClient(new HttpClientTransportOverHTTP() { @Override - protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination) + protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise) { - HttpConnectionOverHTTP connection = super.newHttpConnection(endPoint, destination); + HttpConnectionOverHTTP connection = super.newHttpConnection(endPoint, destination, promise); connectionRef.set(connection); return connection; } diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java index 727d5185a9..144588b262 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java @@ -42,6 +42,7 @@ import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; @@ -58,6 +59,7 @@ import org.eclipse.jetty.client.api.Destination; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.api.Result; +import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP; import org.eclipse.jetty.client.http.HttpConnectionOverHTTP; import org.eclipse.jetty.client.http.HttpDestinationOverHTTP; import org.eclipse.jetty.client.util.BufferingResponseListener; @@ -70,12 +72,14 @@ import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpHeaderValue; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpVersion; +import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.toolchain.test.TestingDir; import org.eclipse.jetty.toolchain.test.annotation.Slow; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.FuturePromise; import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.junit.Assert; import org.junit.Assume; @@ -83,7 +87,6 @@ import org.junit.Rule; import org.junit.Test; import static java.nio.file.StandardOpenOption.CREATE; -import static org.junit.Assert.assertTrue; public class HttpClientTest extends AbstractHttpClientServerTest { @@ -813,7 +816,7 @@ public class HttpClientTest extends AbstractHttpClientServerTest }); } - assertTrue(latch.await(10, TimeUnit.SECONDS)); + Assert.assertTrue(latch.await(10, TimeUnit.SECONDS)); } @Test @@ -1432,6 +1435,62 @@ public class HttpClientTest extends AbstractHttpClientServerTest Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS)); } + @Test + public void testRequestSentOnlyAfterConnectionOpen() throws Exception + { + startServer(new AbstractHandler() + { + @Override + public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + baseRequest.setHandled(true); + } + }); + + final AtomicBoolean open = new AtomicBoolean(); + client = new HttpClient(new HttpClientTransportOverHTTP() + { + @Override + protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise) + { + return new HttpConnectionOverHTTP(endPoint, destination, promise) + { + @Override + public void onOpen() + { + open.set(true); + super.onOpen(); + } + }; + } + }, sslContextFactory); + client.start(); + + final CountDownLatch latch = new CountDownLatch(2); + client.newRequest("localhost", connector.getLocalPort()) + .scheme(scheme) + .onRequestBegin(new Request.BeginListener() + { + @Override + public void onBegin(Request request) + { + Assert.assertTrue(open.get()); + latch.countDown(); + } + }) + .send(new Response.CompleteListener() + { + @Override + public void onComplete(Result result) + { + if (result.isSucceeded()) + latch.countDown(); + } + }); + + Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); + } + private void consume(InputStream input) throws IOException { while (true) diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java index 16bfd449ad..61e8cf53d8 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java @@ -25,10 +25,12 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; + import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.client.api.Connection; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.api.Result; import org.eclipse.jetty.client.http.HttpChannelOverHTTP; @@ -41,6 +43,7 @@ import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.junit.Assert; import org.junit.Test; @@ -165,9 +168,9 @@ public class HttpClientUploadDuringServerShutdown HttpClient client = new HttpClient(new HttpClientTransportOverHTTP(1) { @Override - protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination) + protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise) { - return new HttpConnectionOverHTTP(endPoint, destination) + return new HttpConnectionOverHTTP(endPoint, destination, promise) { @Override protected HttpChannelOverHTTP newHttpChannel() diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java index 6894841fa5..3dbb7a7bc8 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java @@ -30,6 +30,7 @@ import org.eclipse.jetty.client.HttpExchange; import org.eclipse.jetty.client.HttpRequest; import org.eclipse.jetty.client.HttpResponseException; import org.eclipse.jetty.client.Origin; +import org.eclipse.jetty.client.api.Connection; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.util.FutureResponseListener; import org.eclipse.jetty.http.HttpFields; @@ -37,6 +38,7 @@ import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.io.ByteArrayEndPoint; import org.eclipse.jetty.toolchain.test.TestTracker; +import org.eclipse.jetty.util.Promise; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -60,7 +62,7 @@ public class HttpReceiverOverHTTPTest client.start(); destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); endPoint = new ByteArrayEndPoint(); - connection = new HttpConnectionOverHTTP(endPoint, destination); + connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); } @After @@ -205,7 +207,7 @@ public class HttpReceiverOverHTTPTest @Test public void test_FillInterested_RacingWith_BufferRelease() throws Exception { - connection = new HttpConnectionOverHTTP(endPoint, destination) + connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()) { @Override protected HttpChannelOverHTTP newHttpChannel() @@ -232,7 +234,7 @@ public class HttpReceiverOverHTTPTest }; } }; - + // Partial response to trigger the call to fillInterested(). endPoint.setInput("" + "HTTP/1.1 200 OK\r\n" + diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpSenderOverHTTPTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpSenderOverHTTPTest.java index fdbcc43dd1..b98aea13ab 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpSenderOverHTTPTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpSenderOverHTTPTest.java @@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.Origin; +import org.eclipse.jetty.client.api.Connection; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.api.Result; @@ -34,6 +35,7 @@ import org.eclipse.jetty.client.util.ByteBufferContentProvider; import org.eclipse.jetty.io.ByteArrayEndPoint; import org.eclipse.jetty.toolchain.test.TestTracker; import org.eclipse.jetty.toolchain.test.annotation.Slow; +import org.eclipse.jetty.util.Promise; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -65,7 +67,7 @@ public class HttpSenderOverHTTPTest { ByteArrayEndPoint endPoint = new ByteArrayEndPoint(); HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); - HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination); + HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); Request request = client.newRequest(URI.create("http://localhost/")); final CountDownLatch headersLatch = new CountDownLatch(1); final CountDownLatch successLatch = new CountDownLatch(1); @@ -98,7 +100,7 @@ public class HttpSenderOverHTTPTest { ByteArrayEndPoint endPoint = new ByteArrayEndPoint("", 16); HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); - HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination); + HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); Request request = client.newRequest(URI.create("http://localhost/")); connection.send(request, null); @@ -127,7 +129,7 @@ public class HttpSenderOverHTTPTest // Shutdown output to trigger the exception on write endPoint.shutdownOutput(); HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); - HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination); + HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); Request request = client.newRequest(URI.create("http://localhost/")); final CountDownLatch failureLatch = new CountDownLatch(2); request.listener(new Request.Listener.Adapter() @@ -156,7 +158,7 @@ public class HttpSenderOverHTTPTest { ByteArrayEndPoint endPoint = new ByteArrayEndPoint("", 16); HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); - HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination); + HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); Request request = client.newRequest(URI.create("http://localhost/")); final CountDownLatch failureLatch = new CountDownLatch(2); request.listener(new Request.Listener.Adapter() @@ -191,7 +193,7 @@ public class HttpSenderOverHTTPTest { ByteArrayEndPoint endPoint = new ByteArrayEndPoint(); HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); - HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination); + HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); Request request = client.newRequest(URI.create("http://localhost/")); String content = "abcdef"; request.content(new ByteBufferContentProvider(ByteBuffer.wrap(content.getBytes(StandardCharsets.UTF_8)))); @@ -225,7 +227,7 @@ public class HttpSenderOverHTTPTest { ByteArrayEndPoint endPoint = new ByteArrayEndPoint(); HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); - HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination); + HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); Request request = client.newRequest(URI.create("http://localhost/")); String content1 = "0123456789"; String content2 = "abcdef"; @@ -260,7 +262,7 @@ public class HttpSenderOverHTTPTest { ByteArrayEndPoint endPoint = new ByteArrayEndPoint(); HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080)); - HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination); + HttpConnectionOverHTTP connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>()); Request request = client.newRequest(URI.create("http://localhost/")); String content1 = "0123456789"; String content2 = "ABCDEF"; diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java index 1491a24066..edfcfc2022 100644 --- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java +++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java @@ -69,12 +69,11 @@ public class HttpClientTransportOverFCGI extends AbstractHttpClientTransport public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException { HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY); - HttpConnectionOverFCGI connection = new HttpConnectionOverFCGI(endPoint, destination, isMultiplexed()); - if (LOG.isDebugEnabled()) - LOG.debug("Created {}", connection); @SuppressWarnings("unchecked") Promise<Connection> promise = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY); - promise.succeeded(connection); + HttpConnectionOverFCGI connection = new HttpConnectionOverFCGI(endPoint, destination, promise, isMultiplexed()); + if (LOG.isDebugEnabled()) + LOG.debug("Created {}", connection); return connection; } diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java index 056098022b..8b4ff09bcd 100644 --- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java +++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java @@ -46,6 +46,7 @@ import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.CompletableCallback; +import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -58,6 +59,7 @@ public class HttpConnectionOverFCGI extends AbstractConnection implements Connec private final AtomicBoolean closed = new AtomicBoolean(); private final Flusher flusher; private final HttpDestination destination; + private final Promise<Connection> promise; private final boolean multiplexed; private final Delegate delegate; private final ClientParser parser; @@ -65,8 +67,15 @@ public class HttpConnectionOverFCGI extends AbstractConnection implements Connec public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, boolean multiplexed) { + this(endPoint, destination, new Promise.Adapter<Connection>(), multiplexed); + throw new UnsupportedOperationException("Deprecated, use HttpConnectionOverFCGI(EndPoint, HttpDestination, Promise<Connection>, boolean) instead"); + } + + public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise, boolean multiplexed) + { super(endPoint, destination.getHttpClient().getExecutor(), destination.getHttpClient().isDispatchIO()); this.destination = destination; + this.promise = promise; this.multiplexed = multiplexed; this.flusher = new Flusher(endPoint); this.delegate = new Delegate(destination); @@ -95,6 +104,7 @@ public class HttpConnectionOverFCGI extends AbstractConnection implements Connec { super.onOpen(); fillInterested(); + promise.succeeded(this); } @Override |