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
36 corrections = new HashMap<Byte,Byte>();
37 corrections.put((byte)0x0C, (byte)10); // << Flash Player 10.3
38 corrections.put((byte)0x0E, (byte)11); // << Flash Player 11.1
39 corrections.put((byte)0x0F, (byte)11); // << Flash Player 11.2
41 pattern = Pattern.compile("([^/\\\\:<>?\"]+?)(?:\\.swf)?$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
46 * Processes requests for both HTTP
47 * <code>GET</code> and
48 * <code>POST</code> methods.
50 * @param request servlet request
51 * @param response servlet response
52 * @throws ServletException if a servlet-specific error occurs
53 * @throws IOException if an I/O error occurs
55 protected void processRequest(
56 HttpServletRequest request,
57 HttpServletResponse response
63 response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
68 * <code>GET</code> method.
70 * @param request servlet request
71 * @param response servlet response
72 * @throws ServletException if a servlet-specific error occurs
73 * @throws IOException if an I/O error occurs
77 HttpServletRequest request,
78 HttpServletResponse response
84 response.setContentType("text/html;charset=UTF-8");
85 PrintWriter out = response.getWriter();
88 out.println("<html>");
89 out.println("<head>");
90 out.println("<title>Fix-Swf</title>");
91 out.println("</head>");
92 out.println("<body>");
93 if (request.getAttribute(MESSAGE_ATTRIBUTE) != null)
95 out.println("<h1>Upload-Results</h1>");
96 out.println("<p>" + StringEscapeUtils.escapeHtml((String)request.getAttribute(MESSAGE_ATTRIBUTE)) + "</p>");
98 out.println("<h1>Choose SWF-File to check/fix</h1>");
99 out.println("<p>If the file has to be fixed, the fixed version will be presented to you as a download immediately.</p>");
100 out.println("<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">");
101 out.println("<input type=\"file\" name=\"swf\" />");
102 out.println("<input type=\"submit\" name=\"submit\" value=\"Start Upload\" />");
103 out.println("</form>");
104 out.println("</body>");
105 out.println("</html>");
115 * <code>POST</code> method.
117 * @param request servlet request
118 * @param response servlet response
119 * @throws ServletException if a servlet-specific error occurs
120 * @throws IOException if an I/O error occurs
123 protected void doPost(
124 HttpServletRequest request,
125 HttpServletResponse response
131 // Check that we have a file upload request
132 if (!ServletFileUpload.isMultipartContent(request))
134 request.setAttribute(MESSAGE_ATTRIBUTE, "No data uploaded!");
135 request.getRequestDispatcher("/").forward(request, response);
139 // Create a new file upload handler
140 ServletFileUpload upload = new ServletFileUpload();
145 FileItemIterator iter = upload.getItemIterator(request);
147 while(iter.hasNext())
149 FileItemStream item = iter.next();
151 if (item.isFormField())
154 if (!item.getFieldName().equals("swf"))
157 String filename = item.getName();
158 InputStream in = item.openStream();
159 byte[] buffer = new byte[512];
165 request.setAttribute(MESSAGE_ATTRIBUTE, "Not enough data uploaded!");
166 request.getRequestDispatcher("/").forward(request, response);
170 if (!corrections.containsKey(buffer[3]))
172 request.setAttribute(MESSAGE_ATTRIBUTE, "Uploaded SWF-file " + filename + " was valid!");
173 request.getRequestDispatcher("/").forward(request, response);
177 /** Correct the Flash-Player-Version in Header-Byte 4 */
178 buffer[3] = corrections.get(buffer[3]);
180 Matcher matcher = pattern.matcher(filename);
181 if (matcher.matches())
183 filename = matcher.group(1) + "_FIXED.swf";
187 filename = "FIXED.swf";
190 response.setHeader("Content-Type", "application/x-shockwave-flash");
191 response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");
192 OutputStream out = response.getOutputStream();
195 out.write(buffer, 0, i);
197 while ((i = in.read(buffer)) > -1);
204 request.setAttribute(MESSAGE_ATTRIBUTE, "Error while parsing upload: " + e);
205 request.getRequestDispatcher("/").forward(request, response);
209 /** Fallback, if no data was found (happens when forwarding!) */
210 doGet(request, response);
214 * Returns a short description of the servlet.
216 * @return a String containing servlet description
219 public String getServletInfo() {
220 return "This Servlet fixes the 4th byte of an uploaded SWF-file according to the SWF-filestructre specification.";