in sshd-mina/src/main/java/org/apache/sshd/mina/MinaConnector.java [149:222]
public IoConnectFuture connect(SocketAddress address, AttributeRepository context, SocketAddress localAddress) {
IoConnectFuture future = new DefaultIoConnectFuture(address, null) {
@Override
public void setSession(org.apache.sshd.common.io.IoSession session) {
if (context != null) {
session.setAttribute(AttributeRepository.class, context);
}
super.setSession(session);
}
};
IoConnector connector = getConnector();
AtomicReference<IoSession> createdSession = new AtomicReference<>();
ConnectFuture connectFuture = connector.connect(
address, localAddress,
(s, f) -> {
s.setAttribute(CONNECT_FUTURE_KEY, future);
if (f.isCanceled()) {
s.closeNow();
} else {
createdSession.set(s);
}
if (context != null) {
s.setAttribute(AttributeRepository.class, context);
}
});
future.addListener(f -> {
if (f.isCanceled()) {
connectFuture.cancel();
IoSession ioSession = connectFuture.getSession();
if (ioSession != null) {
ioSession.setAttribute(CONNECT_FUTURE_KEY, future);
ioSession.closeNow();
}
}
});
connectFuture.addListener((IoFutureListener<ConnectFuture>) cf -> {
Throwable t = cf.getException();
if (t != null) {
future.setException(t);
} else if (cf.isCanceled() || !isOpen()) {
IoSession ioSession = createdSession.getAndSet(null);
CancelFuture cancellation = future.cancel();
if (ioSession != null) {
ioSession.setAttribute(CONNECT_FUTURE_KEY, future);
ioSession.closeNow();
} else if (cancellation != null) {
cancellation.setCanceled();
}
} else {
IoSession ioSession = cf.getSession();
org.apache.sshd.common.io.IoSession sshSession = getSession(ioSession);
if (context != null) {
sshSession.setAttribute(AttributeRepository.class, context);
}
future.setSession(sshSession);
if (future.getSession() != sshSession) {
// Must have been canceled
try {
sshSession.close(true);
} finally {
CancelFuture cancellation = future.getCancellation();
if (cancellation != null) {
cancellation.setCanceled();
}
}
} else {
ioSession.removeAttribute(CONNECT_FUTURE_KEY);
}
}
});
return future;
}