mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-26 00:39:01 +00:00
Improve parameter-based content negotiation
Closes gh-36925
This commit is contained in:
+5
-3
@@ -148,9 +148,11 @@ public abstract class AbstractMappingContentNegotiationStrategy extends MappingM
|
||||
throws HttpMediaTypeNotAcceptableException {
|
||||
|
||||
if (!isUseRegisteredExtensionsOnly()) {
|
||||
Optional<MediaType> mediaType = MediaTypeFactory.getMediaType("file." + key);
|
||||
if (mediaType.isPresent()) {
|
||||
return mediaType.get();
|
||||
if (key.indexOf('.') == -1) {
|
||||
Optional<MediaType> mediaType = MediaTypeFactory.getMediaType("file." + key);
|
||||
if (mediaType.isPresent()) {
|
||||
return mediaType.get();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isIgnoreUnknownExtensions()) {
|
||||
|
||||
+6
-6
@@ -57,7 +57,7 @@ public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExten
|
||||
public MappingMediaTypeFileExtensionResolver(@Nullable Map<String, MediaType> mediaTypes) {
|
||||
if (mediaTypes != null) {
|
||||
Set<String> allFileExtensions = CollectionUtils.newHashSet(mediaTypes.size());
|
||||
mediaTypes.forEach((extension, mediaType) -> addMapping(extension.toLowerCase(Locale.ROOT), mediaType));
|
||||
mediaTypes.forEach(this::addMapping);
|
||||
this.allFileExtensions.addAll(allFileExtensions);
|
||||
}
|
||||
}
|
||||
@@ -74,12 +74,12 @@ public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExten
|
||||
/**
|
||||
* Map an extension to a MediaType. Ignore if extension already mapped.
|
||||
*/
|
||||
protected void addMapping(String extension, MediaType mediaType) {
|
||||
MediaType previous = this.mediaTypes.putIfAbsent(extension, mediaType);
|
||||
protected void addMapping(String key, MediaType mediaType) {
|
||||
key = key.toLowerCase(Locale.ROOT);
|
||||
MediaType previous = this.mediaTypes.putIfAbsent(key, mediaType);
|
||||
if (previous == null) {
|
||||
this.fileExtensions.computeIfAbsent(
|
||||
mediaType, key -> new CopyOnWriteArrayList<>()).add(extension);
|
||||
this.allFileExtensions.add(extension);
|
||||
this.fileExtensions.computeIfAbsent(mediaType, k -> new CopyOnWriteArrayList<>()).add(key);
|
||||
this.allFileExtensions.add(key);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-1
@@ -49,7 +49,7 @@ class MappingContentNegotiationStrategyTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
void resolveMediaTypesViaMediaTypeFactory() throws Exception {
|
||||
void resolveMediaTypesViaFactory() throws Exception {
|
||||
Map<String, MediaType> mapping = null;
|
||||
TestMappingContentNegotiationStrategy strategy = new TestMappingContentNegotiationStrategy("xml", mapping);
|
||||
|
||||
@@ -68,6 +68,15 @@ class MappingContentNegotiationStrategyTests {
|
||||
.isInstanceOf(HttpMediaTypeNotAcceptableException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void resolveMediaTypesInvalidKey() {
|
||||
Map<String, MediaType> mapping = null;
|
||||
TestMappingContentNegotiationStrategy strategy = new TestMappingContentNegotiationStrategy("not.json", mapping);
|
||||
|
||||
assertThatThrownBy(() -> strategy.resolveMediaTypes(null))
|
||||
.isInstanceOf(HttpMediaTypeNotAcceptableException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void resolveMediaTypesNullKey() throws Exception {
|
||||
Map<String, MediaType> mapping = Collections.singletonMap("json", MediaType.APPLICATION_JSON);
|
||||
|
||||
+2
@@ -75,6 +75,8 @@ class MappingMediaTypeFileExtensionResolverTests {
|
||||
map.put("jSoN", MediaType.APPLICATION_JSON);
|
||||
|
||||
MappingMediaTypeFileExtensionResolver resolver = new MappingMediaTypeFileExtensionResolver(map);
|
||||
map.forEach(resolver::addMapping);
|
||||
|
||||
assertThat(resolver.getAllFileExtensions()).containsExactly("json");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user