From b7eaab4c5d1b2beed13389ed79a07161329ea686 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 12 Sep 2019 14:14:11 +0100 Subject: [PATCH] Handle very early completion notification On a Servlet container a completion notification may come at any time even in the UNSUBSCRIBED state, i.e. before the write Publisher has called onSubscribe. See: gh-23553 --- .../reactive/AbstractListenerWriteFlushProcessor.java | 11 +++++++++++ .../reactive/AbstractListenerWriteProcessor.java | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteFlushProcessor.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteFlushProcessor.java index 329cd3dbcac..81c8098d32a 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteFlushProcessor.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteFlushProcessor.java @@ -246,6 +246,17 @@ public abstract class AbstractListenerWriteFlushProcessor implements Processo super.onSubscribe(processor, subscription); } } + + @Override + public void onComplete(AbstractListenerWriteFlushProcessor processor) { + // This can happen on (very early) completion notification from container.. + if (processor.changeState(this, COMPLETED)) { + processor.resultPublisher.publishComplete(); + } + else { + processor.state.get().onComplete(processor); + } + } }, REQUESTED { diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteProcessor.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteProcessor.java index 509076d02b8..4f05d5e1e09 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteProcessor.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteProcessor.java @@ -322,6 +322,12 @@ public abstract class AbstractListenerWriteProcessor implements Processor void onComplete(AbstractListenerWriteProcessor processor) { + // This can happen on (very early) completion notification from container.. + processor.changeStateToComplete(this); + } }, REQUESTED {