Mercurial Hosting > luan
diff src/luan/modules/http/jetty/Server.luan @ 1136:d30d400fd43d
add http/jetty
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 29 Jan 2018 17:50:49 -0700 |
parents | src/luan/modules/http/Server.luan@1fcf5c25b3bd |
children | 1b7c20e20ca7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/modules/http/jetty/Server.luan Mon Jan 29 17:50:49 2018 -0700 @@ -0,0 +1,119 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local String = require "luan:String.luan" +local gsub = String.gsub or error() +local matches = String.matches or error() +local Io = require "luan:Io.luan" +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" +require "luan:logging/init.luan" -- initialize logging +local Logging = require "luan:logging/Logging.luan" +local logger = Logging.logger "http/Server" + +java() +local TimeZone = require "java:java.util.TimeZone" +local JavaServer = require "java:org.eclipse.jetty.server.Server" +local NCSARequestLog = require "java:org.eclipse.jetty.server.NCSARequestLog" +local DefaultHandler = require "java:org.eclipse.jetty.server.handler.DefaultHandler" +local HandlerList = require "java:org.eclipse.jetty.server.handler.HandlerList" +local HandlerCollection = require "java:org.eclipse.jetty.server.handler.HandlerCollection" +local ResourceHandler = require "java:org.eclipse.jetty.server.handler.ResourceHandler" +local RequestLogHandler = require "java:org.eclipse.jetty.server.handler.RequestLogHandler" +local ContextHandler = require "java:org.eclipse.jetty.server.handler.ContextHandler" +local GzipHandler = require "java:org.eclipse.jetty.server.handler.GzipHandler" +local HandlerWrapper = require "java:org.eclipse.jetty.server.handler.HandlerWrapper" +local SessionHandler = require "java:org.eclipse.jetty.server.session.SessionHandler" +local AuthenticationHandler = require "java:luan.modules.http.jetty.AuthenticationHandler" +local LuanHandler = require "java:luan.modules.http.jetty.LuanHandler" +local NotFound = require "java:luan.modules.http.jetty.NotFound" + +local Server = {} + +Server.port = 8080 + +Server.welcome_file = "index.html" + + +Server.authentication_handler = AuthenticationHandler.new("/private/") + +Server.luan_handler = LuanHandler.new() + +Server.resource_handler = ResourceHandler.new() +Server.resource_handler.setDirectoriesListed(true) + +Server.handlers = HandlerList.new() +Server.handlers.setHandlers { Server.authentication_handler, Server.luan_handler, Server.resource_handler } + +function Server.add_folder(context,dir) + local rh = ResourceHandler.new() + rh.setResourceBase(dir) + rh.setDirectoriesListed(true) + local ch = ContextHandler.new(context) + ch.setHandler(rh) + Server.handlers.addHandler(ch) + return rh +end + +Server.handler_wrapper = HandlerWrapper.new() +Server.handler_wrapper.setHandler(Server.handlers) + +function Server.zip() + local h = GzipHandler.new() + h.setHandler(Server.handler_wrapper.getHandler()) + Server.handler_wrapper.setHandler(h) +end + +Server.log = NCSARequestLog.new() +Server.log.setExtended(false) +Server.log.setLogTimeZone(TimeZone.getDefault().getID()) +Server.log_handler = RequestLogHandler.new() +Server.log_handler.setRequestLog(Server.log) + +function Server.set_log_file(file_name) + Server.log.setFilename(file_name) +end + +local hc = HandlerCollection.new() +hc.setHandlers { SessionHandler.new(), Server.handler_wrapper, DefaultHandler.new(), Server.log_handler } + + +function Server.init(dir) + dir = gsub(dir,"/$","") -- remove trailing '/' if any + Http.dir = dir + function Io.schemes.site(path) + return Io.uri( dir..path ) + end + Server.authentication_handler.setPassword(Io.password) + local base = dir + if matches(base,"^classpath:") then + base = dir.."#"..Server.welcome_file.."#"..Server.welcome_file..".luan" + end + Server.resource_handler.setResourceBase(Io.uri(base).to_string()) + Server.resource_handler.setWelcomeFiles {Server.welcome_file} + Server.luan_handler.setWelcomeFile(Server.welcome_file) + Server.handlers.addHandler(NotFound.new(Server.luan_handler)) + Server.server = JavaServer.new(Server.port) + Server.server.setHandler(hc) +end + +function Server.start() + LuanHandler.start(Server.server) +end + +function Server.start_rpc() + function Rpc.functions.call(domain,fn_name,...) + return Server.luan_handler.call_rpc(fn_name,...) + end + + Thread.fork(Rpc.serve) +end + +function Server.serve(dir) + Server.init(dir) + Server.start_rpc() + Server.start() +end + +return Server