提交 4aac7c2e 编写于 作者: R Rossen Stoyanchev

Minor refactoring in Tomcat/Jetty adapters

上级 a2aaa055
...@@ -19,14 +19,12 @@ package org.springframework.http.server.reactive; ...@@ -19,14 +19,12 @@ package org.springframework.http.server.reactive;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Map; import java.util.Map;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.HttpOutput; import org.eclipse.jetty.server.HttpOutput;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferFactory;
...@@ -68,12 +66,9 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { ...@@ -68,12 +66,9 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
@Override @Override
protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
ServletOutputStream outputStream = getServletResponse().getOutputStream();
ByteBuffer input = dataBuffer.asByteBuffer(); ByteBuffer input = dataBuffer.asByteBuffer();
int len = input.remaining(); int len = input.remaining();
if (outputStream.isReady() && len > 0) { ((HttpOutput) getServletResponse().getOutputStream()).write(input);
((HttpOutput) outputStream).write(input);
}
return len; return len;
} }
} }
......
...@@ -180,6 +180,10 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest { ...@@ -180,6 +180,10 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest {
return Flux.from(this.bodyPublisher); 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 { protected DataBuffer readFromInputStream() throws IOException {
int read = this.request.getInputStream().read(this.buffer); int read = this.request.getInputStream().read(this.buffer);
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
......
...@@ -132,6 +132,12 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons ...@@ -132,6 +132,12 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
return processor; 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 { protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
ServletOutputStream outputStream = response.getOutputStream(); ServletOutputStream outputStream = response.getOutputStream();
InputStream input = dataBuffer.asInputStream(); InputStream input = dataBuffer.asInputStream();
...@@ -285,14 +291,13 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons ...@@ -285,14 +291,13 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
if (this.logger.isTraceEnabled()) { if (this.logger.isTraceEnabled()) {
this.logger.trace("write: " + dataBuffer + " ready: " + ready); this.logger.trace("write: " + dataBuffer + " ready: " + ready);
} }
if (ready) { int remaining = dataBuffer.readableByteCount();
int total = dataBuffer.readableByteCount(); if (ready && remaining > 0) {
int written = writeToOutputStream(dataBuffer); int written = writeToOutputStream(dataBuffer);
if (this.logger.isTraceEnabled()) { 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 { else {
return false; return false;
......
...@@ -20,7 +20,6 @@ import java.io.IOException; ...@@ -20,7 +20,6 @@ import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Map; import java.util.Map;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
...@@ -100,12 +99,9 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter { ...@@ -100,12 +99,9 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
@Override @Override
protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
ServletOutputStream outputStream = getServletResponse().getOutputStream();
ByteBuffer input = dataBuffer.asByteBuffer(); ByteBuffer input = dataBuffer.asByteBuffer();
int len = input.remaining(); int len = input.remaining();
if (outputStream.isReady() && len > 0) { ((CoyoteOutputStream) getServletResponse().getOutputStream()).write(input);
((CoyoteOutputStream) outputStream).write(input);
}
return len; return len;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册