1
14
15 package com.liferay.portal.servlet.filters.etag;
16
17 import com.liferay.portal.kernel.servlet.HttpHeaders;
18 import com.liferay.portal.kernel.util.GetterUtil;
19 import com.liferay.portal.util.PropsUtil;
20
21 import javax.servlet.http.HttpServletRequest;
22 import javax.servlet.http.HttpServletResponse;
23
24
30 public class ETagUtil {
31
32 public static boolean processETag(
33 HttpServletRequest request, HttpServletResponse response,
34 byte[] bytes) {
35
36 if (!_ETAG_FILTER_ENABLED) {
37 return false;
38 }
39
40 return _processETag(
41 request, response, _hashCode(bytes, 0, bytes.length));
42 }
43
44 public static boolean processETag(
45 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
46 int length) {
47
48 if (!_ETAG_FILTER_ENABLED) {
49 return false;
50 }
51
52 return _processETag(request, response, _hashCode(bytes, 0, length));
53 }
54
55 public static boolean processETag(
56 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
57 int offset, int length) {
58
59 if (!_ETAG_FILTER_ENABLED) {
60 return false;
61 }
62
63 return _processETag(
64 request, response, _hashCode(bytes, offset, length));
65 }
66
67 public static boolean processETag(
68 HttpServletRequest request, HttpServletResponse response, String s) {
69
70 if (!_ETAG_FILTER_ENABLED) {
71 return false;
72 }
73
74 return _processETag(request, response, s.hashCode());
75 }
76
77 private static int _hashCode(byte[] data, int offset, int length) {
78 int hashCode = 0;
79
80 for (int i = 0; i < length; i++) {
81 hashCode = 31 * hashCode + data[offset++];
82 }
83
84 return hashCode;
85 }
86
87 private static boolean _processETag(
88 HttpServletRequest request, HttpServletResponse response,
89 int hashCode) {
90
91 if (!_ETAG_FILTER_ENABLED) {
92 return false;
93 }
94
95 String eTag = Integer.toHexString(hashCode);
96
97 response.setHeader(HttpHeaders.ETAG, eTag);
98
99 String ifNoneMatch = request.getHeader(HttpHeaders.IF_NONE_MATCH);
100
101 if (eTag.equals(ifNoneMatch)) {
102 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
103 response.setContentLength(0);
104
105 return true;
106 }
107 else {
108 return false;
109 }
110 }
111
112 private static final boolean _ETAG_FILTER_ENABLED = GetterUtil.getBoolean(
113 PropsUtil.get(ETagFilter.class.getName()), true);
114
115 }