Skip to content

Commit 10d5de7

Browse files
committed
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
1 parent 8de5c05 commit 10d5de7

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

Diff for: spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java

+15
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.IOException;
2020
import java.net.URISyntaxException;
2121
import java.nio.ByteBuffer;
22+
import java.nio.charset.Charset;
2223
import javax.servlet.AsyncContext;
2324
import javax.servlet.ServletResponse;
2425
import javax.servlet.http.HttpServletRequest;
@@ -32,6 +33,7 @@
3233
import org.springframework.core.io.buffer.DataBuffer;
3334
import org.springframework.core.io.buffer.DataBufferFactory;
3435
import org.springframework.http.HttpHeaders;
36+
import org.springframework.http.MediaType;
3537

3638
/**
3739
* {@link ServletHttpHandlerAdapter} extension that uses Jetty APIs for writing
@@ -94,6 +96,19 @@ private static HttpHeaders createHeaders(HttpServletResponse response) {
9496

9597
@Override
9698
protected void applyHeaders() {
99+
MediaType contentType = getHeaders().getContentType();
100+
HttpServletResponse response = getNativeResponse();
101+
if (response.getContentType() == null && contentType != null) {
102+
response.setContentType(contentType.toString());
103+
}
104+
Charset charset = (contentType != null ? contentType.getCharset() : null);
105+
if (response.getCharacterEncoding() == null && charset != null) {
106+
response.setCharacterEncoding(charset.name());
107+
}
108+
long contentLength = getHeaders().getContentLength();
109+
if (contentLength != -1) {
110+
response.setContentLengthLong(contentLength);
111+
}
97112
}
98113

99114
@Override

Diff for: spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java

+15
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.lang.reflect.Field;
2121
import java.net.URISyntaxException;
2222
import java.nio.ByteBuffer;
23+
import java.nio.charset.Charset;
2324
import javax.servlet.AsyncContext;
2425
import javax.servlet.ServletRequest;
2526
import javax.servlet.ServletResponse;
@@ -37,6 +38,7 @@
3738
import org.springframework.core.io.buffer.DataBufferFactory;
3839
import org.springframework.core.io.buffer.DataBufferUtils;
3940
import org.springframework.http.HttpHeaders;
41+
import org.springframework.http.MediaType;
4042
import org.springframework.util.Assert;
4143
import org.springframework.util.ReflectionUtils;
4244

@@ -159,6 +161,19 @@ private static HttpHeaders createTomcatHttpHeaders(HttpServletResponse response)
159161

160162
@Override
161163
protected void applyHeaders() {
164+
HttpServletResponse response = getNativeResponse();
165+
MediaType contentType = getHeaders().getContentType();
166+
if (response.getContentType() == null && contentType != null) {
167+
response.setContentType(contentType.toString());
168+
}
169+
Charset charset = (contentType != null ? contentType.getCharset() : null);
170+
if (response.getCharacterEncoding() == null && charset != null) {
171+
response.setCharacterEncoding(charset.name());
172+
}
173+
long contentLength = getHeaders().getContentLength();
174+
if (contentLength != -1) {
175+
response.setContentLengthLong(contentLength);
176+
}
162177
}
163178

164179
@Override

0 commit comments

Comments
 (0)