1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.jot.web.server.impl; import java.io.File; import java.io.FileInputStream; import java.io.PrintWriter; import java.net.URLEncoder; import java.util.Hashtable; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import net.jot.logger.JOTLogger; import net.jot.logger.JOTLoggerLocation; import net.jot.utils.JOTUtilities; import net.jot.web.server.JOTWebHelper; import net.jot.web.server.JOTWebRequestHandlerBase; /** * Note that this is a "simple" http server (not j2ee) and that not all the request methods are implemented * In particular the session and context stuff are not implemented / working. * * @author tcolar */ public class JOTStaticServerHandler extends JOTWebRequestHandlerBase{ private File rootFolder; private static final JOTLoggerLocation logger=new JOTLoggerLocation(JOTLogger.CAT_SERVER,JOTStaticServerHandler.class); public void handle() throws Exception { if(logger.isDebugEnabled()) { logger.debug("Received Request: "+request.getRemoteHost()+" "+request.getRawRequestLine()); } if(logger.isTraceEnabled()) logger.trace("Received Request: "+request.toString()); if(request.getMethod().equalsIgnoreCase("GET")) { String path=request.getServletPath(); File f=new File(rootFolder+path); // security check if( ! JOTUtilities.isWithinFolder(f, rootFolder)) { response.sendError(HttpServletResponse.SC_FORBIDDEN,"Forbidden path."); return; } if( ! f.exists()) { response.sendError(HttpServletResponse.SC_NOT_FOUND,"File not found."); return; } if(f.isDirectory()) { if(new File(f,"index.html").exists()) { sendFile(new File(f,"index.html")); } else { sendDirectoryListing(f); } } else { sendFile(f); } } else { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,"Only the GET method is supported."); return; } } public void init(Hashtable params) { rootFolder=new File((String)params.get(JOTStaticWebServer.ROOT_FOLDER)); if(rootFolder==null || !rootFolder.isDirectory()) { throw new IllegalArgumentException("Root folder is not a folder !! :"+rootFolder.getAbsolutePath()); } } private void sendDirectoryListing(File f) throws Exception { response.setContentType("text/html"); //response.setHeader("Location",request.getServletPath()); File[] files=f.listFiles(); files=JOTUtilities.sortFolderListing(files, JOTUtilities.SORT_BY_NAME_ASC); PrintWriter writer=response.getWriter(); writer.println(JOTWebHelper.MSG_HEAD + "Directory Listing: ["+request.getServletPath()+"]" + JOTWebHelper.MSG_HEAD2+"<h5>"); writer.println("<a href='../'>[..]</a>(UP)<br/>"); for(int i=0;i!=files.length;i++) { File file=files[i]; if(file.isDirectory()) { writer.println("<a href='"+URLEncoder.encode(file.getName(),"UTF-8")+"/'>["+file.getName()+"]</a><br/>"); } else { writer.println("<a href='"+URLEncoder.encode(file.getName(),"UTF-8")+"'>"+file.getName()+"</a><br/>"); } } writer.println("</h5>"+JOTWebHelper.MSG_TAIL); } private void sendFile(File f) throws Exception { // not setting content type or anyhting, will let the browser deal with it. byte[] buffer=new byte[5000]; //5k ServletOutputStream stream=response.getOutputStream(); FileInputStream fis=new FileInputStream(f); int read=-1; while((read=fis.read(buffer))!=-1) { stream.write(buffer,0,read); } } }