diff --git a/spring-web/src/main/java/org/springframework/http/codec/cbor/Jackson2CborDecoder.java b/spring-web/src/main/java/org/springframework/http/codec/cbor/Jackson2CborDecoder.java index 9daf3b302db6..647372e05cb2 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/cbor/Jackson2CborDecoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/cbor/Jackson2CborDecoder.java @@ -23,9 +23,13 @@ import org.jspecify.annotations.Nullable; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.context.ContextView; import org.springframework.core.ResolvableType; +import org.springframework.core.codec.Hints; import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.MediaType; import org.springframework.http.codec.json.AbstractJackson2Decoder; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; @@ -58,4 +62,15 @@ public Flux decode(Publisher input, ResolvableType elementTy throw new UnsupportedOperationException("Does not support stream decoding yet"); } + @Override + public Mono decodeToMono(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { + return Mono.deferContextual(contextView -> { + + Map hintsToUse = contextView.isEmpty() ? hints : + Hints.merge(hints, ContextView.class.getName(), contextView); + + return DataBufferUtils.join(input, this.getMaxInMemorySize()).flatMap(dataBuffer -> + Mono.justOrEmpty(decode(dataBuffer, elementType, mimeType, hintsToUse))); + }); + } } diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java index 23b8b1a37fb7..2591d89acf53 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java @@ -128,6 +128,10 @@ public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType public Flux decode(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { + return decodeToFlux(input, elementType, mimeType, hints, null); + } + + private Flux decodeToFlux(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints,@Nullable Boolean tokenizeArrays) { ObjectMapper mapper = selectObjectMapper(elementType, mimeType); if (mapper == null) { return Flux.error(new IllegalStateException("No ObjectMapper for " + elementType)); @@ -138,8 +142,10 @@ public Flux decode(Publisher input, ResolvableType elementTy forceUseOfBigDecimal = true; } - boolean tokenizeArrays = (!elementType.isArray() && - !Collection.class.isAssignableFrom(elementType.resolve(Object.class))); + if (tokenizeArrays == null) { + tokenizeArrays = (!elementType.isArray() && + !Collection.class.isAssignableFrom(elementType.resolve(Object.class))); + } Flux processed = processInput(input, elementType, mimeType, hints); Flux tokens = Jackson2Tokenizer.tokenize(processed, mapper.getFactory(), mapper, @@ -188,15 +194,7 @@ protected Flux processInput(Publisher input, ResolvableT @Override public Mono decodeToMono(Publisher input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { - - return Mono.deferContextual(contextView -> { - - Map hintsToUse = contextView.isEmpty() ? hints : - Hints.merge(hints, ContextView.class.getName(), contextView); - - return DataBufferUtils.join(input, this.maxInMemorySize).flatMap(dataBuffer -> - Mono.justOrEmpty(decode(dataBuffer, elementType, mimeType, hintsToUse))); - }); + return decodeToFlux(input, elementType, mimeType, hints, false).singleOrEmpty(); } @Override diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java index 427d8025a7ad..b03fbd8a6343 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java @@ -206,6 +206,9 @@ private boolean isTopLevelArrayToken(JsonToken token) { private void assertInMemorySize(int currentBufferSize, List result) { if (this.maxInMemorySize >= 0) { + if (currentBufferSize > this.maxInMemorySize) { + raiseLimitException(); + } if (!result.isEmpty()) { this.byteCount = 0; }