From 04740b0e4afe7339815ef9cd8bdfa7ab21c39645 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 8 Jul 2021 16:39:26 +0200 Subject: [PATCH] Support request/response wrappers in JettyHttpHandlerAdapter This commit makes JettyServerHttpRequest aware of HttpServletRequestWrapper, and JettyServerHttpResponse aware of HttpServletResponseWrapper. Closes gh-27146 --- .../reactive/JettyHttpHandlerAdapter.java | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) 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 ddf9022da367..89a315068359 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 @@ -24,7 +24,9 @@ import javax.servlet.AsyncContext; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.server.HttpOutput; @@ -98,10 +100,28 @@ private static final class JettyServerHttpRequest extends ServletServerHttpReque super(createHeaders(request), request, asyncContext, servletPath, bufferFactory, bufferSize); } - private static MultiValueMap createHeaders(HttpServletRequest request) { - HttpFields fields = ((Request) request).getMetaData().getFields(); + private static MultiValueMap createHeaders(HttpServletRequest servletRequest) { + Request request = getRequest(servletRequest); + HttpFields fields = request.getMetaData().getFields(); return new JettyHeadersAdapter(fields); } + + private static Request getRequest(HttpServletRequest request) { + if (request instanceof Request) { + return (Request) request; + } + else if (request instanceof HttpServletRequestWrapper) { + HttpServletRequestWrapper wrapper = (HttpServletRequestWrapper) request; + HttpServletRequest wrappedRequest = (HttpServletRequest) wrapper.getRequest(); + return getRequest(wrappedRequest); + } + else { + throw new IllegalArgumentException("Cannot convert [" + request.getClass() + + "] to org.eclipse.jetty.server.Request"); + } + } + + } @@ -141,11 +161,27 @@ private static final class JettyServerHttpResponse extends BaseJettyServerHttpRe super(createHeaders(response), response, asyncContext, bufferFactory, bufferSize, request); } - private static HttpHeaders createHeaders(HttpServletResponse response) { - HttpFields fields = ((Response) response).getHttpFields(); + private static HttpHeaders createHeaders(HttpServletResponse servletResponse) { + Response response = getResponse(servletResponse); + HttpFields fields = response.getHttpFields(); return new HttpHeaders(new JettyHeadersAdapter(fields)); } + private static Response getResponse(HttpServletResponse response) { + if (response instanceof Response) { + return (Response) response; + } + else if (response instanceof HttpServletResponseWrapper) { + HttpServletResponseWrapper wrapper = (HttpServletResponseWrapper) response; + HttpServletResponse wrappedResponse = (HttpServletResponse) wrapper.getResponse(); + return getResponse(wrappedResponse); + } + else { + throw new IllegalArgumentException("Cannot convert [" + response.getClass() + + "] to org.eclipse.jetty.server.Response"); + } + } + @Override protected void applyHeaders() { HttpServletResponse response = getNativeResponse();