1 package de.juplo.fixswf;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.io.PrintWriter;
7 import java.util.HashMap;
9 import java.util.regex.Matcher;
10 import java.util.regex.Pattern;
11 import javax.servlet.ServletConfig;
12 import javax.servlet.ServletException;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import org.apache.commons.fileupload.FileItemIterator;
17 import org.apache.commons.fileupload.FileItemStream;
18 import org.apache.commons.fileupload.servlet.ServletFileUpload;
19 import org.apache.commons.lang.StringEscapeUtils;
25 public class FixSwfServlet extends HttpServlet
27 public final String MESSAGE_ATTRIBUTE = getClass().getCanonicalName() + ".MESSAGE";
29 private Map<Byte,Byte> corrections;
30 private Pattern pattern;
34 public void init(ServletConfig config) throws ServletException {
35 corrections = new HashMap<Byte,Byte>();
36 corrections.put((byte)12, (byte)10);
37 corrections.put((byte)14, (byte)11);
38 pattern = Pattern.compile("([^/\\\\:<>?\"]+?)(?:\\.swf)?$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
43 * Processes requests for both HTTP
44 * <code>GET</code> and
45 * <code>POST</code> methods.
47 * @param request servlet request
48 * @param response servlet response
49 * @throws ServletException if a servlet-specific error occurs
50 * @throws IOException if an I/O error occurs
52 protected void processRequest(
53 HttpServletRequest request,
54 HttpServletResponse response
60 response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
65 * <code>GET</code> method.
67 * @param request servlet request
68 * @param response servlet response
69 * @throws ServletException if a servlet-specific error occurs
70 * @throws IOException if an I/O error occurs
74 HttpServletRequest request,
75 HttpServletResponse response
81 response.setContentType("text/html;charset=UTF-8");
82 PrintWriter out = response.getWriter();
85 out.println("<html>");
86 out.println("<head>");
87 out.println("<title>Fix-Swf</title>");
88 out.println("</head>");
89 out.println("<body>");
90 if (request.getAttribute(MESSAGE_ATTRIBUTE) != null)
92 out.println("<h1>Upload-Results</h1>");
93 out.println("<p>" + StringEscapeUtils.escapeHtml((String)request.getAttribute(MESSAGE_ATTRIBUTE)) + "</p>");
95 out.println("<h1>Choose SWF-File to check/fix</h1>");
96 out.println("<p>If the file has to be fixed, the fixed version will be presented to you as a download.</p>");
97 out.println("<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">");
98 out.println("<input type=\"file\" name=\"swf\" />");
99 out.println("<input type=\"submit\" name=\"submit\" value=\"Start Upload\" />");
100 out.println("</form>");
101 out.println("</body>");
102 out.println("</html>");
112 * <code>POST</code> method.
114 * @param request servlet request
115 * @param response servlet response
116 * @throws ServletException if a servlet-specific error occurs
117 * @throws IOException if an I/O error occurs
120 protected void doPost(
121 HttpServletRequest request,
122 HttpServletResponse response
128 // Check that we have a file upload request
129 if (!ServletFileUpload.isMultipartContent(request))
131 request.setAttribute(MESSAGE_ATTRIBUTE, "No data uploaded!");
132 request.getRequestDispatcher("/").forward(request, response);
136 // Create a new file upload handler
137 ServletFileUpload upload = new ServletFileUpload();
142 FileItemIterator iter = upload.getItemIterator(request);
144 while(iter.hasNext())
146 FileItemStream item = iter.next();
148 if (item.isFormField())
151 if (!item.getFieldName().equals("swf"))
154 String filename = item.getName();
155 InputStream in = item.openStream();
156 byte[] buffer = new byte[512];
162 request.setAttribute(MESSAGE_ATTRIBUTE, "Not enough data uploaded!");
163 request.getRequestDispatcher("/").forward(request, response);
167 if (!corrections.containsKey(buffer[3]))
169 request.setAttribute(MESSAGE_ATTRIBUTE, "Uploaded SWF-file " + filename + " was valid!");
170 request.getRequestDispatcher("/").forward(request, response);
174 /** Correct the Flash-Player-Version in Header-Byte 4 */
175 buffer[3] = corrections.get(buffer[3]);
177 Matcher matcher = pattern.matcher(filename);
178 if (matcher.matches())
180 filename = matcher.group(1) + "_FIXED.swf";
184 filename = "FIXED.swf";
187 response.setHeader("Content-Type", "application/x-shockwave-flash");
188 response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");
189 OutputStream out = response.getOutputStream();
192 out.write(buffer, 0, i);
194 while ((i = in.read(buffer)) > -1);
201 request.setAttribute(MESSAGE_ATTRIBUTE, "Error while parsing upload: " + e);
202 request.getRequestDispatcher("/").forward(request, response);
206 /** Fallback, if no data was found (happens when forwarding!) */
207 doGet(request, response);
211 * Returns a short description of the servlet.
213 * @return a String containing servlet description
216 public String getServletInfo() {
217 return "This Servlet fixes the 4th byte of an uploaded SWF-file according to the SWF-filestructre specification.";