Close InputStreams in writeResourceRegionCollection (analogous to writeResourceRegion)

Issue: SPR-15559
(cherry picked from commit eaac348)
This commit is contained in:
Juergen Hoeller 2017-05-17 14:34:50 +02:00
parent c6deeb31ec
commit 22bf9febcc
1 changed files with 31 additions and 15 deletions

View File

@ -38,6 +38,7 @@ import org.springframework.util.StreamUtils;
* or Collections of {@link ResourceRegion ResourceRegions}.
*
* @author Brian Clozel
* @author Juergen Hoeller
* @since 4.3
*/
public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessageConverter<Object> {
@ -54,12 +55,12 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa
@SuppressWarnings("unchecked")
protected MediaType getDefaultContentType(Object object) {
if (jafPresent) {
if(object instanceof ResourceRegion) {
if (object instanceof ResourceRegion) {
return ActivationMediaTypeFactory.getMediaType(((ResourceRegion) object).getResource());
}
else {
Collection<ResourceRegion> regions = (Collection<ResourceRegion>) object;
if(regions.size() > 0) {
if (!regions.isEmpty()) {
return ActivationMediaTypeFactory.getMediaType(regions.iterator().next().getResource());
}
}
@ -143,6 +144,7 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa
protected void writeResourceRegion(ResourceRegion region, HttpOutputMessage outputMessage) throws IOException {
Assert.notNull(region, "ResourceRegion must not be null");
HttpHeaders responseHeaders = outputMessage.getHeaders();
long start = region.getPosition();
long end = start + region.getCount() - 1;
Long resourceLength = region.getResource().contentLength();
@ -150,6 +152,7 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa
long rangeLength = end - start + 1;
responseHeaders.add("Content-Range", "bytes " + start + '-' + end + '/' + resourceLength);
responseHeaders.setContentLength(rangeLength);
InputStream in = region.getResource().getInputStream();
try {
StreamUtils.copyRange(in, outputMessage.getBody(), start, end);
@ -169,30 +172,43 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa
Assert.notNull(resourceRegions, "Collection of ResourceRegion should not be null");
HttpHeaders responseHeaders = outputMessage.getHeaders();
MediaType contentType = responseHeaders.getContentType();
String boundaryString = MimeTypeUtils.generateMultipartBoundaryString();
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();
// Writing MIME header.
println(out);
print(out, "--" + boundaryString);
println(out);
if (contentType != null) {
print(out, "Content-Type: " + contentType.toString());
try {
// Writing MIME header.
println(out);
print(out, "--" + boundaryString);
println(out);
if (contentType != null) {
print(out, "Content-Type: " + contentType.toString());
println(out);
}
Long resourceLength = region.getResource().contentLength();
end = Math.min(end, resourceLength - 1);
print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength);
println(out);
println(out);
// Printing content
StreamUtils.copyRange(in, out, start, end);
}
finally {
try {
in.close();
}
catch (IOException ex) {
// ignore
}
}
Long resourceLength = region.getResource().contentLength();
end = Math.min(end, resourceLength - 1);
print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength);
println(out);
println(out);
// Printing content
StreamUtils.copyRange(in, out, start, end);
}
println(out);
print(out, "--" + boundaryString + "--");
}