diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java index dadb6f19479..fe830b66949 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java @@ -277,6 +277,11 @@ public class SslConnection extends AbstractConnection super(null,getEndPoint().getLocalAddress(), getEndPoint().getRemoteAddress()); } + public EndPoint getEncryptedEndPoint() + { + return getEndPoint(); + } + @Override protected FillInterest getFillInterest() { @@ -761,5 +766,11 @@ public class SslConnection extends AbstractConnection { return _ishut; } + + @Override + public String toString() + { + return super.toString()+"->"+getEndPoint().toString(); + } } } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java index 8ee19802387..71dd53ba6e2 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java @@ -201,6 +201,8 @@ public class HttpConnection extends AbstractConnection { LOG.debug("{} onReadable {}",this,_channel.isIdle()); + int filled=-2; + try { setCurrentConnection(this); @@ -214,7 +216,7 @@ public class HttpConnection extends AbstractConnection if (_requestBuffer==null) _requestBuffer=_bufferPool.acquire(_httpConfig.getRequestHeaderSize(),false); // TODO may acquire on speculative read. probably released to early - int filled=getEndPoint().fill(_requestBuffer); + filled=getEndPoint().fill(_requestBuffer); LOG.debug("{} filled {}",this,filled); @@ -233,7 +235,10 @@ public class HttpConnection extends AbstractConnection // read -1 then we have nothing to parse and thus nothing that // will generate a response. If we had a suspended request pending // a response or a request waiting in the buffer, we would not be here. - getEndPoint().shutdownOutput(); + if (getEndPoint().isOutputShutdown()) + getEndPoint().close(); + else + getEndPoint().shutdownOutput(); // buffer must be empty and the channel must be idle, so we can release. releaseRequestBuffer(); return; @@ -480,7 +485,9 @@ public class HttpConnection extends AbstractConnection // make sure that an oshut connection is driven towards close // TODO this is a little ugly if (getEndPoint().isOpen() && getEndPoint().isOutputShutdown()) + { fillInterested(); + } } /* ------------------------------------------------------------ */ diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java index 0b66cc4bfd6..0fec2e975e3 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java @@ -1040,6 +1040,12 @@ public abstract class HttpServerTestBase extends HttpServerTestFixture Thread.sleep(200); // TODO this sometimes fails for SSL ??? + if (handler._endp.isOpen()) + { + System.err.println(handler._endp); + System.err.println(((SslConnection.DecryptedEndPoint)handler._endp).getEncryptedEndPoint()); + System.err.println(handler._endp.getConnection()); + } assertTrue(!handler._endp.isOpen()); } finally @@ -1051,7 +1057,7 @@ public abstract class HttpServerTestBase extends HttpServerTestFixture } } - protected static class CommittedErrorHandler extends AbstractHandler + public static class CommittedErrorHandler extends AbstractHandler { public EndPoint _endp; diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java index afe741c5778..c08e24ca18f 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java @@ -13,8 +13,10 @@ package org.eclipse.jetty.server.ssl; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.FileInputStream; +import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.security.KeyStore; @@ -24,8 +26,14 @@ import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; +import org.eclipse.jetty.io.ssl.SslConnection; +import org.eclipse.jetty.server.HttpChannel; import org.eclipse.jetty.server.HttpServerTestBase; import org.eclipse.jetty.server.SelectChannelConnector; +import org.eclipse.jetty.server.HttpServerTestBase.CommittedErrorHandler; +import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.StdErrLog; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.junit.Before; import org.junit.BeforeClass; @@ -135,5 +143,6 @@ public class SelectChannelServerSslTest extends HttpServerTestBase public void testAvailable() throws Exception { } + }