diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java index 6ae1c0a5b67..6167c22511a 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java @@ -19,14 +19,12 @@ package org.springframework.http.server.reactive; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Map; - import javax.servlet.AsyncContext; -import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.HttpOutput; + import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; @@ -68,12 +66,9 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { @Override protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { - ServletOutputStream outputStream = getServletResponse().getOutputStream(); ByteBuffer input = dataBuffer.asByteBuffer(); int len = input.remaining(); - if (outputStream.isReady() && len > 0) { - ((HttpOutput) outputStream).write(input); - } + ((HttpOutput) getServletResponse().getOutputStream()).write(input); return len; } } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java index 24b4e35b95a..d0bc01743b0 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java @@ -180,6 +180,10 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest { return Flux.from(this.bodyPublisher); } + /** + * Read from the request body InputStream and return a DataBuffer. + * Invoked only when {@link ServletInputStream#isReady()} returns "true". + */ protected DataBuffer readFromInputStream() throws IOException { int read = this.request.getInputStream().read(this.buffer); if (logger.isTraceEnabled()) { 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 77838314933..c07c3840faf 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 @@ -132,6 +132,12 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons return processor; } + /** + * Write the DataBuffer to the response body OutputStream. + * Invoked only when {@link ServletOutputStream#isReady()} returns "true" + * and the readable bytes in the DataBuffer is greater than 0. + * @return the number of bytes written + */ protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { ServletOutputStream outputStream = response.getOutputStream(); InputStream input = dataBuffer.asInputStream(); @@ -285,14 +291,13 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons if (this.logger.isTraceEnabled()) { this.logger.trace("write: " + dataBuffer + " ready: " + ready); } - if (ready) { - int total = dataBuffer.readableByteCount(); + int remaining = dataBuffer.readableByteCount(); + if (ready && remaining > 0) { int written = writeToOutputStream(dataBuffer); - if (this.logger.isTraceEnabled()) { - this.logger.trace("written: " + written + " total: " + total); + this.logger.trace("written: " + written + " total: " + remaining); } - return written == total; + return written == remaining; } else { return false; diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java index e3b3a32180b..1b2586a8730 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.Map; import javax.servlet.AsyncContext; -import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -100,12 +99,9 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter { @Override protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { - ServletOutputStream outputStream = getServletResponse().getOutputStream(); ByteBuffer input = dataBuffer.asByteBuffer(); int len = input.remaining(); - if (outputStream.isReady() && len > 0) { - ((CoyoteOutputStream) outputStream).write(input); - } + ((CoyoteOutputStream) getServletResponse().getOutputStream()).write(input); return len; } }