Skip to content

Commit

Permalink
LPS-27677 Multiple range is not supported
Browse files Browse the repository at this point in the history
  • Loading branch information
caorongjin authored and brianchandotcom committed Jun 4, 2012
1 parent 171a179 commit 6abceaf
Show file tree
Hide file tree
Showing 13 changed files with 510 additions and 107 deletions.
8 changes: 8 additions & 0 deletions portal-impl/src/META-INF/portal-log4j.xml
Expand Up @@ -358,6 +358,14 @@
<priority value="WARN" />
</category>

<category name="com.liferay.portal.kernel.servlet.ServletRequestUtil">
<priority value="INFO" />
</category>

<category name="com.liferay.portal.kernel.servlet.ServletResponseUtil">
<priority value="INFO" />
</category>

<category name="com.liferay.portal.lar">
<priority value="ERROR" />
</category>
Expand Down
2 changes: 2 additions & 0 deletions portal-impl/src/com/liferay/portal/util/PropsValues.java
Expand Up @@ -1652,6 +1652,8 @@ public class PropsValues {

public static final boolean WEB_SERVER_PROXY_LEGACY_MODE = GetterUtil.getBoolean(PropsUtil.get(PropsKeys.WEB_SERVER_PROXY_LEGACY_MODE));

public static final String[] WEB_SERVER_SERVLET_ACCEPT_RANGES_MIME_TYPES = PropsUtil.getArray(PropsKeys.WEB_SERVER_SERVLET_ACCEPT_RANGES_MIME_TYPES);

public static final boolean WEB_SERVER_SERVLET_DIRECTORY_INDEXING_ENABLED = GetterUtil.getBoolean(PropsUtil.get(PropsKeys.WEB_SERVER_SERVLET_DIRECTORY_INDEXING_ENABLED));

public static final boolean WEB_SERVER_SERVLET_HTTP_STATUS_CODE_STRICT = GetterUtil.getBoolean(PropsUtil.get(PropsKeys.WEB_SERVER_SERVLET_HTTP_STATUS_CODE_STRICT));
Expand Down
71 changes: 53 additions & 18 deletions portal-impl/src/com/liferay/portal/webserver/WebServerServlet.java
Expand Up @@ -42,6 +42,7 @@
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.ReleaseInfo;
import com.liferay.portal.kernel.util.SetUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
Expand Down Expand Up @@ -107,6 +108,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
Expand Down Expand Up @@ -639,6 +641,10 @@ else if (imageId == dlFileEntry.getSmallImageId()) {
return false;
}

protected boolean isSupportsRangeHeader(String contentType) {
return _acceptRangesMimeTypes.contains(contentType);
}

protected void processPrincipalException(
Throwable t, User user, HttpServletRequest request,
HttpServletResponse response)
Expand Down Expand Up @@ -968,7 +974,50 @@ else if ((videoThumbnail > 0) && (videoThumbnail <= 3)) {
contentType = fileVersion.getMimeType();
}

// Support range HTTP header
if (_log.isDebugEnabled()) {
_log.debug("Content type set to " + contentType);
}

// Send file

if (isSupportsRangeHeader(contentType)) {
sendFileWithRangeHeader(
request, response, fileName, inputStream, contentLength,
contentType);
}
else {
ServletResponseUtil.sendFile(
request, response, fileName, inputStream, contentLength,
contentType);
}
}

protected void sendFile(
HttpServletResponse response, User user, long groupId,
long folderId, String title)
throws Exception {

FileEntry fileEntry = DLAppServiceUtil.getFileEntry(
groupId, folderId, title);

String contentType = fileEntry.getMimeType();

response.setContentType(contentType);

InputStream inputStream = fileEntry.getContentStream();

ServletResponseUtil.write(response, inputStream);
}

protected void sendFileWithRangeHeader(
HttpServletRequest request, HttpServletResponse response,
String fileName, InputStream inputStream, long contentLength,
String contentType)
throws IOException {

if (_log.isDebugEnabled()) {
_log.debug("Accepting ranges for the file " + fileName);
}

response.setHeader(
HttpHeaders.ACCEPT_RANGES, HttpHeaders.ACCEPT_RANGES_BYTES_VALUE);
Expand Down Expand Up @@ -1011,23 +1060,6 @@ else if ((videoThumbnail > 0) && (videoThumbnail <= 3)) {
}
}

