From 2d492e2bf0f0a7102437e178f567b58653276f3f Mon Sep 17 00:00:00 2001 From: tfitchie Date: Wed, 1 Jul 2026 08:28:55 +0100 Subject: [PATCH 1/5] Add reverse DNS lookup bypass --- .../src/main/java/quickfix/Initiator.java | 6 ++ .../quickfix/mina/HostResolutionStrategy.java | 12 +++ .../initiator/AbstractSocketInitiator.java | 7 +- .../mina/initiator/IoSessionInitiator.java | 18 ++-- .../quickfix/mina/ssl/InitiatorSslFilter.java | 7 +- .../mina/ssl/InitiatorSslFilterTest.java | 92 +++++++++++++++++++ 6 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 quickfixj-core/src/main/java/quickfix/mina/HostResolutionStrategy.java create mode 100644 quickfixj-core/src/test/java/quickfix/mina/ssl/InitiatorSslFilterTest.java diff --git a/quickfixj-core/src/main/java/quickfix/Initiator.java b/quickfixj-core/src/main/java/quickfix/Initiator.java index 8eabeee725..e2034d45a5 100644 --- a/quickfixj-core/src/main/java/quickfix/Initiator.java +++ b/quickfixj-core/src/main/java/quickfix/Initiator.java @@ -131,4 +131,10 @@ public interface Initiator extends Connector { */ String SETTING_DYNAMIC_SESSION = "DynamicSession"; + /** + * Whether the initiator should use reverse DNS to resolve + * the host when connecting directly to an IP address. + */ + String SETTING_REVERSE_DNS_ENABLED = "ReverseDNSEnabled"; + } diff --git a/quickfixj-core/src/main/java/quickfix/mina/HostResolutionStrategy.java b/quickfixj-core/src/main/java/quickfix/mina/HostResolutionStrategy.java new file mode 100644 index 0000000000..e4dd342cac --- /dev/null +++ b/quickfixj-core/src/main/java/quickfix/mina/HostResolutionStrategy.java @@ -0,0 +1,12 @@ +package quickfix.mina; + +import java.net.InetSocketAddress; + +@FunctionalInterface +public interface HostResolutionStrategy { + String getHost(InetSocketAddress address); + + HostResolutionStrategy WITH_REVERSE_DNS = InetSocketAddress::getHostName; + + HostResolutionStrategy WITHOUT_REVERSE_DNS = InetSocketAddress::getHostString; +} diff --git a/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java b/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java index 96c7975c7e..e53a745379 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java +++ b/quickfixj-core/src/main/java/quickfix/mina/initiator/AbstractSocketInitiator.java @@ -38,6 +38,7 @@ import quickfix.SessionSettings; import quickfix.field.converter.BooleanConverter; import quickfix.mina.EventHandlingStrategy; +import quickfix.mina.HostResolutionStrategy; import quickfix.mina.NetworkingOptions; import quickfix.mina.ProtocolFactory; import quickfix.mina.SessionConnector; @@ -139,6 +140,10 @@ private void createInitiator(final Session session, final boolean continueInitOn sslConfig = SSLSupport.getSslConfig(getSettings(), sessionID); } + // Defaults to true for backwards compatibility + HostResolutionStrategy hostResolutionStrategy = getSettings().getBoolOrDefault(sessionID, Initiator.SETTING_REVERSE_DNS_ENABLED, true) ? + HostResolutionStrategy.WITH_REVERSE_DNS : HostResolutionStrategy.WITHOUT_REVERSE_DNS; + String proxyUser = null; String proxyPassword = null; String proxyHost = null; @@ -177,7 +182,7 @@ && getSettings().isSetting(sessionID, Initiator.SETTING_PROXY_DOMAIN)) { ScheduledExecutorService scheduledExecutorService = (scheduledReconnectExecutor != null ? scheduledReconnectExecutor : getScheduledExecutorService()); try { final IoSessionInitiator ioSessionInitiator = new IoSessionInitiator(session, - socketAddresses, localAddress, connectTimeout, reconnectingIntervals, + socketAddresses, localAddress, hostResolutionStrategy, connectTimeout, reconnectingIntervals, scheduledExecutorService, settings, networkingOptions, getEventHandlingStrategy(), getIoFilterChainBuilder(), sslEnabled, sslConfig, proxyType, proxyVersion, proxyHost, proxyPort, proxyUser, proxyPassword, proxyDomain, proxyWorkstation); diff --git a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java index 9c782dc01b..79c632cc72 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java +++ b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java @@ -35,6 +35,7 @@ import quickfix.SystemTime; import quickfix.mina.CompositeIoFilterChainBuilder; import quickfix.mina.EventHandlingStrategy; +import quickfix.mina.HostResolutionStrategy; import quickfix.mina.NetworkingOptions; import quickfix.mina.ProtocolFactory; import quickfix.mina.SessionConnector; @@ -65,9 +66,9 @@ public class IoSessionInitiator { private Future reconnectFuture; public IoSessionInitiator(Session fixSession, SocketAddress[] socketAddresses, - SocketAddress localAddress, int connectTimeout, int[] reconnectIntervalInSeconds, - ScheduledExecutorService executor, SessionSettings sessionSettings, NetworkingOptions networkingOptions, - EventHandlingStrategy eventHandlingStrategy, + SocketAddress localAddress, HostResolutionStrategy hostResolutionStrategy, int connectTimeout, + int[] reconnectIntervalInSeconds, ScheduledExecutorService executor, SessionSettings sessionSettings, + NetworkingOptions networkingOptions, EventHandlingStrategy eventHandlingStrategy, IoFilterChainBuilder userIoFilterChainBuilder, boolean sslEnabled, SSLConfig sslConfig, String proxyType, String proxyVersion, String proxyHost, int proxyPort, String proxyUser, String proxyPassword, String proxyDomain, String proxyWorkstation) throws ConfigError { @@ -83,7 +84,8 @@ public IoSessionInitiator(Session fixSession, SocketAddress[] socketAddresses, reconnectTask = new ConnectTask(sslEnabled, socketAddresses, localAddress, userIoFilterChainBuilder, fixSession, connectTimeoutMillis, reconnectIntervalInMillis, sessionSettings, networkingOptions, eventHandlingStrategy, sslConfig, - proxyType, proxyVersion, proxyHost, proxyPort, proxyUser, proxyPassword, proxyDomain, proxyWorkstation, log); + proxyType, proxyVersion, proxyHost, proxyPort, proxyUser, proxyPassword, proxyDomain, + proxyWorkstation, log, hostResolutionStrategy); } catch (GeneralSecurityException e) { throw new ConfigError(e); } @@ -105,6 +107,7 @@ private static class ConnectTask implements Runnable { private final EventHandlingStrategy eventHandlingStrategy; private final SSLConfig sslConfig; private final Logger log; + private final HostResolutionStrategy hostResolutionStrategy; private IoSession ioSession; private long lastReconnectAttemptTime; @@ -128,7 +131,7 @@ public ConnectTask(boolean sslEnabled, SocketAddress[] socketAddresses, SessionSettings sessionSettings, NetworkingOptions networkingOptions, EventHandlingStrategy eventHandlingStrategy, SSLConfig sslConfig, String proxyType, String proxyVersion, String proxyHost, int proxyPort, String proxyUser, String proxyPassword, String proxyDomain, - String proxyWorkstation, Logger log) throws ConfigError, GeneralSecurityException { + String proxyWorkstation, Logger log, HostResolutionStrategy hostResolutionStrategy) throws ConfigError, GeneralSecurityException { this.sslEnabled = sslEnabled; this.socketAddresses = socketAddresses; this.localAddress = localAddress; @@ -141,6 +144,7 @@ public ConnectTask(boolean sslEnabled, SocketAddress[] socketAddresses, this.eventHandlingStrategy = eventHandlingStrategy; this.sslConfig = sslConfig; this.log = log; + this.hostResolutionStrategy = hostResolutionStrategy; this.proxyType = proxyType; this.proxyVersion = proxyVersion; @@ -194,7 +198,7 @@ private void setupIoConnector() throws ConfigError, GeneralSecurityException { private void installSslFilter(CompositeIoFilterChainBuilder ioFilterChainBuilder) throws GeneralSecurityException { final SSLContext sslContext = SSLContextFactory.getInstance(sslConfig); - final SslFilter sslFilter = new InitiatorSslFilter(sslContext, getSniHostName(sslConfig)); + final SslFilter sslFilter = new InitiatorSslFilter(sslContext, getSniHostName(sslConfig), hostResolutionStrategy); sslFilter.setEnabledCipherSuites(sslConfig.getEnabledCipherSuites() != null ? sslConfig.getEnabledCipherSuites() : SSLSupport.getDefaultCipherSuites(sslContext)); sslFilter.setEnabledProtocols(sslConfig.getEnabledProtocols() != null ? sslConfig.getEnabledProtocols() @@ -294,7 +298,7 @@ private SocketAddress getNextSocketAddress() { // Recreate socket address to avoid cached address resolution if (socketAddress instanceof InetSocketAddress) { InetSocketAddress inetAddr = (InetSocketAddress) socketAddress; - socketAddress = new InetSocketAddress(inetAddr.getHostName(), inetAddr.getPort()); + socketAddress = new InetSocketAddress(hostResolutionStrategy.getHost(inetAddr), inetAddr.getPort()); socketAddresses[nextSocketAddressIndex] = socketAddress; } nextSocketAddressIndex = (nextSocketAddressIndex + 1) % socketAddresses.length; 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 5faa65248c..0b55987d57 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java +++ b/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java @@ -2,6 +2,7 @@ import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.ssl.SslFilter; +import quickfix.mina.HostResolutionStrategy; import javax.net.ssl.SNIHostName; import javax.net.ssl.SSLContext; @@ -13,10 +14,12 @@ public final class InitiatorSslFilter extends SslFilter { private final String sniHostName; + private final HostResolutionStrategy hostResolutionStrategy; - public InitiatorSslFilter(SSLContext sslContext, String sniHostName) { + public InitiatorSslFilter(SSLContext sslContext, String sniHostName, HostResolutionStrategy hostResolutionStrategy) { super(sslContext, false); this.sniHostName = sniHostName; + this.hostResolutionStrategy = hostResolutionStrategy; } @Override @@ -24,7 +27,7 @@ protected SSLEngine createEngine(IoSession session, InetSocketAddress addr) { SSLEngine sslEngine; if (addr != null) { - sslEngine = sslContext.createSSLEngine(addr.getHostName(), addr.getPort()); + sslEngine = sslContext.createSSLEngine(hostResolutionStrategy.getHost(addr), addr.getPort()); } else { sslEngine = sslContext.createSSLEngine(); } diff --git a/quickfixj-core/src/test/java/quickfix/mina/ssl/InitiatorSslFilterTest.java b/quickfixj-core/src/test/java/quickfix/mina/ssl/InitiatorSslFilterTest.java new file mode 100644 index 0000000000..ebc6749b4e --- /dev/null +++ b/quickfixj-core/src/test/java/quickfix/mina/ssl/InitiatorSslFilterTest.java @@ -0,0 +1,92 @@ +package quickfix.mina.ssl; + +import org.apache.mina.core.session.IoSession; +import org.junit.Before; +import org.junit.Test; +import quickfix.mina.HostResolutionStrategy; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import java.net.InetAddress; +import java.net.InetSocketAddress; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Tests that {@link InitiatorSslFilter} resolves the SSL engine peer host + * according to the configured {@link HostResolutionStrategy}. + */ +public class InitiatorSslFilterTest { + + private static final String LITERAL_IP = "1.2.3.4"; + private static final byte[] IP_BYTES = {1, 2, 3, 4}; + private static final String HOST_NAME = "example.quickfixj.org"; + private static final int PORT = 5001; + + private SSLContext sslContext; + private IoSession session; + + @Before + public void setUp() throws Exception { + sslContext = buildSslContext(); + session = mock(IoSession.class); + when(session.isServer()).thenReturn(false); + } + + @Test + public void shouldUseHostStringWhenReverseDnsDisabled() throws Exception { + InitiatorSslFilter filter = new InitiatorSslFilter(sslContext, null, + HostResolutionStrategy.WITHOUT_REVERSE_DNS); + + // Address built from raw bytes has no stored host name, so getHostString() + // returns the literal IP without performing a reverse DNS lookup. + InetSocketAddress address = new InetSocketAddress(InetAddress.getByAddress(IP_BYTES), PORT); + + SSLEngine engine = filter.createEngine(session, address); + + assertEquals(LITERAL_IP, engine.getPeerHost()); + assertTrue(engine.getUseClientMode()); + } + + @Test + public void shouldUseHostNameWhenReverseDnsEnabled() throws Exception { + InitiatorSslFilter filter = new InitiatorSslFilter(sslContext, null, + HostResolutionStrategy.WITH_REVERSE_DNS); + + // Address built with an explicit host name resolves to that name via + // getHostName() without performing a DNS lookup. + InetSocketAddress address = new InetSocketAddress( + InetAddress.getByAddress(HOST_NAME, IP_BYTES), PORT); + + SSLEngine engine = filter.createEngine(session, address); + + assertEquals(HOST_NAME, engine.getPeerHost()); + assertTrue(engine.getUseClientMode()); + } + + @Test + public void shouldCreateClientEngineWhenAddressIsNull() { + InitiatorSslFilter filter = new InitiatorSslFilter(sslContext, null, + HostResolutionStrategy.WITHOUT_REVERSE_DNS); + + SSLEngine engine = filter.createEngine(session, null); + + assertNotNull(engine); + assertTrue(engine.getUseClientMode()); + } + + private static SSLContext buildSslContext() throws Exception { + SSLConfig sslConfig = new SSLConfig(); + sslConfig.setKeyStoreName(SSLSupport.QUICKFIXJ_KEY_STORE); + sslConfig.setKeyStorePassword(SSLSupport.QUICKFIXJ_KEY_STORE_PWD.toCharArray()); + sslConfig.setKeyStoreType("JKS"); + sslConfig.setKeyManagerFactoryAlgorithm("SunX509"); + sslConfig.setTrustStoreType("JKS"); + sslConfig.setTrustManagerFactoryAlgorithm("PKIX"); + return SSLContextFactory.getInstance(sslConfig); + } +} From b1c14fc85086125a2fdb6193a0ad24dc2cef52fb Mon Sep 17 00:00:00 2001 From: tfitchie Date: Wed, 1 Jul 2026 12:09:41 +0100 Subject: [PATCH 2/5] Update configuration --- .../src/main/doc/usermanual/usage/configuration.html | 7 +++++++ .../src/main/doc/usermanual/usage/configuration.md | 1 + 2 files changed, 8 insertions(+) diff --git a/quickfixj-core/src/main/doc/usermanual/usage/configuration.html b/quickfixj-core/src/main/doc/usermanual/usage/configuration.html index 6d9fcfe6c9..379be1077a 100644 --- a/quickfixj-core/src/main/doc/usermanual/usage/configuration.html +++ b/quickfixj-core/src/main/doc/usermanual/usage/configuration.html @@ -591,6 +591,13 @@

