1
22
23 package com.liferay.portal.servlet.filters.gzip;
24
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.portlet.LiferayWindowState;
28 import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
29 import com.liferay.portal.kernel.util.HttpUtil;
30 import com.liferay.portal.kernel.util.JavaConstants;
31 import com.liferay.portal.kernel.util.ParamUtil;
32 import com.liferay.portal.kernel.util.ServerDetector;
33 import com.liferay.portal.servlet.filters.BasePortalFilter;
34
35 import javax.servlet.FilterChain;
36 import javax.servlet.http.HttpServletRequest;
37 import javax.servlet.http.HttpServletResponse;
38
39
46 public class GZipFilter extends BasePortalFilter {
47
48 public static final String SKIP_FILTER =
49 GZipFilter.class.getName() + "SKIP_FILTER";
50
51 public GZipFilter() {
52
53
56 if (super.isFilterEnabled()) {
57 if (ServerDetector.isJBoss() || ServerDetector.isJetty() ||
58 ServerDetector.isJOnAS() || ServerDetector.isOC4J() ||
59 ServerDetector.isOrion() || ServerDetector.isTomcat()) {
60
61 _filterEnabled = true;
62 }
63 else {
64 _filterEnabled = false;
65 }
66 }
67 }
68
69 protected boolean isAlreadyFiltered(HttpServletRequest request) {
70 if (request.getAttribute(SKIP_FILTER) != null) {
71 return true;
72 }
73 else {
74 return false;
75 }
76 }
77
78 protected boolean isCompress(HttpServletRequest request) {
79 if (!ParamUtil.get(request, _COMPRESS, true)) {
80 return false;
81 }
82 else {
83
84
88 String lifecycle = ParamUtil.getString(request, "p_p_lifecycle");
89
90 if ((lifecycle.equals("1") &&
91 LiferayWindowState.isExclusive(request)) ||
92 lifecycle.equals("2")) {
93
94 return false;
95 }
96 else {
97 return true;
98 }
99 }
100 }
101
102 protected boolean isFilterEnabled() {
103 return _filterEnabled;
104 }
105
106 protected boolean isInclude(HttpServletRequest request) {
107 String uri = (String)request.getAttribute(
108 JavaConstants.JAVAX_SERVLET_INCLUDE_REQUEST_URI);
109
110 if (uri == null) {
111 return false;
112 }
113 else {
114 return true;
115 }
116 }
117
118 protected void processFilter(
119 HttpServletRequest request, HttpServletResponse response,
120 FilterChain filterChain)
121 throws Exception {
122
123 if (isCompress(request) && !isInclude(request) &&
124 BrowserSnifferUtil.acceptsGzip(request) &&
125 !isAlreadyFiltered(request)) {
126
127 if (_log.isDebugEnabled()) {
128 String completeURL = HttpUtil.getCompleteURL(request);
129
130 _log.debug("Compressing " + completeURL);
131 }
132
133 request.setAttribute(SKIP_FILTER, Boolean.TRUE);
134
135 GZipResponse gZipResponse = new GZipResponse(response);
136
137 processFilter(GZipFilter.class, request, gZipResponse, filterChain);
138
139 gZipResponse.finishResponse();
140 }
141 else {
142 if (_log.isDebugEnabled()) {
143 String completeURL = HttpUtil.getCompleteURL(request);
144
145 _log.debug("Not compressing " + completeURL);
146 }
147
148 processFilter(
149 GZipFilter.class, request, response, filterChain);
150 }
151 }
152
153 private static final String _COMPRESS = "compress";
154
155 private static Log _log = LogFactoryUtil.getLog(GZipFilter.class);
156
157 private boolean _filterEnabled;
158
159 }