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