diff --git a/quickfixj-core/src/main/java/org/quickfixj/jmx/mbean/connector/SocketAcceptorAdmin.java b/quickfixj-core/src/main/java/org/quickfixj/jmx/mbean/connector/SocketAcceptorAdmin.java index 77268bac4f..99ced08465 100644 --- a/quickfixj-core/src/main/java/org/quickfixj/jmx/mbean/connector/SocketAcceptorAdmin.java +++ b/quickfixj-core/src/main/java/org/quickfixj/jmx/mbean/connector/SocketAcceptorAdmin.java @@ -20,7 +20,6 @@ import org.quickfixj.jmx.JmxExporter; import org.quickfixj.jmx.mbean.JmxSupport; import org.quickfixj.jmx.mbean.session.SessionJmxExporter; -import org.quickfixj.jmx.openmbean.TabularDataAdapter; import quickfix.SessionID; import quickfix.mina.acceptor.AbstractSocketAcceptor; diff --git a/quickfixj-core/src/main/java/quickfix/mina/AbstractIoHandler.java b/quickfixj-core/src/main/java/quickfix/mina/AbstractIoHandler.java index a8c892dbe4..ad4b3dae36 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/AbstractIoHandler.java +++ b/quickfixj-core/src/main/java/quickfix/mina/AbstractIoHandler.java @@ -128,8 +128,6 @@ public void sessionClosed(IoSession ioSession) { if (quickFixSession != null) { eventHandlingStrategy.onMessage(quickFixSession, EventHandlingStrategy.END_OF_STREAM); } - } catch (Exception e) { - throw e; } finally { ioSession.removeAttribute(SessionConnector.QF_SESSION); } diff --git a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java index f9f418b5d6..3af627646b 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java +++ b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java @@ -45,6 +45,7 @@ import quickfix.mina.ProtocolFactory; import quickfix.mina.SessionConnector; import quickfix.mina.message.FIXProtocolCodecFactory; +import quickfix.mina.ssl.AcceptorSslFilter; import quickfix.mina.ssl.SSLConfig; import quickfix.mina.ssl.SSLContextFactory; import quickfix.mina.ssl.SSLSupport; @@ -134,7 +135,7 @@ private void installSSL(AcceptorSocketDescriptor descriptor, log.info("Installing SSL filter for {}", descriptor.getAddress()); SSLConfig sslConfig = descriptor.getSslConfig(); SSLContext sslContext = SSLContextFactory.getInstance(sslConfig); - SslFilter sslFilter = new SslFilter(sslContext); + SslFilter sslFilter = new AcceptorSslFilter(sslContext); sslFilter.setNeedClientAuth(sslConfig.isNeedClientAuth()); sslFilter.setEnabledCipherSuites(sslConfig.getEnabledCipherSuites() != null ? sslConfig.getEnabledCipherSuites() : SSLSupport.getDefaultCipherSuites(sslContext)); diff --git a/quickfixj-core/src/main/java/quickfix/mina/ssl/AcceptorSslFilter.java b/quickfixj-core/src/main/java/quickfix/mina/ssl/AcceptorSslFilter.java new file mode 100644 index 0000000000..a1e4268e96 --- /dev/null +++ b/quickfixj-core/src/main/java/quickfix/mina/ssl/AcceptorSslFilter.java @@ -0,0 +1,23 @@ +package quickfix.mina.ssl; + +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.ssl.SslFilter; + +import javax.net.ssl.SSLContext; + +public final class AcceptorSslFilter extends SslFilter { + + public AcceptorSslFilter(SSLContext sslContext) { + super(sslContext); + } + + @Override + public void sessionClosed(NextFilter next, IoSession session) throws Exception { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("SERVER: Session {} closed", session); + } + + onClose(next, session, true); + next.sessionClosed(session); + } +} diff --git a/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java b/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java index 7c4e5b438d..82020b9c00 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java +++ b/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java @@ -61,4 +61,14 @@ protected SSLEngine createEngine(IoSession session, InetSocketAddress addr) { return sslEngine; } + + @Override + public void sessionClosed(NextFilter next, IoSession session) throws Exception { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("CLIENT: Session {} closed", session); + } + + onClose(next, session, true); + next.sessionClosed(session); + } } diff --git a/quickfixj-core/src/test/java/quickfix/mina/HttpProxyTest.java b/quickfixj-core/src/test/java/quickfix/mina/HttpProxyTest.java index 96884f92a7..2745908acd 100644 --- a/quickfixj-core/src/test/java/quickfix/mina/HttpProxyTest.java +++ b/quickfixj-core/src/test/java/quickfix/mina/HttpProxyTest.java @@ -103,6 +103,33 @@ public void shouldLoginBasicAuthWithSsl() throws ConfigError { } } + @Test + public void shouldLoginBasicAuthWithSslAndReconnect() throws ConfigError { + int port = proxyServer.getDestination().getPort(); + SessionConnector acceptor = createAcceptor(port, true, "single-session/server.keystore"); + + try { + acceptor.start(); + + SessionConnector initiator = createInitiator(proxyServer.getPort(), port, PROXY_USERNAME, PROXY_PASSWORD, true, "single-session/client.truststore"); + + for (int i = 0; i < 2; i++) { + try { + initiator.start(); + SessionUtil.assertLoggedOn(acceptor, new SessionID(FixVersions.BEGINSTRING_FIX44, "ALICE", "BOB")); + SessionUtil.assertLoggedOn(initiator, new SessionID(FixVersions.BEGINSTRING_FIX44, "BOB", "ALICE")); + SSLUtil.assertNotAuthenticated(acceptor, new SessionID(FixVersions.BEGINSTRING_FIX44, "ALICE", "BOB"), false); + SSLUtil.assertAuthenticated(initiator, new SessionID(FixVersions.BEGINSTRING_FIX44, "BOB", "ALICE"), new BigInteger("1448538842")); + assertTrue(proxyServer.getRecordedExceptions().isEmpty()); + } finally { + initiator.stop(); + } + } + } finally { + acceptor.stop(); + } + } + @Test public void shouldFailLoginBasicAuthWhenServerIsUntrusted() throws ConfigError { int port = proxyServer.getDestination().getPort();