|
|
|
@ -21,12 +21,14 @@ import java.util.Enumeration; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Set; |
|
|
|
import java.util.Set; |
|
|
|
|
|
|
|
import java.util.function.Predicate; |
|
|
|
|
|
|
|
|
|
|
|
import jakarta.servlet.ServletRequest; |
|
|
|
import jakarta.servlet.ServletRequest; |
|
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.beans.MutablePropertyValues; |
|
|
|
import org.springframework.beans.MutablePropertyValues; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
|
|
|
|
import org.springframework.util.StringUtils; |
|
|
|
import org.springframework.web.bind.ServletRequestDataBinder; |
|
|
|
import org.springframework.web.bind.ServletRequestDataBinder; |
|
|
|
import org.springframework.web.bind.WebDataBinder; |
|
|
|
import org.springframework.web.bind.WebDataBinder; |
|
|
|
import org.springframework.web.servlet.HandlerMapping; |
|
|
|
import org.springframework.web.servlet.HandlerMapping; |
|
|
|
@ -51,6 +53,12 @@ import org.springframework.web.servlet.HandlerMapping; |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { |
|
|
|
public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final Set<String> FILTERED_HEADER_NAMES = Set.of("Priority"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Predicate<String> headerPredicate = name -> !FILTERED_HEADER_NAMES.contains(name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Create a new instance, with default object name. |
|
|
|
* Create a new instance, with default object name. |
|
|
|
* @param target the target object to bind onto (or {@code null} |
|
|
|
* @param target the target object to bind onto (or {@code null} |
|
|
|
@ -73,6 +81,29 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Add a Predicate that filters the header names to use for data binding. |
|
|
|
|
|
|
|
* Multiple predicates are combined with {@code AND}. |
|
|
|
|
|
|
|
* @param headerPredicate the predicate to add |
|
|
|
|
|
|
|
* @since 6.2.1 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void addHeaderPredicate(Predicate<String> headerPredicate) { |
|
|
|
|
|
|
|
this.headerPredicate = this.headerPredicate.and(headerPredicate); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Set the Predicate that filters the header names to use for data binding. |
|
|
|
|
|
|
|
* <p>Note that this method resets any previous predicates that may have been |
|
|
|
|
|
|
|
* set, including headers excluded by default such as the RFC 9218 defined |
|
|
|
|
|
|
|
* "Priority" header. |
|
|
|
|
|
|
|
* @param headerPredicate the predicate to add |
|
|
|
|
|
|
|
* @since 6.2.1 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void setHeaderPredicate(Predicate<String> headerPredicate) { |
|
|
|
|
|
|
|
this.headerPredicate = headerPredicate; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
protected ServletRequestValueResolver createValueResolver(ServletRequest request) { |
|
|
|
protected ServletRequestValueResolver createValueResolver(ServletRequest request) { |
|
|
|
return new ExtendedServletRequestValueResolver(request, this); |
|
|
|
return new ExtendedServletRequestValueResolver(request, this); |
|
|
|
@ -93,7 +124,7 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { |
|
|
|
String name = names.nextElement(); |
|
|
|
String name = names.nextElement(); |
|
|
|
Object value = getHeaderValue(httpRequest, name); |
|
|
|
Object value = getHeaderValue(httpRequest, name); |
|
|
|
if (value != null) { |
|
|
|
if (value != null) { |
|
|
|
name = name.replace("-", ""); |
|
|
|
name = StringUtils.uncapitalize(name.replace("-", "")); |
|
|
|
addValueIfNotPresent(mpvs, "Header", name, value); |
|
|
|
addValueIfNotPresent(mpvs, "Header", name, value); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -118,7 +149,11 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
@Nullable |
|
|
|
private static Object getHeaderValue(HttpServletRequest request, String name) { |
|
|
|
private Object getHeaderValue(HttpServletRequest request, String name) { |
|
|
|
|
|
|
|
if (!this.headerPredicate.test(name)) { |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Enumeration<String> valuesEnum = request.getHeaders(name); |
|
|
|
Enumeration<String> valuesEnum = request.getHeaders(name); |
|
|
|
if (!valuesEnum.hasMoreElements()) { |
|
|
|
if (!valuesEnum.hasMoreElements()) { |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
@ -141,7 +176,7 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Resolver of values that looks up URI path variables. |
|
|
|
* Resolver of values that looks up URI path variables. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private static class ExtendedServletRequestValueResolver extends ServletRequestValueResolver { |
|
|
|
private class ExtendedServletRequestValueResolver extends ServletRequestValueResolver { |
|
|
|
|
|
|
|
|
|
|
|
ExtendedServletRequestValueResolver(ServletRequest request, WebDataBinder dataBinder) { |
|
|
|
ExtendedServletRequestValueResolver(ServletRequest request, WebDataBinder dataBinder) { |
|
|
|
super(request, dataBinder); |
|
|
|
super(request, dataBinder); |
|
|
|
|