You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by jo...@apache.org on 2021/04/13 20:24:42 UTC
[sling-org-apache-sling-servlets-get] branch master updated:
SLING-10295 fix stream leaks in StreamRenderer (#5)
This is an automated email from the ASF dual-hosted git repository.
joerghoh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-get.git
The following commit(s) were added to refs/heads/master by this push:
new 6159f93 SLING-10295 fix stream leaks in StreamRenderer (#5)
6159f93 is described below
commit 6159f93357879665ef8b2dffbc001b0740ad51bc
Author: Jörg Hoh <jo...@users.noreply.github.com>
AuthorDate: Tue Apr 13 22:24:35 2021 +0200
SLING-10295 fix stream leaks in StreamRenderer (#5)
* SLING-10295 fix stream leaks in StreamRenderer
* update a few dependencies
---
pom.xml | 8 +-
.../servlets/get/impl/helpers/StreamRenderer.java | 162 ++++++++++-----------
2 files changed, 79 insertions(+), 91 deletions(-)
diff --git a/pom.xml b/pom.xml
index 6fc05e9..c0da355 100644
--- a/pom.xml
+++ b/pom.xml
@@ -99,13 +99,13 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.xss</artifactId>
- <version>2.0.0</version>
+ <version>2.2.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.api</artifactId>
- <version>2.16.4</version>
+ <version>2.23.0</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -142,7 +142,7 @@
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
- <version>1.9.5</version>
+ <version>3.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -166,7 +166,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.servlet-helpers</artifactId>
- <version>1.1.6</version>
+ <version>1.4.2</version>
<scope>test</scope>
</dependency>
</dependencies>
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java b/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java
index c39199c..1df52bd 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java
@@ -148,43 +148,48 @@ public class StreamRenderer implements Renderer {
final ValueMap vm = resource.adaptTo(ValueMap.class);
final String actualResourcePath = vm.get(JcrConstants.JCR_CONTENT, String.class);
resource = request.getResourceResolver().getResource(actualResourcePath);
- }
- InputStream stream = resource.adaptTo(InputStream.class);
- if (stream != null) {
- if ( stream instanceof ExternalizableInputStream) {
- response.sendRedirect(((ExternalizableInputStream)stream).getURI().toString());
- return;
- }
- if (isHeadRequest(request)) {
- setContentLength(response, resource.getResourceMetadata().getContentLength());
- setHeaders(resource, response);
+ if (resource == null) {
+ log.warn("Path {} does not exist",actualResourcePath);
return;
}
+ }
- streamResource(resource, stream, included, request, response);
+ try (InputStream stream = resource.adaptTo(InputStream.class)) {
+ if (stream != null) {
+ if ( stream instanceof ExternalizableInputStream) {
+ response.sendRedirect(((ExternalizableInputStream)stream).getURI().toString());
+ return;
+ }
+ if (isHeadRequest(request)) {
+ setContentLength(response, resource.getResourceMetadata().getContentLength());
+ setHeaders(resource, response);
+ return;
+ }
+ streamResource(resource, stream, included, request, response);
- } else {
+ } else {
- // the resource is the root, do not redirect, immediately index
- if (isRootResourceRequest(resource)) {
+ // the resource is the root, do not redirect, immediately index
+ if (isRootResourceRequest(resource)) {
- renderDirectory(request, response, included);
+ renderDirectory(request, response, included);
- } else if (included || response.isCommitted() ) {
+ } else if (included || response.isCommitted() ) {
- // request is included or committed, not redirecting
- request.getRequestProgressTracker().log(
- "StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
- log.warn("StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
+ // request is included or committed, not redirecting
+ request.getRequestProgressTracker().log(
+ "StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
+ log.warn("StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
- } else {
+ } else {
- // redirect to this with trailing slash to render the index
- String url = request.getResourceResolver().map(request,
- resource.getPath())
- + "/";
- response.sendRedirect(url);
+ // redirect to this with trailing slash to render the index
+ String url = request.getResourceResolver().map(request,
+ resource.getPath())
+ + "/";
+ response.sendRedirect(url);
+ }
}
}
}
@@ -225,60 +230,55 @@ public class StreamRenderer implements Renderer {
final SlingHttpServletRequest request,
final SlingHttpServletResponse response) throws IOException {
// finally stream the resource
- try {
- final ArrayList<Range> ranges;
- if (included) {
- // no range support on included requests
- ranges = FULL;
+ final ArrayList<Range> ranges;
+ if (included) {
+ // no range support on included requests
+ ranges = FULL;
- } else {
- // parse optional ranges
- ranges = parseRange(request, response,
+ } else {
+ // parse optional ranges
+ ranges = parseRange(request, response,
resource.getResourceMetadata());
- if (ranges == null) {
- // there was something wrong, the parseRange has sent a
- // response and we are done
- return;
- }
-
- // set various response headers, unless the request is included
- setHeaders(resource, response);
+ if (ranges == null) {
+ // there was something wrong, the parseRange has sent a
+ // response and we are done
+ return;
}
- ServletOutputStream out = response.getOutputStream();
+ // set various response headers, unless the request is included
+ setHeaders(resource, response);
+ }
+
+ ServletOutputStream out = response.getOutputStream();
- if (ranges == FULL) {
- // return full resource
- setContentLength(response,
+ if (ranges == FULL) {
+ // return full resource
+ setContentLength(response,
resource.getResourceMetadata().getContentLength());
- byte[] buf = new byte[IO_BUFFER_SIZE];
- int rd;
- while ((rd = stream.read(buf)) >= 0) {
- out.write(buf, 0, rd);
- }
- } else {
- // return ranges of the resource
- response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
+ byte[] buf = new byte[IO_BUFFER_SIZE];
+ int rd;
+ while ((rd = stream.read(buf)) >= 0) {
+ out.write(buf, 0, rd);
+ }
+ } else {
+ // return ranges of the resource
+ response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
- if (ranges.size() == 1) {
- Range range = ranges.get(0);
- response.addHeader("Content-Range", "bytes " + range.start
+ if (ranges.size() == 1) {
+ Range range = ranges.get(0);
+ response.addHeader("Content-Range", "bytes " + range.start
+ "-" + range.end + "/" + range.length);
- setContentLength(response, range.end - range.start + 1);
- copy(stream, out, range);
- } else {
+ setContentLength(response, range.end - range.start + 1);
+ copy(stream, out, range);
+ } else {
- response.setContentType("multipart/byteranges; boundary="
+ response.setContentType("multipart/byteranges; boundary="
+ mimeSeparation);
- copy(resource, out, ranges.iterator());
- }
-
+ copy(resource, out, ranges.iterator());
}
- } finally {
- closeSilently(stream);
}
}
@@ -449,11 +449,12 @@ public class StreamRenderer implements Renderer {
String name = ResourceUtil.getName(resource.getPath());
- InputStream ins = resource.adaptTo(InputStream.class);
- if (ins == null) {
- name += "/";
- } else {
- closeSilently(ins);
+ try (InputStream ins = resource.adaptTo(InputStream.class)) {
+ if (ins == null) {
+ name += "/";
+ }
+ } catch (IOException e) {
+ // ignore
}
String displayName = name;
@@ -505,10 +506,9 @@ public class StreamRenderer implements Renderer {
while ((exception == null) && (ranges.hasNext())) {
InputStream resourceInputStream = resource.adaptTo(InputStream.class);
- InputStream istream = new BufferedInputStream(resourceInputStream,
- IO_BUFFER_SIZE);
- try {
+ try (InputStream istream = new BufferedInputStream(resourceInputStream,
+ IO_BUFFER_SIZE)) {
Range currentRange = ranges.next();
// Writing MIME header.
@@ -527,10 +527,7 @@ public class StreamRenderer implements Renderer {
} catch(IOException e) {
exception = e;
}
- } finally {
- closeSilently(istream);
- }
-
+ }
}
ostream.println();
@@ -725,15 +722,6 @@ public class StreamRenderer implements Renderer {
response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
}
- private void closeSilently(final Closeable closeable) {
- if (closeable != null) {
- try {
- closeable.close();
- } catch (IOException ignore) {
- }
- }
- }
-
// --------- Range Inner Class
protected class Range {