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