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.runtime.Document;
37 import info.magnolia.cms.beans.runtime.MultipartForm;
38 import info.magnolia.cms.core.Path;
39 import info.magnolia.context.MgnlContext;
40
41 import java.io.IOException;
42 import java.util.Enumeration;
43 import java.util.Iterator;
44
45 import javax.servlet.FilterChain;
46 import javax.servlet.ServletException;
47 import javax.servlet.http.HttpServletRequest;
48 import javax.servlet.http.HttpServletResponse;
49
50 import org.apache.commons.lang3.StringUtils;
51
52 import com.oreilly.servlet.MultipartRequest;
53
54
55
56
57 public class CosMultipartRequestFilter extends OncePerRequestAbstractMgnlFilter {
58
59
60
61
62 private static final int MAX_FILE_SIZE = 2000000000;
63
64 @Override
65 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
66 throws IOException, ServletException {
67
68 String type = null;
69 String type1 = request.getHeader("Content-Type");
70 String type2 = request.getContentType();
71 if (type1 == null && type2 != null) {
72 type = type2;
73 }
74 else if (type2 == null && type1 != null) {
75 type = type1;
76 }
77 else if (type1 != null) {
78 type = (type1.length() > type2.length() ? type1 : type2);
79 }
80 boolean isMultipart = (type != null) && type.toLowerCase().startsWith("multipart/form-data");
81 MultipartForm mpf = null;
82 try{
83 if (isMultipart) {
84 mpf = parseParameters(request);
85 request = new MultipartRequestWrapper(request, mpf);
86 MgnlContext.push(request, response);
87 }
88 try {
89 chain.doFilter(request, response);
90 } finally {
91 if (isMultipart) {
92 MgnlContext.pop();
93 }
94 }
95 } finally {
96 if (mpf != null) {
97 Iterator<Document> keys = mpf.getDocuments().values().iterator();
98 while (keys.hasNext()) {
99 Document doc = keys.next();
100 if (doc != null && doc.getFile() != null && doc.getFile().exists()) {
101 doc.delete();
102 }
103 }
104 }
105 }
106 }
107
108
109
110
111
112 private static MultipartForm parseParameters(HttpServletRequest request) throws IOException {
113 MultipartForm form = new MultipartForm();
114 String encoding = StringUtils.defaultString(request.getCharacterEncoding(), "UTF-8");
115 MultipartRequest multi = new MultipartRequest(
116 request,
117 Path.getTempDirectoryPath(),
118 MAX_FILE_SIZE,
119 encoding,
120 null);
121 Enumeration params = multi.getParameterNames();
122 while (params.hasMoreElements()) {
123 String name = (String) params.nextElement();
124 String value = multi.getParameter(name);
125 form.addParameter(name, value);
126 String[] s = multi.getParameterValues(name);
127 if (s != null) {
128 form.addparameterValues(name, s);
129 }
130 }
131 Enumeration files = multi.getFileNames();
132 while (files.hasMoreElements()) {
133 String name = (String) files.nextElement();
134 form.addDocument(name, multi.getFilesystemName(name), multi.getContentType(name), multi.getFile(name));
135 }
136 request.setAttribute(MultipartForm.REQUEST_ATTRIBUTE_NAME, form);
137 return form;
138 }
139 }