Browse Source

Polishing in ForwardedHeaderFilter

See gh-30828
pull/31736/head
rstoyanchev 2 years ago
parent
commit
19bca03aa2
  1. 34
      spring-web/src/main/java/org/springframework/web/filter/ForwardedHeaderFilter.java

34
spring-web/src/main/java/org/springframework/web/filter/ForwardedHeaderFilter.java

@ -165,6 +165,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
doFilterInternal(request, response, filterChain); doFilterInternal(request, response, filterChain);
} }
/** /**
* Hide "Forwarded" or "X-Forwarded-*" headers. * Hide "Forwarded" or "X-Forwarded-*" headers.
*/ */
@ -235,7 +236,6 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private final ForwardedPrefixExtractor forwardedPrefixExtractor; private final ForwardedPrefixExtractor forwardedPrefixExtractor;
ForwardedHeaderExtractingRequest(HttpServletRequest servletRequest) { ForwardedHeaderExtractingRequest(HttpServletRequest servletRequest) {
super(servletRequest); super(servletRequest);
@ -252,11 +252,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
this.remoteAddress = ForwardedHeaderUtils.parseForwardedFor(uri, headers, request.getRemoteAddress()); this.remoteAddress = ForwardedHeaderUtils.parseForwardedFor(uri, headers, request.getRemoteAddress());
String baseUrl = this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port); // Use Supplier as Tomcat updates delegate request on FORWARD
Supplier<HttpServletRequest> delegateRequest = () -> (HttpServletRequest) getRequest(); Supplier<HttpServletRequest> requestSupplier = () -> (HttpServletRequest) getRequest();
this.forwardedPrefixExtractor = new ForwardedPrefixExtractor(delegateRequest, baseUrl);
}
this.forwardedPrefixExtractor = new ForwardedPrefixExtractor(
requestSupplier, (this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port)));
}
@Override @Override
@Nullable @Nullable
@ -335,22 +336,22 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private String requestUrl; private String requestUrl;
/** /**
* Constructor with required information. * Constructor with required information.
* @param delegateRequest supplier for the current * @param delegate supplier for the current
* {@link HttpServletRequestWrapper#getRequest() delegate request} which * {@link HttpServletRequestWrapper#getRequest() delegate request} which
* may change during a forward (e.g. Tomcat. * may change during a forward (e.g. Tomcat.
* @param baseUrl the host, scheme, and port based on forwarded headers * @param baseUrl the host, scheme, and port based on forwarded headers
*/ */
public ForwardedPrefixExtractor(Supplier<HttpServletRequest> delegateRequest, String baseUrl) { public ForwardedPrefixExtractor(Supplier<HttpServletRequest> delegate, String baseUrl) {
this.delegate = delegateRequest; this.delegate = delegate;
this.baseUrl = baseUrl; this.baseUrl = baseUrl;
this.actualRequestUri = delegateRequest.get().getRequestURI(); this.actualRequestUri = delegate.get().getRequestURI();
this.forwardedPrefix = initForwardedPrefix(delegateRequest.get()); // Keep call order
this.forwardedPrefix = initForwardedPrefix(delegate.get());
this.requestUri = initRequestUri(); this.requestUri = initRequestUri();
this.requestUrl = initRequestUrl(); // Keep the order: depends on requestUri this.requestUrl = initRequestUrl();
} }
@Nullable @Nullable
@ -388,7 +389,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
} }
private String initRequestUrl() { private String initRequestUrl() {
return this.baseUrl + (this.requestUri != null ? this.requestUri : this.delegate.get().getRequestURI()); return (this.baseUrl + (this.requestUri != null ? this.requestUri : this.delegate.get().getRequestURI()));
} }
@ -410,11 +411,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
} }
private void recalculatePathsIfNecessary() { private void recalculatePathsIfNecessary() {
// Path of delegate request changed, e.g. FORWARD on Tomcat
if (!this.actualRequestUri.equals(this.delegate.get().getRequestURI())) { if (!this.actualRequestUri.equals(this.delegate.get().getRequestURI())) {
// Underlying path change (e.g. Servlet FORWARD).
this.actualRequestUri = this.delegate.get().getRequestURI(); this.actualRequestUri = this.delegate.get().getRequestURI();
// Keep call order
this.requestUri = initRequestUri(); this.requestUri = initRequestUri();
this.requestUrl = initRequestUrl(); // Keep the order: depends on requestUri this.requestUrl = initRequestUrl();
} }
} }
} }
@ -426,13 +428,11 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private final HttpServletRequest request; private final HttpServletRequest request;
ForwardedHeaderExtractingResponse(HttpServletResponse response, HttpServletRequest request) { ForwardedHeaderExtractingResponse(HttpServletResponse response, HttpServletRequest request) {
super(response); super(response);
this.request = request; this.request = request;
} }
@Override @Override
public void sendRedirect(String location) throws IOException { public void sendRedirect(String location) throws IOException {

Loading…
Cancel
Save