From 382c3a025871a15c79d90f1ee01986be33d8f285 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Sat, 20 Feb 2016 14:34:11 +0100 Subject: [PATCH] correct answer to well-formed but still unsatisfiable range request --- .../webdav/jackrabbitservlet/DavFileWithRange.java | 8 +++++--- .../webdav/jackrabbitservlet/WebDavServlet.java | 13 +++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java index ac14efa08..a56197f0b 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java @@ -9,6 +9,7 @@ import java.util.Objects; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.apache.jackrabbit.webdav.DavException; +import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSession; import org.apache.jackrabbit.webdav.io.OutputContext; import org.apache.jackrabbit.webdav.lock.LockManager; @@ -41,9 +42,10 @@ class DavFileWithRange extends DavFile { try (ReadableFile src = node.openReadable(); OutputStream out = outputContext.getOutputStream()) { final long contentLength = src.size(); final Pair range = getEffectiveRange(contentLength); - assert range.getLeft() >= 0; - assert range.getLeft() <= range.getRight(); - assert range.getRight() <= contentLength; + if (range.getLeft() < 0 || range.getLeft() > range.getRight() || range.getRight() > contentLength) { + outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), "bytes */" + contentLength); + throw new UncheckedDavException(DavServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE, "Valid Range would be in [0, " + contentLength + "]"); + } final Long rangeLength = range.getRight() - range.getLeft() + 1; outputContext.setContentLength(rangeLength); outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), contentRangeResponseHeader(range.getLeft(), range.getRight(), contentLength)); diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/WebDavServlet.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/WebDavServlet.java index 39fec4b8c..9cbc5d5b6 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/WebDavServlet.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/WebDavServlet.java @@ -11,6 +11,8 @@ package org.cryptomator.frontend.webdav.jackrabbitservlet; import java.io.IOException; import java.net.URI; +import javax.servlet.ServletException; + import org.apache.commons.lang3.ArrayUtils; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavLocatorFactory; @@ -82,6 +84,17 @@ public class WebDavServlet extends AbstractWebdavServlet { throw new UnsupportedOperationException("Setting resourceFactory not supported."); } + /* Unchecked DAV exception rewrapping */ + + @Override + protected boolean execute(WebdavRequest request, WebdavResponse response, int method, DavResource resource) throws ServletException, IOException, DavException { + try { + return super.execute(request, response, method, resource); + } catch (UncheckedDavException e) { + throw e.toDavException(); + } + } + /* GET stuff */ @Override