001
014
015 package com.liferay.portal.servlet.filters.etag;
016
017 import com.liferay.portal.kernel.servlet.ByteBufferServletResponse;
018 import com.liferay.portal.kernel.servlet.HttpHeaders;
019 import com.liferay.portal.kernel.util.StringPool;
020 import com.liferay.portal.kernel.util.StringUtil;
021
022 import java.nio.ByteBuffer;
023
024 import javax.servlet.http.HttpServletRequest;
025 import javax.servlet.http.HttpServletResponse;
026
027
031 public class ETagUtil {
032
033 public static boolean processETag(
034 HttpServletRequest request, HttpServletResponse response,
035 byte[] bytes) {
036
037 return _processETag(
038 request, response, _hashCode(bytes, 0, bytes.length));
039 }
040
041 public static boolean processETag(
042 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
043 int length) {
044
045 return _processETag(request, response, _hashCode(bytes, 0, length));
046 }
047
048 public static boolean processETag(
049 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
050 int offset, int length) {
051
052 return _processETag(
053 request, response, _hashCode(bytes, offset, length));
054 }
055
056 public static boolean processETag(
057 HttpServletRequest request, HttpServletResponse response,
058 ByteBufferServletResponse byteBufferResponse) {
059
060 ByteBuffer byteBuffer = byteBufferResponse.getByteBuffer();
061
062 return processETag(
063 request, response, byteBuffer.array(), byteBuffer.position(),
064 byteBuffer.limit());
065 }
066
067 public static boolean processETag(
068 HttpServletRequest request, HttpServletResponse response, String s) {
069
070 return _processETag(request, response, s.hashCode());
071 }
072
073 private static int _hashCode(byte[] data, int offset, int length) {
074 int hashCode = 0;
075
076 for (int i = 0; i < length; i++) {
077 hashCode = 31 * hashCode + data[offset++];
078 }
079
080 return hashCode;
081 }
082
083 private static boolean _processETag(
084 HttpServletRequest request, HttpServletResponse response,
085 int hashCode) {
086
087 String eTag = StringPool.QUOTE.concat(
088 StringUtil.toHexString(hashCode)).concat(StringPool.QUOTE);
089
090 response.setHeader(HttpHeaders.ETAG, eTag);
091
092 String ifNoneMatch = request.getHeader(HttpHeaders.IF_NONE_MATCH);
093
094 if (eTag.equals(ifNoneMatch)) {
095 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
096 response.setContentLength(0);
097
098 return true;
099 }
100 else {
101 return false;
102 }
103 }
104
105 }