Close InputStreams in writeResourceRegionCollection (analogous to writeResourceRegion)
Issue: SPR-15559
This commit is contained in:
parent
7b3f5fd855
commit
eaac348c05
|
@ -40,6 +40,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> {
|
||||
|
@ -58,7 +59,7 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa
|
|||
}
|
||||
else {
|
||||
Collection<ResourceRegion> regions = (Collection<ResourceRegion>) object;
|
||||
if (regions.size() > 0) {
|
||||
if (!regions.isEmpty()) {
|
||||
resource = regions.iterator().next().getResource();
|
||||
}
|
||||
}
|
||||
|
@ -141,6 +142,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();
|
||||
|
@ -148,6 +150,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);
|
||||
|
@ -167,30 +170,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 + "--");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue