Author: michiel Date: 2009-09-24 19:12:41 +0200 (Thu, 24 Sep 2009) New Revision: 38847
Modified: mmbase/trunk/applications/resources/src/main/java/org/mmbase/servlet/FileServlet.java Log: split up in a few functions, override #getHead Modified: mmbase/trunk/applications/resources/src/main/java/org/mmbase/servlet/FileServlet.java =================================================================== --- mmbase/trunk/applications/resources/src/main/java/org/mmbase/servlet/FileServlet.java 2009-09-24 16:07:51 UTC (rev 38846) +++ mmbase/trunk/applications/resources/src/main/java/org/mmbase/servlet/FileServlet.java 2009-09-24 17:12:41 UTC (rev 38847) @@ -224,36 +224,80 @@ } } - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + protected File checkFile(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String pi = req.getPathInfo(); if (ignores(pi)) { resp.sendError(HttpServletResponse.SC_FORBIDDEN, "The file '" + pi + "' is explicitely ignored by the file servlet."); - return; + return null; } File file = getFile(pi, resp); if (! file.exists()) { resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The file '" + pi + "' does not exist"); log.debug("" + file + " does not exist"); - return; + return null; } if (! canRead(req, file)) { resp.sendError(HttpServletResponse.SC_FORBIDDEN, "The file '" + pi + "' may not be read"); log.debug("" + file + " may not be read"); - return; + return null; } if (file.isDirectory()) { - listing(req, resp, file); - return; + if (! "true".equals(getInitParameter("listings"))) { + resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Directory listings are not enabled. (see web.xml)"); + return null; + } else { + if (pi == null || ! pi.endsWith("/")) { + resp.sendRedirect(req.getContextPath() + req.getServletPath() + (pi == null ? "" : pi) + "/"); + return null; + } + } } - resp.setContentType(getServletContext().getMimeType(file.getName())); - resp.setContentLength((int) file.length()); - if (metaFiles) { - for (Map.Entry<String, String> e : getMetaHeaders(file).entrySet()) { - resp.setHeader(e.getKey(), e.getValue()); + return file; + } + protected void setHeaders(HttpServletRequest req, HttpServletResponse resp, File file) throws ServletException, IOException { + if (file.isDirectory()) { + resp.setContentType("application/xhtml+xml"); // We hate IE anyways. + } else { + resp.setContentType(getServletContext().getMimeType(file.getName())); + resp.setContentLength((int) file.length()); + if (metaFiles) { + for (Map.Entry<String, String> e : getMetaHeaders(file).entrySet()) { + resp.setHeader(e.getKey(), e.getValue()); + } } } + } + + @Override + protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + File file = checkFile(req, resp); + if (file == null) { + return; + } + setHeaders(req, resp, file); + if (file.isDirectory()) { + byte [] bytes = getListingBytes(req, resp, file); + resp.setContentLength(bytes.length); + } + return; + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + File file = checkFile(req, resp); + if (file == null) { + return; + } + setHeaders(req, resp, file); + if (file.isDirectory()) { + listing(req, resp, file); + } else { + stream(req, resp, file); + } + } + + protected void stream(HttpServletRequest req, HttpServletResponse resp, File file) throws IOException { BufferedOutputStream out = new BufferedOutputStream(resp.getOutputStream()); BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); byte[] buf = new byte[1024]; @@ -266,89 +310,83 @@ out.close(); } - private static final FormatFileSize formatFileSize = new FormatFileSize(); private static final Xml XML = new Xml(); - protected void listing(HttpServletRequest req, HttpServletResponse resp, File directory) throws IOException { - if ("true".equals(getInitParameter("listings"))) { - resp.setContentType("application/xhtml+xml"); // We hate IE anyways. - StringBuilder result = new StringBuilder(); - result.append("<?xml version='1.0'?>\n"); - result.append("<html xmlns='http://www.w3.org/1999/xhtml'>"); - result.append("<head>"); - String pathInfo = req.getPathInfo(); - if (pathInfo == null || ! pathInfo.endsWith("/")) { - resp.sendRedirect(req.getContextPath() + req.getServletPath() + (pathInfo == null ? "" : pathInfo) + "/"); - return; - } - result.append("<title>Directory Listing For " + XML.transform(URL.transformBack(pathInfo)) + "</title>"); - result.append("<link rel='stylesheet' href='" + req.getContextPath() + "/mmbase/style/css/mmbase.css' type='text/css' />"); - result.append("</head>"); - result.append("<body class='filelisting'>"); - result.append("<h1>Directory Listing For " + XML.transform(URL.transformBack(pathInfo)) + "</h1>"); - String header = getInitParameter("header"); - if (header != null && ! "".equals(header)) { - File headerFile = new File(directory, header); - if (headerFile.canRead()) { - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(headerFile), "UTF-8")); - String line = in.readLine(); - while (line != null) { - result.append(line); - line = in.readLine(); - } - in.close(); + + protected byte[] getListingBytes(HttpServletRequest req, HttpServletResponse resp, File directory) throws IOException { + StringBuilder result = new StringBuilder(); + result.append("<?xml version='1.0'?>\n"); + result.append("<html xmlns='http://www.w3.org/1999/xhtml'>"); + result.append("<head>"); + String pathInfo = req.getPathInfo(); + result.append("<title>Directory Listing For " + XML.transform(URL.transformBack(pathInfo)) + "</title>"); + result.append("<link rel='stylesheet' href='" + req.getContextPath() + "/mmbase/style/css/mmbase.css' type='text/css' />"); + result.append("</head>"); + result.append("<body class='filelisting'>"); + result.append("<h1>Directory Listing For " + XML.transform(URL.transformBack(pathInfo)) + "</h1>"); + String header = getInitParameter("header"); + if (header != null && ! "".equals(header)) { + File headerFile = new File(directory, header); + if (headerFile.canRead()) { + BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(headerFile), "UTF-8")); + String line = in.readLine(); + while (line != null) { + result.append(line); + line = in.readLine(); } + in.close(); } - result.append("<table>"); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - result.append("<tr><td class='lastmodified'>" + df.format(new Date(directory.lastModified())) + "</td><td class='filesize'> </td><td class='filename'><a href='.'>./</a></td></tr>"); - if (! pathInfo.equals("/")) { - result.append("<tr><td class='lastmodified'>" + df.format(new Date(directory.getParentFile().lastModified())) +"</td><td class='filesize'> </td><td class='filename'><a href='..'>../</a></td></tr>"); - } - List<File> list = Arrays.asList(directory.listFiles()); - if (comparator != null) { - Collections.sort(list, comparator); - } - for (File file : list) { - String name = file.getName() + (file.isDirectory() ? "/" : ""); - if (ignores(pathInfo + name)) continue; + } + result.append("<table>"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + result.append("<tr><td class='lastmodified'>" + df.format(new Date(directory.lastModified())) + "</td><td class='filesize'> </td><td class='filename'><a href='.'>./</a></td></tr>"); + if (! pathInfo.equals("/")) { + result.append("<tr><td class='lastmodified'>" + df.format(new Date(directory.getParentFile().lastModified())) +"</td><td class='filesize'> </td><td class='filename'><a href='..'>../</a></td></tr>"); + } + List<File> list = Arrays.asList(directory.listFiles()); + if (comparator != null) { + Collections.sort(list, comparator); + } + for (File file : list) { + String name = file.getName() + (file.isDirectory() ? "/" : ""); + if (ignores(pathInfo + name)) continue; - result.append("<tr><td class='lastmodified'>"); - result.append(df.format(new Date(file.lastModified()))); - result.append("</td>"); - result.append("<td class='filesize'>"); - result.append(formatFileSize.process(null, null, file.length())); - result.append("</td>"); - result.append("<td class='filename'>"); - if (canRead(req, file)) { - String url = URL.transform(file.getName()) + (file.isDirectory() ? "/" : ""); - result.append("<a href='" + url + "'>" + XML.transform(name) + "</a>"); - } else { - result.append(XML.transform(name)); - } - result.append("</td></tr>"); + result.append("<tr><td class='lastmodified'>"); + result.append(df.format(new Date(file.lastModified()))); + result.append("</td>"); + result.append("<td class='filesize'>"); + result.append(formatFileSize.process(null, null, file.length())); + result.append("</td>"); + result.append("<td class='filename'>"); + if (canRead(req, file)) { + String url = URL.transform(file.getName()) + (file.isDirectory() ? "/" : ""); + result.append("<a href='" + url + "'>" + XML.transform(name) + "</a>"); + } else { + result.append(XML.transform(name)); } - result.append("</table>"); - result.append("<h3>" + org.mmbase.Version.get() + "</h3>"); - result.append("</body>"); - result.append("</html>"); - try { - byte [] bytes = result.toString().getBytes("UTF-8"); - resp.setContentLength(bytes.length); - BufferedOutputStream out = new BufferedOutputStream(resp.getOutputStream()); - out.write(bytes); - out.flush(); - } catch (java.io.UnsupportedEncodingException uue) { - // cannot happen UTF-8 is supported. - log.fatal(uue); - } - return; - } else { - resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Directory listings are not enabled. (see web.xml)"); - return; + result.append("</td></tr>"); } + result.append("</table>"); + result.append("<h3>" + org.mmbase.Version.get() + "</h3>"); + result.append("</body>"); + result.append("</html>"); + try { + byte [] bytes = result.toString().getBytes("UTF-8"); + return bytes; + } catch (java.io.UnsupportedEncodingException uue) { + // cannot happen UTF-8 is supported. + log.fatal(uue); + return result.toString().getBytes(); + } } + protected void listing(HttpServletRequest req, HttpServletResponse resp, File directory) throws IOException { + byte [] bytes = getListingBytes(req, resp, directory); + resp.setContentLength(bytes.length); + BufferedOutputStream out = new BufferedOutputStream(resp.getOutputStream()); + out.write(bytes); + out.flush(); + } @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { _______________________________________________ Cvs mailing list Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs