Author: costin Date: Tue May 23 19:55:05 2006 New Revision: 409045 URL: http://svn.apache.org/viewvc?rev=409045&view=rev Log: Trivial file servlet ( based on the coyote file adapter ), will be replaced with a refactored default servlet from catalina.
Added: tomcat/sandbox/java/org/apache/tomcat/servlets/file/ tomcat/sandbox/java/org/apache/tomcat/servlets/file/FileServlet.java Added: tomcat/sandbox/java/org/apache/tomcat/servlets/file/FileServlet.java URL: http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/tomcat/servlets/file/FileServlet.java?rev=409045&view=auto ============================================================================== --- tomcat/sandbox/java/org/apache/tomcat/servlets/file/FileServlet.java (added) +++ tomcat/sandbox/java/org/apache/tomcat/servlets/file/FileServlet.java Tue May 23 19:55:05 2006 @@ -0,0 +1,139 @@ +package org.apache.tomcat.servlets.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Properties; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.coyote.Adapter; +import org.apache.coyote.Request; +import org.apache.coyote.Response; +import org.apache.coyote.servlet.util.MessageWriter; +import org.apache.tomcat.util.buf.ByteChunk; +import org.apache.tomcat.util.buf.C2BConverter; + +/** + * Serve a static file. This is the traditional method, a separate adapter could + * use Sendfile. + * + * No fancy things. Not sure if it should have dir support even. + */ +public class FileServlet extends HttpServlet { + Log log = LogFactory.getLog("coyote.file"); + + private String baseDir = "html/"; + + private File baseDirF; + + public FileServlet() { + init(); + } + + public void setBaseDir(String s) { + baseDir = s; + } + + public void init() { + baseDirF = new File(baseDir); + try { + baseDir = baseDirF.getCanonicalPath(); + } catch (IOException e) { + } + } + + protected void doGet(HttpServletRequest req, HttpServletResponse res) + throws ServletException, IOException { + + String uri = req.getRequestURI(); + if (uri.indexOf("..") >= 0) { + // not supported, too dangerous + // what else to escape ? + log.info("Invalid .. in " + uri); + res.setStatus(404); + return; + } + + // local file + File f = new File(baseDirF, uri); + + // extra check + if (!f.getCanonicalPath().startsWith(baseDir)) { + log.info("File outside basedir " + baseDir + " " + f); + res.setStatus(404); + return; + } + + if (f.isDirectory()) { + // check for index.html, redirect if exists + // list dir if not + + f = new File(f, "index.html"); + } + + if (!f.exists()) { + log.info("File not found " + f); + res.setStatus(404); + return; + } + + res.setStatus(200); + + // TODO: read from a resources in classpath ! + // TODO: refactor to allow sendfile + // TODO: read mime types + + int dot=uri.lastIndexOf("."); + if( dot > 0 ) { + String ext=uri.substring(dot+1); + String ct=getContentType(ext); + if( ct!=null) { + res.setContentType(ct); + } + } + + res.setContentLength((int) f.length()); + + //res.sendHeaders(); + + // not used - writes directly to response + // MessageWriter out = MessageWriter.getWriter(req, res, 0); + OutputStream os = res.getOutputStream(); + FileInputStream fis = new FileInputStream(f); + byte b[] = new byte[4096]; + int rd = 0; + while ((rd = fis.read(b)) > 0) { + os.write(b,0,rd); + } + os.close(); + } + + static Properties contentTypes=new Properties(); + static { + initContentTypes(); + } + static void initContentTypes() { + contentTypes.put("xhtml", "text/html"); + contentTypes.put("html", "text/html"); + contentTypes.put("txt", "text/plain"); + contentTypes.put("css", "text/css"); + contentTypes.put("xul", "application/vnd.mozilla.xul+xml"); + } + + public String getContentType( String ext ) { + return contentTypes.getProperty( ext, "text/plain" ); + } + + public boolean event(Request req, Response res, boolean error) throws Exception { + // TODO Auto-generated method stub + return false; + } + +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]