From 7fff0b9bb36352b94dbf08259e9d51c59116f3f8 Mon Sep 17 00:00:00 2001 From: Randomnicode Date: Sat, 14 Dec 2019 10:45:33 -0800 Subject: [PATCH] Reuse InputStream for ResourceRegionHttpMessageConverter Dynamically generated input streams cannot be closed and reopened multiple times. This fix reuses the same InputStream across multiple ResourceRegion writes. Closes #24210 --- .../ResourceRegionHttpMessageConverter.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java index be98db9122a1..dc0cee1a6972 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java @@ -179,11 +179,10 @@ private void writeResourceRegionCollection(Collection resourceRe responseHeaders.set(HttpHeaders.CONTENT_TYPE, "multipart/byteranges; boundary=" + boundaryString); OutputStream out = outputMessage.getBody(); - for (ResourceRegion region : resourceRegions) { - long start = region.getPosition(); - long end = start + region.getCount() - 1; - InputStream in = region.getResource().getInputStream(); - try { + try (InputStream in = region.getResource().getInputStream()) { + for (ResourceRegion region : resourceRegions) { + long start = region.getPosition(); + long end = start + region.getCount() - 1; // Writing MIME header. println(out); print(out, "--" + boundaryString); @@ -200,14 +199,8 @@ private void writeResourceRegionCollection(Collection resourceRe // Printing content StreamUtils.copyRange(in, out, start, end); } - finally { - try { - in.close(); - } - catch (IOException ex) { - // ignore - } - } + } catch (IOException ex) { + // ignore } println(out);