Fix for ALF-2216 - completed support for single and multi-byte range requests via the download content servlet.

- Supports single range, open start/ended single range and multipart/byteranges response type for multiple ranges
 - Supports merged sequential ranges for optimal transfer
 - Tested with IE+AdobeReader and FireFox+AdobeReader combination - which transmit any sequence and any number of multi-byte range requests for an embedded PDF document - various sizes and types of documents also tested

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19710 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2010-03-31 18:46:35 +00:00
parent 769cdb0aa4
commit 7361e96e06
2 changed files with 545 additions and 99 deletions

View File

@@ -81,16 +81,16 @@ public class DownloadContentServlet extends BaseDownloadContentServlet
return logger;
}
/**
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doHead(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void doGet(final HttpServletRequest req, final HttpServletResponse res)
throws ServletException, IOException
@Override
protected void doHead(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException
{
if (logger.isDebugEnabled())
{
String queryString = req.getQueryString();
logger.debug("Authenticating request to URL: " + req.getRequestURI() +
logger.debug("Authenticating (HEAD) request to URL: " + req.getRequestURI() +
((queryString != null && queryString.length() > 0) ? ("?" + queryString) : ""));
}
@@ -106,7 +106,39 @@ public class DownloadContentServlet extends BaseDownloadContentServlet
{
public Void execute() throws Throwable
{
processDownloadRequest(req, res, true);
processDownloadRequest(req, res, true, false);
return null;
}
};
transactionService.getRetryingTransactionHelper().doInTransaction(processCallback, true);
}
/**
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void doGet(final HttpServletRequest req, final HttpServletResponse res)
throws ServletException, IOException
{
if (logger.isDebugEnabled())
{
String queryString = req.getQueryString();
logger.debug("Authenticating (GET) request to URL: " + req.getRequestURI() +
((queryString != null && queryString.length() > 0) ? ("?" + queryString) : ""));
}
AuthenticationStatus status = servletAuthenticate(req, res);
if (status == AuthenticationStatus.Failure)
{
return;
}
ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext());
TransactionService transactionService = serviceRegistry.getTransactionService();
RetryingTransactionCallback<Void> processCallback = new RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
processDownloadRequest(req, res, true, true);
return null;
}
};