QuickFIX Settings

Y
N N + + ReverseDNSEnabled + + Whether the initiator performs a reverse DNS lookup to resolve the peer host name when connecting directly to an IP address. The resolved host is used as the SSL peer host (e.g. for hostname verification). When disabled, the literal IP address is used as-is and no reverse DNS lookup is performed. Only used with a SocketInitiator. + Y
N + Y + Acceptor diff --git a/quickfixj-core/src/main/doc/usermanual/usage/configuration.md b/quickfixj-core/src/main/doc/usermanual/usage/configuration.md index fbd3d65844..5ca5ebc736 100644 --- a/quickfixj-core/src/main/doc/usermanual/usage/configuration.md +++ b/quickfixj-core/src/main/doc/usermanual/usage/configuration.md @@ -126,6 +126,7 @@ with QuickFIX, followed by an example. | `SocketLocalPort` | Bind the local socket to this port. Only used with a `SocketInitiator`. | positive integer | If unset the socket will be bound to a free port from the ephemeral port range. | | `SocketLocalHost` | Bind the local socket to this host. Only used with a `SocketInitiator`. | valid IP address in the format of `x.x.x.x` or a domain name | If unset the socket will be bound to all local interfaces. | | `DynamicSession` | Leave the corresponding session disconnected until `AbstractSocketInitiator.createDynamicSession` is called. | `Y`
`N` | `N` | +| `ReverseDNSEnabled` | Whether the initiator performs a reverse DNS lookup to resolve the peer host name when connecting directly to an IP address. The resolved host is used as the SSL peer host (e.g. for hostname verification). When disabled, the literal IP address is used as-is and no reverse DNS lookup is performed. Only used with a `SocketInitiator`. | `Y`
`N` | `Y` | --- From e3f4826d572278c30cd90b13d79bc07ab044c00d Mon Sep 17 00:00:00 2001 From: tfitchie Date: Wed, 1 Jul 2026 12:19:47 +0100 Subject: [PATCH 3/5] document that initiatorSslFilter and ioSessionInitiator are internal classes --- .../main/java/quickfix/mina/initiator/IoSessionInitiator.java | 3 +++ .../src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java index 79c632cc72..2176db4dfd 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java +++ b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java @@ -57,6 +57,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * @internal This class is not part of the public API and may be removed or changed in future releases. + */ public class IoSessionInitiator { private final static long CONNECT_POLL_TIMEOUT = 2000L; private final ScheduledExecutorService executor; 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 0b55987d57..c365b82622 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java +++ b/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java @@ -11,6 +11,9 @@ import java.net.InetSocketAddress; import java.util.Collections; +/** + * @internal This class is not part of the public API and may be removed or changed in future releases. + */ public final class InitiatorSslFilter extends SslFilter { private final String sniHostName; From 70da966d2f3b9ec7b3c673085c096c4b6faf4fdd Mon Sep 17 00:00:00 2001 From: tfitchie Date: Wed, 1 Jul 2026 13:05:38 +0100 Subject: [PATCH 4/5] Tidy up comments, remove config html change --- .../src/main/doc/usermanual/usage/configuration.html | 7 ------- .../java/quickfix/mina/initiator/IoSessionInitiator.java | 2 +- .../main/java/quickfix/mina/ssl/InitiatorSslFilter.java | 2 +- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/quickfixj-core/src/main/doc/usermanual/usage/configuration.html b/quickfixj-core/src/main/doc/usermanual/usage/configuration.html index 379be1077a..6d9fcfe6c9 100644 --- a/quickfixj-core/src/main/doc/usermanual/usage/configuration.html +++ b/quickfixj-core/src/main/doc/usermanual/usage/configuration.html @@ -591,13 +591,6 @@

QuickFIX Settings

Y
N N - - ReverseDNSEnabled - - Whether the initiator performs a reverse DNS lookup to resolve the peer host name when connecting directly to an IP address. The resolved host is used as the SSL peer host (e.g. for hostname verification). When disabled, the literal IP address is used as-is and no reverse DNS lookup is performed. Only used with a SocketInitiator. - Y
N - Y - Acceptor diff --git a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java index 2176db4dfd..2747aab09b 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java +++ b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java @@ -58,7 +58,7 @@ import org.slf4j.LoggerFactory; /** - * @internal This class is not part of the public API and may be removed or changed in future releases. + * This class is not part of the public API and may be removed or changed in future releases. */ public class IoSessionInitiator { private final static long CONNECT_POLL_TIMEOUT = 2000L; 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 c365b82622..7428f3bf1b 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java +++ b/quickfixj-core/src/main/java/quickfix/mina/ssl/InitiatorSslFilter.java @@ -12,7 +12,7 @@ import java.util.Collections; /** - * @internal This class is not part of the public API and may be removed or changed in future releases. + * This class is not part of the public API and may be removed or changed in future releases. */ public final class InitiatorSslFilter extends SslFilter { From fa1d094394581f140571852c9db7cd726920aa85 Mon Sep 17 00:00:00 2001 From: Christoph John Date: Wed, 1 Jul 2026 17:04:08 +0200 Subject: [PATCH 5/5] Reduced visibility of IoSessionInitiator constructor Removed comment about public API status and adjusted constructor parameters. --- .../java/quickfix/mina/initiator/IoSessionInitiator.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java index 2747aab09b..84adf56e18 100644 --- a/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java +++ b/quickfixj-core/src/main/java/quickfix/mina/initiator/IoSessionInitiator.java @@ -57,9 +57,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * This class is not part of the public API and may be removed or changed in future releases. - */ public class IoSessionInitiator { private final static long CONNECT_POLL_TIMEOUT = 2000L; private final ScheduledExecutorService executor; @@ -68,7 +65,7 @@ public class IoSessionInitiator { private Future reconnectFuture; - public IoSessionInitiator(Session fixSession, SocketAddress[] socketAddresses, + IoSessionInitiator(Session fixSession, SocketAddress[] socketAddresses, SocketAddress localAddress, HostResolutionStrategy hostResolutionStrategy, int connectTimeout, int[] reconnectIntervalInSeconds, ScheduledExecutorService executor, SessionSettings sessionSettings, NetworkingOptions networkingOptions, EventHandlingStrategy eventHandlingStrategy, @@ -128,7 +125,7 @@ private static class ConnectTask implements Runnable { private final String proxyDomain; private final String proxyWorkstation; - public ConnectTask(boolean sslEnabled, SocketAddress[] socketAddresses, + ConnectTask(boolean sslEnabled, SocketAddress[] socketAddresses, SocketAddress localAddress, IoFilterChainBuilder userIoFilterChainBuilder, Session fixSession, long connectTimeoutMillis, long[] reconnectIntervalInMillis, SessionSettings sessionSettings, NetworkingOptions networkingOptions, EventHandlingStrategy eventHandlingStrategy, SSLConfig sslConfig,