Support request/response wrappers in JettyHttpHandlerAdapter

This commit makes JettyServerHttpRequest aware of
HttpServletRequestWrapper, and JettyServerHttpResponse aware of
HttpServletResponseWrapper.

Closes gh-27146
This commit is contained in:
Arjen Poutsma 2021-07-08 16:39:26 +02:00
parent fed1a426b6
commit 9cbb5af622
1 changed files with 40 additions and 4 deletions

View File

@ -24,7 +24,9 @@ import java.nio.charset.Charset;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.server.HttpOutput; import org.eclipse.jetty.server.HttpOutput;
@ -98,10 +100,28 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
super(createHeaders(request), request, asyncContext, servletPath, bufferFactory, bufferSize); super(createHeaders(request), request, asyncContext, servletPath, bufferFactory, bufferSize);
} }
private static MultiValueMap<String, String> createHeaders(HttpServletRequest request) { private static MultiValueMap<String, String> createHeaders(HttpServletRequest servletRequest) {
HttpFields fields = ((Request) request).getMetaData().getFields(); Request request = getRequest(servletRequest);
HttpFields fields = request.getMetaData().getFields();
return new JettyHeadersAdapter(fields); 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 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
super(createHeaders(response), response, asyncContext, bufferFactory, bufferSize, request); super(createHeaders(response), response, asyncContext, bufferFactory, bufferSize, request);
} }
private static HttpHeaders createHeaders(HttpServletResponse response) { private static HttpHeaders createHeaders(HttpServletResponse servletResponse) {
HttpFields fields = ((Response) response).getHttpFields(); Response response = getResponse(servletResponse);
HttpFields fields = response.getHttpFields();
return new HttpHeaders(new JettyHeadersAdapter(fields)); 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 @Override
protected void applyHeaders() { protected void applyHeaders() {
HttpServletResponse response = getNativeResponse(); HttpServletResponse response = getNativeResponse();