From 78f65c4ca9a2e939f86f3c45c76a29a16fa593c4 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 4 Mar 2021 13:57:43 +0000 Subject: [PATCH] Consistent handling on Servlet non-blocking error callbacks See gh-26434 --- .../reactive/ServletServerHttpResponse.java | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java index 84dc43fff1..cc0e2536e7 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java @@ -65,7 +65,7 @@ class ServletServerHttpResponse extends AbstractListenerServerHttpResponse { private final ServletServerHttpRequest request; - private final AsyncListener asyncListener; + private final ResponseAsyncListener asyncListener; public ServletServerHttpResponse(HttpServletResponse response, AsyncContext asyncContext, @@ -243,33 +243,35 @@ class ServletServerHttpResponse extends AbstractListenerServerHttpResponse { handleError(event.getThrowable()); } - void handleError(Throwable ex) { - ResponseBodyFlushProcessor flushProcessor = bodyFlushProcessor; - if (flushProcessor != null) { - flushProcessor.cancel(); - flushProcessor.onError(ex); - } - + public void handleError(Throwable ex) { ResponseBodyProcessor processor = bodyProcessor; if (processor != null) { processor.cancel(); processor.onError(ex); } + else { + ResponseBodyFlushProcessor flushProcessor = bodyFlushProcessor; + if (flushProcessor != null) { + flushProcessor.cancel(); + flushProcessor.onError(ex); + } + } } @Override public void onComplete(AsyncEvent event) { - ResponseBodyFlushProcessor flushProcessor = bodyFlushProcessor; - if (flushProcessor != null) { - flushProcessor.cancel(); - flushProcessor.onComplete(); - } - ResponseBodyProcessor processor = bodyProcessor; if (processor != null) { processor.cancel(); processor.onComplete(); } + else { + ResponseBodyFlushProcessor flushProcessor = bodyFlushProcessor; + if (flushProcessor != null) { + flushProcessor.cancel(); + flushProcessor.onComplete(); + } + } } } @@ -277,7 +279,7 @@ class ServletServerHttpResponse extends AbstractListenerServerHttpResponse { private class ResponseBodyWriteListener implements WriteListener { @Override - public void onWritePossible() throws IOException { + public void onWritePossible() { ResponseBodyProcessor processor = bodyProcessor; if (processor != null) { processor.onWritePossible(); @@ -292,18 +294,7 @@ class ServletServerHttpResponse extends AbstractListenerServerHttpResponse { @Override public void onError(Throwable ex) { - ResponseBodyProcessor processor = bodyProcessor; - if (processor != null) { - processor.cancel(); - processor.onError(ex); - } - else { - ResponseBodyFlushProcessor flushProcessor = bodyFlushProcessor; - if (flushProcessor != null) { - flushProcessor.cancel(); - flushProcessor.onError(ex); - } - } + ServletServerHttpResponse.this.asyncListener.handleError(ex); } }