From 0006ecb8b08283e55d655566cd1785b7b7074274 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sun, 29 Mar 2026 11:59:06 +0200 Subject: [PATCH 1/5] unnecessary catch and rethrow removed --- .../src/main/java/quickfix/mina/AbstractIoHandler.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/quickfixj-core/src/main/java/quickfix/mina/AbstractIoHandler.java b/quickfixj-core/src/main/java/quickfix/mina/AbstractIoHandler.java index a8c892dbe..ad4b3dae3 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); } From 4ec8ba55b56cdf7359bbad3b6ed92f9a992b93d9 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sun, 29 Mar 2026 11:59:32 +0200 Subject: [PATCH 2/5] fixed unused import --- .../org/quickfixj/jmx/mbean/connector/SocketAcceptorAdmin.java | 1 - 1 file changed, 1 deletion(-) 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 77268bac4..99ced0846 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; From 42a2717516ac86d40120fe39fa077b2148351fea Mon Sep 17 00:00:00 2001 From: Marcin Date: Sun, 29 Mar 2026 11:59:50 +0200 Subject: [PATCH 3/5] custom ssl filter with linger flag enabled --- .../mina/acceptor/AbstractSocketAcceptor.java | 3 ++- .../quickfix/mina/ssl/AcceptorSslFilter.java | 23 +++++++++++++++++++ .../quickfix/mina/ssl/InitiatorSslFilter.java | 10 ++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 quickfixj-core/src/main/java/quickfix/mina/ssl/AcceptorSslFilter.java 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 f9f418b5d..4d6e24a60 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 000000000..a1e4268e9 --- /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 7c4e5b438..82020b9c0 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); + } } From 21755da208abc95df27a086f2821ddaf4f375675 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sun, 29 Mar 2026 12:08:48 +0200 Subject: [PATCH 4/5] custom ssl filter with linger flag enabled --- .../java/quickfix/mina/acceptor/AbstractSocketAcceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4d6e24a60..3af627646 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java +++ b/quickfixj-core/src/main/java/quickfix/mina/acceptor/AbstractSocketAcceptor.java @@ -135,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 AcceptorSslFilter(sslContext); + SslFilter sslFilter = new AcceptorSslFilter(sslContext); sslFilter.setNeedClientAuth(sslConfig.isNeedClientAuth()); sslFilter.setEnabledCipherSuites(sslConfig.getEnabledCipherSuites() != null ? sslConfig.getEnabledCipherSuites() : SSLSupport.getDefaultCipherSuites(sslContext)); From d727ce09add078b3b9bf0886e69eabdac7e182d4 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sun, 29 Mar 2026 13:53:30 +0200 Subject: [PATCH 5/5] initiator reconnect test --- .../java/quickfix/mina/HttpProxyTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/quickfixj-core/src/test/java/quickfix/mina/HttpProxyTest.java b/quickfixj-core/src/test/java/quickfix/mina/HttpProxyTest.java index 96884f92a..2745908ac 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();