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