@Override public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String pathInfo = request.getPathInfo(); try { // download.html if (pathInfo != null && pathInfo.startsWith("/download.html")) { // sending an HTML page helps debugging on IE, which often blocks or // otherwise fails to download directly String id = request.getParameter(ID_REQUEST_PARAM); String filename = request.getParameter("filename"); String linkTarget = "../download/" + (filename != null ? filename : "polymap3_export.tmp") + "?" + ID_REQUEST_PARAM + "=" + id; response.setContentType("text/html; charset=ISO-8859-1"); PrintWriter out = response.getWriter(); out.println("<html><head>"); out.println("<meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=" + linkTarget + "\">"); out.println("</head>"); out.println("<a href=\"" + linkTarget + "\">Download starten</a>"); out.println("</html>"); out.flush(); } // download else { String id = request.getParameter(ID_REQUEST_PARAM); log.info("Request: id=" + id); if (id == null) { log.warn("No 'id' param in request."); response.sendError(404); return; } ContentProvider provider = providers.get(id); if (provider == null) { log.warn("No content provider registered for id: " + id); response.sendError(404); return; } // String[] pathInfos = StringUtils.split( request.getPathInfo(), "/" ); String contentType = provider.getContentType(); response.setContentType(contentType); // display any HTML content in browser instead of downloading it if (contentType != null && !contentType.toLowerCase().contains("html")) { response.setHeader( "Content-disposition", "attachment; filename=" + provider.getFilename()); } response.setHeader("Pragma", "public"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); response.setHeader("Cache-Control", "public"); response.setHeader("Expires", "0"); InputStream in = provider.getInputStream(); ServletOutputStream out = response.getOutputStream(); boolean providerDone = false; try { IOUtils.copy(in, out); out.flush(); response.flushBuffer(); providerDone = provider.done(true); } catch (Exception e) { providerDone = provider.done(false); } finally { IOUtils.closeQuietly(in); } if (providerDone) { providers.remove(id); } } } catch (Exception e) { log.debug("", e); throw new ServletException(e); } }