protected void sendFile(
HttpServletResponse response, User user, long groupId,
long folderId, String title)
throws Exception {

FileEntry fileEntry = DLAppServiceUtil.getFileEntry(
groupId, folderId, title);

String contentType = fileEntry.getMimeType();

response.setContentType(contentType);

InputStream inputStream = fileEntry.getContentStream();

ServletResponseUtil.write(response, inputStream);
}

protected void sendGroups(
HttpServletResponse response, User user, String path)
throws Exception {
Expand Down Expand Up @@ -1244,6 +1276,9 @@ private static User _getUser(HttpServletRequest request) throws Exception {

private static Log _log = LogFactoryUtil.getLog(WebServerServlet.class);

private static Set<String> _acceptRangesMimeTypes = SetUtil.fromArray(
PropsValues.WEB_SERVER_SERVLET_ACCEPT_RANGES_MIME_TYPES);

private static Format _dateFormat =
FastDateFormatFactoryUtil.getSimpleDateFormat(_DATE_FORMAT_PATTERN);

Expand Down
12 changes: 12 additions & 0 deletions portal-impl/src/portal.properties
Expand Up @@ -7288,6 +7288,12 @@
## Web Server Servlet
##

#
# Set this to a comma-delimited list of MIME types to send an Accept-Ranges
# header.
#
web.server.servlet.accept.ranges.mime.types=audio/basic,audio/mid,audio/midi,audio/mod,audio/mp3,audio/mpeg,audio/mpeg3,audio/ogg,audio/vorbis,audio/wav,audio/x-mid,audio/x-midi,audio/x-mod,audio/x-mpeg,audio/x-pn-realaudio,audio/x-realaudio,audio/x-wav,video/avi,video/mp4,video/mpeg,video/ogg,video/quicktime,video/x-flv,video/x-m4v,video/x-ms-wmv,video/x-msvideo

#
# Set this property to true to enable directory indexing.
#
Expand All @@ -7300,6 +7306,12 @@
#
web.server.servlet.http.status.code.strict=true

#
# Set the maximum range fields that are allowed to be requested by a
# browser.
#
web.server.servlet.max.range.fields=10

#
# Set the level of verbosity to use in the server information line printed
# by the web server servlet. Valid values are "full", which gives all of the
Expand Down
@@ -0,0 +1,96 @@
/**
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/

package com.liferay.portal.webserver;

import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.util.TestPropsValues;
import com.liferay.portal.util.WebKeys;
import com.liferay.portlet.documentlibrary.service.BaseDLAppTestCase;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServlet;

import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;

/**
* @author Alexander Chow
*/
public abstract class BaseWebServerTestCase extends BaseDLAppTestCase {

public MockHttpServletResponse service(
String method, String path, Map<String, String> headers,
byte[] data)
throws Exception {

MockHttpServletResponse response = new MockHttpServletResponse();

response.setCharacterEncoding(StringPool.UTF8);

if (headers == null) {
headers = new HashMap<String, String>();
}

String requestURI =
_CONTEXT_PATH + _SERVLET_PATH + _PATH_INFO_PREFACE + path;

MockHttpServletRequest request = new MockHttpServletRequest(
method, requestURI);

request.setAttribute(WebKeys.USER, TestPropsValues.getUser());
request.setContextPath(_CONTEXT_PATH);
request.setServletPath(_SERVLET_PATH);
request.setPathInfo(_PATH_INFO_PREFACE + path);

if (data != null) {
request.setContent(data);

String contentType = headers.remove(HttpHeaders.CONTENT_TYPE);

if (contentType != null) {
request.setContentType(contentType);
}
else {
request.setContentType(ContentTypes.TEXT_PLAIN);
}
}

for (Map.Entry<String, String> entry : headers.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();

request.addHeader(key, value);
}

getServlet().service(request, response);

return response;
}

protected HttpServlet getServlet() {
return new WebServerServlet();
}

private static final String _CONTEXT_PATH = "/documents";

private static final String _PATH_INFO_PREFACE = "";

private static final String _SERVLET_PATH = "";

}

0 comments on commit 6abceaf

Please sign in to comment.