From e96b71acf3af4df7d00270e93659ec1f00495fdc Mon Sep 17 00:00:00 2001 From: Oleh Faizulin Date: Sat, 4 Jan 2020 09:54:53 +0200 Subject: [PATCH] contentLength support for Resource decoding Expose the known content length, if known, in the InputStreamResource returned by ResourceHttpMessageConverter or ResourceDecoder. See gh-24292 --- .../core/codec/ResourceDecoder.java | 5 +++++ .../core/codec/ResourceDecoderTests.java | 18 ++++++++++++++++++ .../ResourceHttpMessageConverter.java | 5 +++++ .../ResourceHttpMessageConverterTests.java | 2 ++ 4 files changed, 30 insertions(+) diff --git a/spring-core/src/main/java/org/springframework/core/codec/ResourceDecoder.java b/spring-core/src/main/java/org/springframework/core/codec/ResourceDecoder.java index eeb307cfcd..b19e6f9545 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/ResourceDecoder.java +++ b/spring-core/src/main/java/org/springframework/core/codec/ResourceDecoder.java @@ -83,6 +83,11 @@ public class ResourceDecoder extends AbstractDataBufferDecoder { public String getFilename() { return filename; } + + @Override + public long contentLength() { + return bytes.length; + } }; } else if (Resource.class.isAssignableFrom(clazz)) { diff --git a/spring-core/src/test/java/org/springframework/core/codec/ResourceDecoderTests.java b/spring-core/src/test/java/org/springframework/core/codec/ResourceDecoderTests.java index 1c3a531f7a..3c129428f5 100644 --- a/spring-core/src/test/java/org/springframework/core/codec/ResourceDecoderTests.java +++ b/spring-core/src/test/java/org/springframework/core/codec/ResourceDecoderTests.java @@ -105,4 +105,22 @@ class ResourceDecoderTests extends AbstractDecoderTests { Collections.singletonMap(ResourceDecoder.FILENAME_HINT, "testFile")); } + @Test + public void decodeInputStreamResource() { + Flux input = Flux.concat(dataBuffer(this.fooBytes), dataBuffer(this.barBytes)); + testDecodeAll(input, InputStreamResource.class, step -> step + .consumeNextWith(resource -> { + try { + byte[] bytes = StreamUtils.copyToByteArray(resource.getInputStream()); + assertThat(new String(bytes)).isEqualTo("foobar"); + assertThat(resource.contentLength()).isEqualTo(fooBytes.length + barBytes.length); + } + catch (IOException ex) { + throw new AssertionError(ex.getMessage(), ex); + } + }) + .expectComplete() + .verify()); + } + } diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java index 582ab859de..3fd7208315 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java @@ -84,6 +84,11 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter