1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.filters;
35
36 import info.magnolia.cms.beans.config.MIMEMapping;
37 import info.magnolia.cms.core.AggregationState;
38 import info.magnolia.context.MgnlContext;
39
40 import java.io.IOException;
41 import java.io.UnsupportedEncodingException;
42 import java.net.URLDecoder;
43
44 import javax.servlet.FilterChain;
45 import javax.servlet.ServletException;
46 import javax.servlet.http.HttpServletRequest;
47 import javax.servlet.http.HttpServletResponse;
48
49 import org.apache.commons.lang.StringUtils;
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 public class ContentTypeFilter extends AbstractMgnlFilter {
65
66 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ContentTypeFilter.class);
67
68
69
70
71 private static final String AGGREGATION_STATE_INITIALIZED = ContentTypeFilter.class.getName() + ".aggregationStateInitialized";
72
73 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
74
75
76 if(request.getAttribute(AGGREGATION_STATE_INITIALIZED) != null){
77 MgnlContext.resetAggregationState();
78 }
79 else{
80 request.setAttribute(AGGREGATION_STATE_INITIALIZED, Boolean.TRUE);
81 }
82
83 final String originalUri = request.getRequestURI();
84 final String ext = getUriExtension(originalUri);
85 StringBuffer url = request.getRequestURL();
86 String query = request.getQueryString();
87 if (!StringUtils.isEmpty(query))
88 {
89 url.append("?").append(query);
90 }
91
92 final String characterEncoding = setupContentTypeAndCharacterEncoding(ext, request, response);
93 final AggregationState aggregationState = MgnlContext.getAggregationState();
94 aggregationState.setCharacterEncoding(characterEncoding);
95
96 aggregationState.setOriginalURI(URLDecoder.decode(originalUri, characterEncoding));
97 aggregationState.setOriginalURL(URLDecoder.decode(url.toString(), characterEncoding));
98 aggregationState.setOriginalBrowserURI(originalUri);
99 aggregationState.setOriginalBrowserURL(url.toString());
100 aggregationState.setExtension(ext);
101
102 chain.doFilter(request, response);
103 }
104
105
106 protected String getUriExtension(String originalUri) {
107 final String fileName = StringUtils.substringAfterLast(originalUri, "/");
108 return StringUtils.substringAfterLast(fileName, ".");
109 }
110
111 protected String setupContentTypeAndCharacterEncoding(String extension, HttpServletRequest req, HttpServletResponse resp) {
112 final String mimeType = MIMEMapping.getMIMETypeOrDefault(extension);
113 final String characterEncoding = MIMEMapping.getContentEncodingOrDefault(mimeType);
114
115 try {
116
117 if (req.getCharacterEncoding() == null) {
118 req.setCharacterEncoding(characterEncoding);
119 }
120 } catch (UnsupportedEncodingException e) {
121 log.error("Can't set character encoding for the request (extension=" + extension + ",mimetype=" + mimeType + ")", e);
122 }
123
124 resp.setContentType(mimeType);
125 resp.setCharacterEncoding(characterEncoding);
126
127 return characterEncoding;
128 }
129
130 }