Skip to content

Commit 22bf9fe

Browse files
committed
Close InputStreams in writeResourceRegionCollection (analogous to writeResourceRegion)
Issue: SPR-15559 (cherry picked from commit eaac348)
1 parent c6deeb3 commit 22bf9fe

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
* or Collections of {@link ResourceRegion ResourceRegions}.
3939
*
4040
* @author Brian Clozel
41+
* @author Juergen Hoeller
4142
* @since 4.3
4243
*/
4344
public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessageConverter<Object> {
@@ -54,12 +55,12 @@ public ResourceRegionHttpMessageConverter() {
5455
@SuppressWarnings("unchecked")
5556
protected MediaType getDefaultContentType(Object object) {
5657
if (jafPresent) {
57-
if(object instanceof ResourceRegion) {
58+
if (object instanceof ResourceRegion) {
5859
return ActivationMediaTypeFactory.getMediaType(((ResourceRegion) object).getResource());
5960
}
6061
else {
6162
Collection<ResourceRegion> regions = (Collection<ResourceRegion>) object;
62-
if(regions.size() > 0) {
63+
if (!regions.isEmpty()) {
6364
return ActivationMediaTypeFactory.getMediaType(regions.iterator().next().getResource());
6465
}
6566
}
@@ -143,13 +144,15 @@ protected void writeInternal(Object object, Type type, HttpOutputMessage outputM
143144
protected void writeResourceRegion(ResourceRegion region, HttpOutputMessage outputMessage) throws IOException {
144145
Assert.notNull(region, "ResourceRegion must not be null");
145146
HttpHeaders responseHeaders = outputMessage.getHeaders();
147+
146148
long start = region.getPosition();
147149
long end = start + region.getCount() - 1;
148150
Long resourceLength = region.getResource().contentLength();
149151
end = Math.min(end, resourceLength - 1);
150152
long rangeLength = end - start + 1;
151153
responseHeaders.add("Content-Range", "bytes " + start + '-' + end + '/' + resourceLength);
152154
responseHeaders.setContentLength(rangeLength);
155+
153156
InputStream in = region.getResource().getInputStream();
154157
try {
155158
StreamUtils.copyRange(in, outputMessage.getBody(), start, end);
@@ -169,30 +172,43 @@ private void writeResourceRegionCollection(Collection<ResourceRegion> resourceRe
169172

170173
Assert.notNull(resourceRegions, "Collection of ResourceRegion should not be null");
171174
HttpHeaders responseHeaders = outputMessage.getHeaders();
175+
172176
MediaType contentType = responseHeaders.getContentType();
173177
String boundaryString = MimeTypeUtils.generateMultipartBoundaryString();
174178
responseHeaders.set(HttpHeaders.CONTENT_TYPE, "multipart/byteranges; boundary=" + boundaryString);
175179
OutputStream out = outputMessage.getBody();
180+
176181
for (ResourceRegion region : resourceRegions) {
177182
long start = region.getPosition();
178183
long end = start + region.getCount() - 1;
179184
InputStream in = region.getResource().getInputStream();
180-
// Writing MIME header.
181-
println(out);
182-
print(out, "--" + boundaryString);
183-
println(out);
184-
if (contentType != null) {
185-
print(out, "Content-Type: " + contentType.toString());
185+
try {
186+
// Writing MIME header.
187+
println(out);
188+
print(out, "--" + boundaryString);
186189
println(out);
190+
if (contentType != null) {
191+
print(out, "Content-Type: " + contentType.toString());
192+
println(out);
193+
}
194+
Long resourceLength = region.getResource().contentLength();
195+
end = Math.min(end, resourceLength - 1);
196+
print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength);
197+
println(out);
198+
println(out);
199+
// Printing content
200+
StreamUtils.copyRange(in, out, start, end);
201+
}
202+
finally {
203+
try {
204+
in.close();
205+
}
206+
catch (IOException ex) {
207+
// ignore
208+
}
187209
}
188-
Long resourceLength = region.getResource().contentLength();
189-
end = Math.min(end, resourceLength - 1);
190-
print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength);
191-
println(out);
192-
println(out);
193-
// Printing content
194-
StreamUtils.copyRange(in, out, start, end);
195210
}
211+
196212
println(out);
197213
print(out, "--" + boundaryString + "--");
198214
}

0 commit comments

Comments
 (0)