package org.ovirt.engine.core.services; import java.io.IOException; import java.net.URLDecoder; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringEscapeUtils; public class GetAttachmentServlet extends HttpServlet { private static final long serialVersionUID = 8496520437603585173L; private static final String ENCODINGTYPE_BINARY = "binary"; private static final Object ENCODINGTYPE_PLAIN = "plain"; /** * A list of regular expressions containing the acceptable values for the content type. Currently the only * acceptable content types for this servlet are @{code application/x-virt-viewer} and @{code application/rdp}, * refrain from adding new content types unless strictly necessary. */ private static final List<Pattern> ACCEPTABLE_CONTENT_TYPES = Arrays.asList( Pattern.compile("^application/(x-virt-viewer|rdp)(;.*)?$", Pattern.CASE_INSENSITIVE) ); /** * Checks if the given content type is acceptable. */ private static boolean isAcceptableContentType(String contentType) { if (contentType == null) { return false; } for (Pattern acceptableContentType : ACCEPTABLE_CONTENT_TYPES) { if (acceptableContentType.matcher(contentType).matches()) { return true; } } return false; } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String contentType = request.getParameter("contenttype"); Boolean cache = Boolean.parseBoolean(request.getParameter("cache")); String encodingType = request.getParameter("encodingtype"); String content = request.getParameter("content"); // Check if the content type is acceptable, and copy it to the request: if (!isAcceptableContentType(contentType)) { throw new ServletException(String.format("Unsupported content type '%s'", contentType)); } response.setContentType(contentType); if (!cache) { response.setHeader("Cache-Control", "max-age=0, must-revalidate"); //disable caching HTTP/1.1 response.setHeader("Expires", "Sat, 26 Jul 1997 05:00:00 GMT"); //disable caching HTTP/1.0 } if (content == null) { return; } if (ENCODINGTYPE_BINARY.equals(encodingType)) { response.getOutputStream().write(Base64.decodeBase64(content)); } else if (ENCODINGTYPE_PLAIN.equals(encodingType)) { content = URLDecoder.decode(content, "UTF-8"); content = StringEscapeUtils.unescapeHtml(content); response.getWriter().write(content); if (response.getWriter().checkError()) { throw new IOException("Error when writing to response stream"); } } else { throw new ServletException(String.format("Unsupported encoding type %s", encodingType)); } } }