Match declared parameters on produces condition
Closes gh-21670
This commit is contained in:
@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.HttpMediaTypeException;
|
||||
import org.springframework.web.HttpMediaTypeNotAcceptableException;
|
||||
import org.springframework.web.accept.ContentNegotiationManager;
|
||||
@@ -322,12 +323,23 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro
|
||||
|
||||
private boolean matchMediaType(List<MediaType> acceptedMediaTypes) {
|
||||
for (MediaType acceptedMediaType : acceptedMediaTypes) {
|
||||
if (getMediaType().isCompatibleWith(acceptedMediaType)) {
|
||||
if (getMediaType().isCompatibleWith(acceptedMediaType) && matchParameters(acceptedMediaType)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean matchParameters(MediaType acceptedMediaType) {
|
||||
for (String name : getMediaType().getParameters().keySet()) {
|
||||
String s1 = getMediaType().getParameter(name);
|
||||
String s2 = acceptedMediaType.getParameter(name);
|
||||
if (StringUtils.hasText(s1) && StringUtils.hasText(s2) && !s1.equalsIgnoreCase(s2)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -90,6 +90,30 @@ public class ProducesRequestConditionTests {
|
||||
assertNull(condition.getMatchingCondition(request));
|
||||
}
|
||||
|
||||
@Test // gh-21670
|
||||
public void matchWithParameters() {
|
||||
String base = "application/atom+xml";
|
||||
ProducesRequestCondition condition = new ProducesRequestCondition(base + ";type=feed");
|
||||
HttpServletRequest request = createRequest(base + ";type=entry");
|
||||
assertNull("Declared parameter value must match if present in request",
|
||||
condition.getMatchingCondition(request));
|
||||
|
||||
condition = new ProducesRequestCondition(base + ";type=feed");
|
||||
request = createRequest(base + ";type=feed");
|
||||
assertNotNull("Declared parameter value must match if present in request",
|
||||
condition.getMatchingCondition(request));
|
||||
|
||||
condition = new ProducesRequestCondition(base + ";type=feed");
|
||||
request = createRequest(base);
|
||||
assertNotNull("Declared parameter has no impact if not present in request",
|
||||
condition.getMatchingCondition(request));
|
||||
|
||||
condition = new ProducesRequestCondition(base);
|
||||
request = createRequest(base + ";type=feed");
|
||||
assertNotNull("No impact from other parameters in request",
|
||||
condition.getMatchingCondition(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchParseError() {
|
||||
ProducesRequestCondition condition = new ProducesRequestCondition("text/plain");
|
||||
|
||||
Reference in New Issue
Block a user