package org.stagemonitor.web.monitor.servlet; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.stagemonitor.util.IOUtils; import org.stagemonitor.util.StringUtils; import org.stagemonitor.web.monitor.rum.BoomerangJsHtmlInjector; public class StagemonitorFileServlet extends HttpServlet { private final List<String> filesToCacheForever; public StagemonitorFileServlet() { this(Collections.singletonList(BoomerangJsHtmlInjector.BOOMERANG_FILENAME)); } public StagemonitorFileServlet(List<String> filesToCacheForever) { this.filesToCacheForever = filesToCacheForever; } @Override public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String requestURI = req.getRequestURI().substring(req.getContextPath().length()).replace("..", ""); setResponseHeaders(req, res, requestURI); InputStream inputStream = null; try { inputStream = getClass().getClassLoader().getResourceAsStream(StringUtils.removeStart(requestURI, "/")); if (inputStream == null) { res.sendError(HttpServletResponse.SC_NOT_FOUND); return; } IOUtils.copy(inputStream, res.getOutputStream()); res.getOutputStream().flush(); res.flushBuffer(); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (IOException ioe) { // ignore } } } private void setResponseHeaders(HttpServletRequest req, HttpServletResponse res, String requestURI) { res.setContentType(getMimeType(requestURI)); for (String file : filesToCacheForever) { if (req.getRequestURI().endsWith(file)) { res.setHeader("cache-control", "public, max-age=315360000"); break; } } } private String getMimeType(String path) { String mimeType = getServletContext().getMimeType(path); if (mimeType == null) { mimeType = "application/octet-stream"; } return mimeType; } }