Handle special headers in Tomcat and Jetty
This commit adds special processing of some HTTP response headers in Jetty and Tomcat; they both consider some headers like "Content-Length" as specific and require explicit calls on the `HttpServletResponse` itself on top of setting the HTTP response header. Issue: SPR-17250
This commit is contained in:
parent
8de5c05af0
commit
10d5de7d63
|
|
@ -19,6 +19,7 @@ package org.springframework.http.server.reactive;
|
|||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import javax.servlet.AsyncContext;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
|
@ -32,6 +33,7 @@ import org.eclipse.jetty.server.Response;
|
|||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
|
||||
/**
|
||||
* {@link ServletHttpHandlerAdapter} extension that uses Jetty APIs for writing
|
||||
|
|
@ -94,6 +96,19 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
|||
|
||||
@Override
|
||||
protected void applyHeaders() {
|
||||
MediaType contentType = getHeaders().getContentType();
|
||||
HttpServletResponse response = getNativeResponse();
|
||||
if (response.getContentType() == null && contentType != null) {
|
||||
response.setContentType(contentType.toString());
|
||||
}
|
||||
Charset charset = (contentType != null ? contentType.getCharset() : null);
|
||||
if (response.getCharacterEncoding() == null && charset != null) {
|
||||
response.setCharacterEncoding(charset.name());
|
||||
}
|
||||
long contentLength = getHeaders().getContentLength();
|
||||
if (contentLength != -1) {
|
||||
response.setContentLengthLong(contentLength);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import java.io.IOException;
|
|||
import java.lang.reflect.Field;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import javax.servlet.AsyncContext;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
|
|
@ -37,6 +38,7 @@ import org.springframework.core.io.buffer.DataBuffer;
|
|||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
|
|
@ -159,6 +161,19 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
|||
|
||||
@Override
|
||||
protected void applyHeaders() {
|
||||
HttpServletResponse response = getNativeResponse();
|
||||
MediaType contentType = getHeaders().getContentType();
|
||||
if (response.getContentType() == null && contentType != null) {
|
||||
response.setContentType(contentType.toString());
|
||||
}
|
||||
Charset charset = (contentType != null ? contentType.getCharset() : null);
|
||||
if (response.getCharacterEncoding() == null && charset != null) {
|
||||
response.setCharacterEncoding(charset.name());
|
||||
}
|
||||
long contentLength = getHeaders().getContentLength();
|
||||
if (contentLength != -1) {
|
||||
response.setContentLengthLong(contentLength);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Reference in New Issue