in sshd-core/src/main/java/org/apache/sshd/common/session/helpers/SessionHelper.java [236:309]
protected TimeoutIndicator checkForTimeouts() throws IOException {
boolean debugEnabled = log.isDebugEnabled();
if ((!isOpen()) || isClosing() || isClosed()) {
if (debugEnabled) {
log.debug("checkForTimeouts({}) session closing", this);
}
return TimeoutIndicator.NONE;
}
// If already detected a timeout don't check again
TimeoutIndicator result = timeoutStatus.get();
TimeoutStatus status = (result == null) ? TimeoutStatus.NoTimeout : result.getStatus();
if ((status != null) && (status != TimeoutStatus.NoTimeout)) {
if (debugEnabled) {
log.debug("checkForTimeouts({}) already detected {}", this, result);
}
return result;
}
Instant now = Instant.now();
result = checkAuthenticationTimeout(now, getAuthTimeout());
if (result == null) {
result = checkIdleTimeout(now, getIdleTimeout());
}
status = (result == null) ? TimeoutStatus.NoTimeout : result.getStatus();
if ((status == null) || TimeoutStatus.NoTimeout.equals(status)) {
return TimeoutIndicator.NONE;
}
boolean resetTimeout = false;
try {
SessionDisconnectHandler handler = getSessionDisconnectHandler();
resetTimeout = (handler != null) && handler.handleTimeoutDisconnectReason(this, result);
} catch (RuntimeException | IOException e) {
// If disconnect handler throws an exception continue with the disconnect
warn("checkForTimeouts({}) failed ({}) to invoke disconnect handler to handle {}: {}",
this, e.getClass().getSimpleName(), result, e.getMessage(), e);
}
if (resetTimeout) {
if (debugEnabled) {
log.debug("checkForTimeouts({}) cancel {} due to handler intervention", this, result);
}
switch (status) {
case AuthTimeout:
resetAuthTimeout();
break;
case IdleTimeout:
resetIdleTimeout();
break;
default: // ignored
}
return TimeoutIndicator.NONE;
}
if (debugEnabled) {
log.debug("checkForTimeouts({}) disconnect - reason={}", this, result);
}
timeoutStatus.set(result);
disconnect(SshConstants.SSH2_DISCONNECT_PROTOCOL_ERROR,
"Detected " + status + " after "
+ TimeoutIndicator
.toDisplayDurationValue(result.getExpiredValue())
+ "/" + TimeoutIndicator.toDisplayDurationValue(
result.getThresholdValue())
+ " ms.");
return result;
}