Mercurial Hosting > luan
changeset 1167:7e6f28c769a1
better handlers
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 08 Feb 2018 19:06:31 -0700 |
parents | 7ef40e1923b7 |
children | 312e4cadd508 |
files | src/luan/modules/http/impl/HttpServicer.java src/luan/modules/http/impl/LuanHandler.java src/luan/modules/http/impl/NotFound.java src/luan/modules/http/impl/Server.luan src/luan/webserver/examples/Example.java src/luan/webserver/handlers/DirHandler.java src/luan/webserver/handlers/FileHandler.java src/luan/webserver/handlers/IndexHandler.java |
diffstat | 8 files changed, 98 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/modules/http/impl/HttpServicer.java --- a/src/luan/modules/http/impl/HttpServicer.java Thu Feb 08 02:22:51 2018 -0700 +++ b/src/luan/modules/http/impl/HttpServicer.java Thu Feb 08 19:06:31 2018 -0700 @@ -15,14 +15,11 @@ public final class HttpServicer { private static final Logger logger = LoggerFactory.getLogger(HttpServicer.class); - public static Response service(LuanState luan,Request request) + public static Response service(LuanState luan,Request request,String modName) throws LuanException { - if( request.path.endsWith("/") ) - return null; LuanFunction fn; synchronized(luan) { - String modName = "site:" + request.path +".luan"; PackageLuan.enableLoad(luan,"luan:http/Http.luan",modName); LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan"); Object mod = PackageLuan.load(luan,modName);
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/modules/http/impl/LuanHandler.java --- a/src/luan/modules/http/impl/LuanHandler.java Thu Feb 08 02:22:51 2018 -0700 +++ b/src/luan/modules/http/impl/LuanHandler.java Thu Feb 08 19:06:31 2018 -0700 @@ -57,12 +57,19 @@ } @Override public Response handle(Request request) { + if( request.path.endsWith("/") ) + return null; + String modName = "site:" + request.path +".luan"; + return handle(request,modName); + } + + Response handle(Request request,String modName) { Thread thread = Thread.currentThread(); String oldName = thread.getName(); thread.setName(request.headers.get("host")+request.path); lock.readLock().lock(); try { - Response response = HttpServicer.service(luan,request); + Response response = HttpServicer.service(luan,request,modName); return response; } catch(LuanException e) { //e.printStackTrace();
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/modules/http/impl/NotFound.java --- a/src/luan/modules/http/impl/NotFound.java Thu Feb 08 02:22:51 2018 -0700 +++ b/src/luan/modules/http/impl/NotFound.java Thu Feb 08 19:06:31 2018 -0700 @@ -6,24 +6,14 @@ public class NotFound implements Handler { - private final Handler handler; + private final LuanHandler luanHandler; - public NotFound(Handler handler) { - this.handler = handler; + public NotFound(LuanHandler luanHandler) { + this.luanHandler = luanHandler; } @Override public Response handle(Request request) { - Response response = handler.handle(request); - if( response == null ) { - String path = request.path; - try { - request.path = "/not_found"; - response = handler.handle(request); - } finally { - request.path = path; - } - } - return response; + return luanHandler.handle(request,"site:/not_found.luan"); } }
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/modules/http/impl/Server.luan --- a/src/luan/modules/http/impl/Server.luan Thu Feb 08 02:22:51 2018 -0700 +++ b/src/luan/modules/http/impl/Server.luan Thu Feb 08 19:06:31 2018 -0700 @@ -8,7 +8,7 @@ local Package = require "luan:Package.luan" local Rpc = require "luan:Rpc.luan" local Thread = require "luan:Thread.luan" ---local Http = require "luan:http/Http.luan" +local Http = require "luan:http/Http.luan" require "luan:logging/init.luan" -- initialize logging local Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "http/Server" @@ -16,6 +16,7 @@ java() local JavaServer = require "java:luan.webserver.Server" local FileHandler = require "java:luan.webserver.handlers.FileHandler" +local DirHandler = require "java:luan.webserver.handlers.DirHandler" local IndexHandler = require "java:luan.webserver.handlers.IndexHandler" local ContentTypeHandler = require "java:luan.webserver.handlers.ContentTypeHandler" local SafeHandler = require "java:luan.webserver.handlers.SafeHandler" @@ -39,19 +40,20 @@ dir_uri = "file:"..dir end dir_uri = gsub(dir_uri,"/$","") -- remove trailing '/' if any --- Http.dir = dir_uri + Http.dir = dir_uri function Io.schemes.site(path) return Io.uri( dir_uri..path ) end - local handler = FileHandler.new(dir_path) + local file_handler = FileHandler.new(dir_path) + local dir_handler = DirHandler.new(dir_path) local luan_handler = LuanHandler.new() - handler = ListHandler.new( luan_handler, handler ) + local not_found_hander = NotFound.new(luan_handler) + local handler = ListHandler.new( luan_handler, file_handler ) handler = IndexHandler.new(handler) - handler = NotFound.new(handler) + handler = ListHandler.new( handler, dir_handler, not_found_hander ) handler = ContentTypeHandler.new(handler) handler = SafeHandler.new(handler) handler = LogHandler.new(handler) --- Server.handlers.addHandler(NotFound.new(Server.luan_handler)) Server.server = JavaServer.new(Server.port,handler) end
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/webserver/examples/Example.java --- a/src/luan/webserver/examples/Example.java Thu Feb 08 02:22:51 2018 -0700 +++ b/src/luan/webserver/examples/Example.java Thu Feb 08 19:06:31 2018 -0700 @@ -17,6 +17,7 @@ import luan.webserver.handlers.SafeHandler; import luan.webserver.handlers.LogHandler; import luan.webserver.handlers.FileHandler; +import luan.webserver.handlers.DirHandler; import luan.webserver.handlers.ListHandler; import luan.webserver.handlers.ContentTypeHandler; @@ -48,7 +49,7 @@ map.put( "/params", new Params() ); map.put( "/cookies", new Cookies() ); Handler handler = new MapHandler(map); - handler = new ListHandler( handler, new FileHandler() ); + handler = new ListHandler( handler, new FileHandler(), new DirHandler() ); handler = new ContentTypeHandler(handler); handler = new SafeHandler(handler); handler = new LogHandler(handler);
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/webserver/handlers/DirHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/webserver/handlers/DirHandler.java Thu Feb 08 19:06:31 2018 -0700 @@ -0,0 +1,60 @@ +package luan.webserver.handlers; + +import java.io.File; +import java.io.FileInputStream; +import java.io.Writer; +import java.io.OutputStreamWriter; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import luan.webserver.Handler; +import luan.webserver.Request; +import luan.webserver.Response; +import luan.webserver.ResponseOutputStream; + + +public final class DirHandler extends FileHandler { + + public DirHandler() { + super(); + } + + public DirHandler(String pathname) { + super(pathname); + } + + public DirHandler(File dir) { + super(dir); + } + + Response handle(Request request,File file) throws IOException { + if( request.path.endsWith("/") && file.isDirectory() ) { + DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz"); + Response response = new Response(); + response.headers.put( "content-type", "text/html; charset=utf-8" ); + Writer writer = new OutputStreamWriter( new ResponseOutputStream(response) ); + writer.write( "<!doctype html><html>" ); + writer.write( "<head><style>td{padding: 2px 8px}</style></head>" ); + writer.write( "<body>" ); + writer.write( "<h1>Directory: "+request.path+"</h1>" ); + writer.write( "<table border=0>" ); + for( File child : file.listFiles() ) { + String name = child.getName(); + if( child.isDirectory() ) + name += '/'; + writer.write( "<tr>" ); + writer.write( "<td><a href='"+name+"'>"+name+"</a></td>" ); + writer.write( "<td>"+child.length()+" bytes</td>" ); + writer.write( "<td>"+fmt.format(new Date(child.lastModified()))+"</td>" ); + writer.write( "</tr>" ); + } + writer.write( "</table>" ); + writer.write( "</body>" ); + writer.write( "</html>" ); + writer.close(); + return response; + } + return null; + } +}
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/webserver/handlers/FileHandler.java --- a/src/luan/webserver/handlers/FileHandler.java Thu Feb 08 02:22:51 2018 -0700 +++ b/src/luan/webserver/handlers/FileHandler.java Thu Feb 08 19:06:31 2018 -0700 @@ -14,9 +14,8 @@ import luan.webserver.ResponseOutputStream; -public final class FileHandler implements Handler { - public boolean showDirs = true; - private final File dir; +public class FileHandler implements Handler { + final File dir; public FileHandler() { this("."); @@ -35,40 +34,18 @@ public Response handle(Request request) { try { File file = new File(dir,request.path); - if( file.isFile() ) { - Response response = new Response(); - response.body = new Response.Body( file.length(), new FileInputStream(file) ); - return response; - } - if( request.path.endsWith("/") && file.isDirectory() && showDirs ) { - DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz"); - Response response = new Response(); - response.headers.put( "content-type", "text/html; charset=utf-8" ); - Writer writer = new OutputStreamWriter( new ResponseOutputStream(response) ); - writer.write( "<!doctype html><html>" ); - writer.write( "<head><style>td{padding: 2px 8px}</style></head>" ); - writer.write( "<body>" ); - writer.write( "<h1>Directory: "+request.path+"</h1>" ); - writer.write( "<table border=0>" ); - for( File child : file.listFiles() ) { - String name = child.getName(); - if( child.isDirectory() ) - name += '/'; - writer.write( "<tr>" ); - writer.write( "<td><a href='"+name+"'>"+name+"</a></td>" ); - writer.write( "<td>"+child.length()+" bytes</td>" ); - writer.write( "<td>"+fmt.format(new Date(child.lastModified()))+"</td>" ); - writer.write( "</tr>" ); - } - writer.write( "</table>" ); - writer.write( "</body>" ); - writer.write( "</html>" ); - writer.close(); - return response; - } - return null; + return handle(request,file); } catch(IOException e) { throw new RuntimeException(e); } } + + Response handle(Request request,File file) throws IOException { + if( file.isFile() ) { + Response response = new Response(); + response.body = new Response.Body( file.length(), new FileInputStream(file) ); + return response; + } + return null; + } }
diff -r 7ef40e1923b7 -r 7e6f28c769a1 src/luan/webserver/handlers/IndexHandler.java --- a/src/luan/webserver/handlers/IndexHandler.java Thu Feb 08 02:22:51 2018 -0700 +++ b/src/luan/webserver/handlers/IndexHandler.java Thu Feb 08 19:06:31 2018 -0700 @@ -23,13 +23,11 @@ String path = request.path; try { request.path += indexName; - Response response = handler.handle(request); - if( response != null ) - return response; + return handler.handle(request); } finally { request.path = path; } - } - return handler.handle(request); + } else + return handler.handle(request); } }