in httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/AbstractHttp1StreamDuplexer.java [360:400]
public final void onOutput() throws IOException, HttpException {
ioSession.getLock().lock();
try {
if (outbuf.hasData()) {
final int bytesWritten = outbuf.flush(ioSession);
if (bytesWritten > 0) {
outTransportMetrics.incrementBytesTransferred(bytesWritten);
}
}
} finally {
ioSession.getLock().unlock();
}
if (connState.compareTo(ConnectionState.SHUTDOWN) < 0) {
final int pendingOutputRequests = outputRequests.get();
produceOutput();
final boolean outputPending = isOutputReady();
final boolean outputEnd;
ioSession.getLock().lock();
try {
if (!outputPending && !outbuf.hasData() && outputRequests.compareAndSet(pendingOutputRequests, 0)) {
ioSession.clearEvent(SelectionKey.OP_WRITE);
} else {
outputRequests.addAndGet(-pendingOutputRequests);
}
outputEnd = outgoingMessage == null && !outbuf.hasData() && !isRequestInitiated();
} finally {
ioSession.getLock().unlock();
}
if (outputEnd) {
outputEnd();
if (connState.compareTo(ConnectionState.ACTIVE) == 0) {
processCommands();
} else if (connState.compareTo(ConnectionState.GRACEFUL_SHUTDOWN) >= 0 && inputIdle() && outputIdle()) {
connState = ConnectionState.SHUTDOWN;
}
}
}
if (connState.compareTo(ConnectionState.SHUTDOWN) >= 0) {
ioSession.close();
}
}