Polish
This commit is contained in:
@@ -748,6 +748,7 @@ project("spring-web") {
|
||||
optional("io.reactivex:rxjava:${rxjavaVersion}")
|
||||
optional "io.reactivex.rxjava2:rxjava:${rxjava2Version}"
|
||||
optional("io.reactivex:rxjava-reactive-streams:${rxjavaAdapterVersion}")
|
||||
optional("org.apache.tomcat:tomcat-catalina:${tomcatVersion}")
|
||||
optional("io.undertow:undertow-core:${undertowVersion}")
|
||||
optional("org.jboss.xnio:xnio-api:${xnioVersion}")
|
||||
optional("io.netty:netty-buffer:${nettyVersion}") // temporarily for JsonObjectDecoder
|
||||
@@ -779,7 +780,6 @@ project("spring-web") {
|
||||
optional("javax.xml.ws:jaxws-api:${jaxwsVersion}")
|
||||
optional("javax.mail:javax.mail-api:${javamailVersion}")
|
||||
optional("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}")
|
||||
optional("org.apache.tomcat:tomcat-catalina:${tomcatVersion}")
|
||||
testCompile(project(":spring-context-support")) // for JafMediaTypeFactory
|
||||
testCompile("io.projectreactor.addons:reactor-test")
|
||||
testCompile("org.apache.taglibs:taglibs-standard-jstlel:1.2.1") {
|
||||
|
||||
@@ -31,9 +31,8 @@ import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
|
||||
/**
|
||||
* Adapt {@link HttpHandler} to an {@link HttpServlet} using Servlet Async
|
||||
* support and Servlet 3.1 non-blocking I/O. Use Jetty API for writing with
|
||||
* ByteBuffer.
|
||||
* {@link ServletHttpHandlerAdapter} extension that uses Jetty APIs for writing
|
||||
* to the response with {@link ByteBuffer}.
|
||||
*
|
||||
* @author Violeta Georgieva
|
||||
* @since 5.0
|
||||
@@ -41,6 +40,7 @@ import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
@WebServlet(asyncSupported = true)
|
||||
public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
|
||||
|
||||
public JettyHttpHandlerAdapter(HttpHandler httpHandler) {
|
||||
super(httpHandler);
|
||||
}
|
||||
@@ -51,22 +51,23 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
|
||||
|
||||
@Override
|
||||
protected ServerHttpResponse createServletServerHttpResponse(
|
||||
HttpServletResponse response, AsyncContext asyncContext) throws IOException {
|
||||
return new JettyServerHttpResponse(
|
||||
response, asyncContext, getDataBufferFactory(), getBufferSize());
|
||||
protected ServerHttpResponse createResponse(HttpServletResponse response,
|
||||
AsyncContext context) throws IOException {
|
||||
|
||||
return new JettyServerHttpResponse(response, context, getDataBufferFactory(), getBufferSize());
|
||||
}
|
||||
|
||||
|
||||
private static final class JettyServerHttpResponse extends ServletServerHttpResponse {
|
||||
|
||||
public JettyServerHttpResponse(HttpServletResponse response, AsyncContext asyncContext,
|
||||
DataBufferFactory bufferFactory, int bufferSize) throws IOException {
|
||||
super(response, asyncContext, bufferFactory, bufferSize);
|
||||
public JettyServerHttpResponse(HttpServletResponse response, AsyncContext context,
|
||||
DataBufferFactory factory, int bufferSize) throws IOException {
|
||||
|
||||
super(response, context, factory, bufferSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int writeDataBuffer(DataBuffer dataBuffer) throws IOException {
|
||||
protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
|
||||
ServletOutputStream outputStream = getServletResponse().getOutputStream();
|
||||
ByteBuffer input = dataBuffer.asByteBuffer();
|
||||
int len = input.remaining();
|
||||
|
||||
@@ -98,26 +98,23 @@ public class ServletHttpHandlerAdapter extends HttpHandlerAdapterSupport impleme
|
||||
// Start async before Read/WriteListener registration
|
||||
AsyncContext asyncContext = request.startAsync();
|
||||
|
||||
ServerHttpRequest httpRequest = createServletServerHttpRequest(
|
||||
((HttpServletRequest) request), asyncContext);
|
||||
|
||||
ServerHttpResponse httpResponse = createServletServerHttpResponse(
|
||||
((HttpServletResponse) response), asyncContext);
|
||||
ServerHttpRequest httpRequest = createRequest(((HttpServletRequest) request), asyncContext);
|
||||
ServerHttpResponse httpResponse = createResponse(((HttpServletResponse) response), asyncContext);
|
||||
|
||||
HandlerResultSubscriber subscriber = new HandlerResultSubscriber(asyncContext);
|
||||
getHttpHandler().handle(httpRequest, httpResponse).subscribe(subscriber);
|
||||
}
|
||||
|
||||
protected ServerHttpRequest createServletServerHttpRequest(HttpServletRequest request,
|
||||
AsyncContext asyncContext) throws IOException {
|
||||
return new ServletServerHttpRequest(
|
||||
request, asyncContext, getDataBufferFactory(), getBufferSize());
|
||||
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context)
|
||||
throws IOException {
|
||||
|
||||
return new ServletServerHttpRequest(request, context, getDataBufferFactory(), getBufferSize());
|
||||
}
|
||||
|
||||
protected ServerHttpResponse createServletServerHttpResponse(HttpServletResponse response,
|
||||
AsyncContext asyncContext) throws IOException {
|
||||
return new ServletServerHttpResponse(
|
||||
response, asyncContext, getDataBufferFactory(), getBufferSize());
|
||||
protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncContext context)
|
||||
throws IOException {
|
||||
|
||||
return new ServletServerHttpResponse(response, context, getDataBufferFactory(), getBufferSize());
|
||||
}
|
||||
|
||||
// Other Servlet methods...
|
||||
|
||||
@@ -54,6 +54,9 @@ import org.springframework.util.StringUtils;
|
||||
*/
|
||||
public class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
|
||||
protected final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
|
||||
private final HttpServletRequest request;
|
||||
|
||||
private final RequestBodyPublisher bodyPublisher;
|
||||
@@ -64,8 +67,6 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
|
||||
private final byte[] buffer;
|
||||
|
||||
protected final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
|
||||
public ServletServerHttpRequest(HttpServletRequest request, AsyncContext asyncContext,
|
||||
DataBufferFactory bufferFactory, int bufferSize) throws IOException {
|
||||
@@ -179,7 +180,7 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return Flux.from(this.bodyPublisher);
|
||||
}
|
||||
|
||||
protected DataBuffer readDataBuffer() throws IOException {
|
||||
protected DataBuffer readFromInputStream() throws IOException {
|
||||
int read = this.request.getInputStream().read(this.buffer);
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("read:" + read);
|
||||
@@ -242,7 +243,7 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
@Override
|
||||
protected DataBuffer read() throws IOException {
|
||||
if (this.inputStream.isReady()) {
|
||||
return readDataBuffer();
|
||||
return readFromInputStream();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -132,12 +132,12 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
|
||||
return processor;
|
||||
}
|
||||
|
||||
protected int writeDataBuffer(DataBuffer dataBuffer) throws IOException {
|
||||
protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
|
||||
ServletOutputStream outputStream = response.getOutputStream();
|
||||
InputStream input = dataBuffer.asInputStream();
|
||||
int bytesWritten = 0;
|
||||
byte[] buffer = new byte[this.bufferSize];
|
||||
int bytesRead = -1;
|
||||
int bytesRead;
|
||||
while (outputStream.isReady() && (bytesRead = input.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, bytesRead);
|
||||
bytesWritten += bytesRead;
|
||||
@@ -287,7 +287,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
|
||||
}
|
||||
if (ready) {
|
||||
int total = dataBuffer.readableByteCount();
|
||||
int written = writeDataBuffer(dataBuffer);
|
||||
int written = writeToOutputStream(dataBuffer);
|
||||
|
||||
if (this.logger.isTraceEnabled()) {
|
||||
this.logger.trace("written: " + written + " total: " + total);
|
||||
|
||||
@@ -19,30 +19,29 @@ 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.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.catalina.connector.CoyoteInputStream;
|
||||
import org.apache.catalina.connector.CoyoteOutputStream;
|
||||
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
|
||||
/**
|
||||
* Adapt {@link HttpHandler} to an {@link HttpServlet} using Servlet Async
|
||||
* support and Servlet 3.1 non-blocking I/O. Use Tomcat API for
|
||||
* reading/writing with ByteBuffer.
|
||||
*
|
||||
* {@link ServletHttpHandlerAdapter} extension that uses Jetty APIs for reading
|
||||
* from the request and writing to the response with {@link ByteBuffer}.
|
||||
*
|
||||
* @author Violeta Georgieva
|
||||
* @since 5.0
|
||||
*/
|
||||
@WebServlet(asyncSupported = true)
|
||||
public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
|
||||
|
||||
public TomcatHttpHandlerAdapter(HttpHandler httpHandler) {
|
||||
super(httpHandler);
|
||||
}
|
||||
@@ -53,35 +52,31 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
|
||||
|
||||
@Override
|
||||
protected ServerHttpRequest createServletServerHttpRequest(
|
||||
HttpServletRequest request, AsyncContext asyncContext) throws IOException {
|
||||
return new TomcatServerHttpRequest(
|
||||
request, asyncContext, getDataBufferFactory(), getBufferSize());
|
||||
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext cxt) throws IOException {
|
||||
return new TomcatServerHttpRequest(request, cxt, getDataBufferFactory(), getBufferSize());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ServerHttpResponse createServletServerHttpResponse(
|
||||
HttpServletResponse response, AsyncContext asyncContext) throws IOException {
|
||||
return new TomcatServerHttpResponse(
|
||||
response, asyncContext, getDataBufferFactory(), getBufferSize());
|
||||
protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncContext cxt) throws IOException {
|
||||
return new TomcatServerHttpResponse(response, cxt, getDataBufferFactory(), getBufferSize());
|
||||
}
|
||||
|
||||
|
||||
private final class TomcatServerHttpRequest extends ServletServerHttpRequest {
|
||||
|
||||
public TomcatServerHttpRequest(HttpServletRequest request, AsyncContext asyncContext,
|
||||
DataBufferFactory bufferFactory, int bufferSize) throws IOException {
|
||||
super(request, asyncContext, bufferFactory, bufferSize);
|
||||
public TomcatServerHttpRequest(HttpServletRequest request, AsyncContext context,
|
||||
DataBufferFactory factory, int bufferSize) throws IOException {
|
||||
|
||||
super(request, context, factory, bufferSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DataBuffer readDataBuffer() throws IOException {
|
||||
protected DataBuffer readFromInputStream() throws IOException {
|
||||
DataBuffer buffer = getDataBufferFactory().allocateBuffer(getBufferSize());
|
||||
ByteBuffer byteBuffer = buffer.asByteBuffer();
|
||||
byteBuffer.limit(byteBuffer.capacity());
|
||||
|
||||
int read = ((CoyoteInputStream) getServletRequest().getInputStream()).read(
|
||||
byteBuffer);
|
||||
int read = ((CoyoteInputStream) getServletRequest().getInputStream()).read(byteBuffer);
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("read:" + read);
|
||||
}
|
||||
@@ -97,13 +92,14 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
|
||||
private static final class TomcatServerHttpResponse extends ServletServerHttpResponse {
|
||||
|
||||
public TomcatServerHttpResponse(HttpServletResponse response, AsyncContext asyncContext,
|
||||
DataBufferFactory bufferFactory, int bufferSize) throws IOException {
|
||||
super(response, asyncContext, bufferFactory, bufferSize);
|
||||
public TomcatServerHttpResponse(HttpServletResponse response, AsyncContext context,
|
||||
DataBufferFactory factory, int bufferSize) throws IOException {
|
||||
|
||||
super(response, context, factory, bufferSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int writeDataBuffer(DataBuffer dataBuffer) throws IOException {
|
||||
protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
|
||||
ServletOutputStream outputStream = getServletResponse().getOutputStream();
|
||||
ByteBuffer input = dataBuffer.asByteBuffer();
|
||||
int len = input.remaining();
|
||||
|
||||
Reference in New Issue
Block a user