1
14
15 package com.liferay.portal.servlet.filters.etag;
16
17 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
18 import com.liferay.portal.kernel.servlet.HttpHeaders;
19 import com.liferay.portal.kernel.servlet.StringServletResponse;
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 return _processETag(
37 request, response, _hashCode(bytes, 0, bytes.length));
38 }
39
40 public static boolean processETag(
41 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
42 int length) {
43
44 return _processETag(request, response, _hashCode(bytes, 0, length));
45 }
46
47 public static boolean processETag(
48 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
49 int offset, int length) {
50
51 return _processETag(
52 request, response, _hashCode(bytes, offset, length));
53 }
54
55 public static boolean processETag(
56 HttpServletRequest request, HttpServletResponse response, String s) {
57
58 return _processETag(request, response, s.hashCode());
59 }
60
61 public static boolean processETag(
62 HttpServletRequest request, HttpServletResponse response,
63 StringServletResponse stringResponse) {
64
65 if (stringResponse.isCalledGetOutputStream()) {
66 UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
67 stringResponse.getUnsyncByteArrayOutputStream();
68
69 return processETag(
70 request, response,
71 unsyncByteArrayOutputStream.unsafeGetByteArray(),
72 unsyncByteArrayOutputStream.size());
73 }
74 else {
75 return processETag(request, response, stringResponse.getString());
76 }
77 }
78
79 private static int _hashCode(byte[] data, int offset, int length) {
80 int hashCode = 0;
81
82 for (int i = 0; i < length; i++) {
83 hashCode = 31 * hashCode + data[offset++];
84 }
85
86 return hashCode;
87 }
88
89 private static boolean _processETag(
90 HttpServletRequest request, HttpServletResponse response,
91 int hashCode) {
92
93 String eTag = Integer.toHexString(hashCode);
94
95 response.setHeader(HttpHeaders.ETAG, eTag);
96
97 String ifNoneMatch = request.getHeader(HttpHeaders.IF_NONE_MATCH);
98
99 if (eTag.equals(ifNoneMatch)) {
100 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
101 response.setContentLength(0);
102
103 return true;
104 }
105 else {
106 return false;
107 }
108 }
109
110 }