diff src/luan/modules/http/Server.luan @ 775:1a68fc55a80c

simplify dir structure
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 26 Aug 2016 14:36:40 -0600
parents http/src/luan/modules/http/Server.luan@3f461f85243d
children fe63c508a177
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/http/Server.luan	Fri Aug 26 14:36:40 2016 -0600
@@ -0,0 +1,118 @@
+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 Server = 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.AuthenticationHandler"
+local LuanHandler = require "java:luan.modules.http.LuanHandler"
+local NotFound = require "java:luan.modules.http.NotFound"
+
+local M = {}
+
+M.port = 8080
+
+M.welcome_file = "index.html"
+
+
+M.authentication_handler = AuthenticationHandler.new("/private/")
+
+M.luan_handler = LuanHandler.new()
+
+M.resource_handler = ResourceHandler.new()
+M.resource_handler.setDirectoriesListed(true)
+
+M.handlers = HandlerList.new()
+M.handlers.setHandlers { M.authentication_handler, M.luan_handler, M.resource_handler }
+
+function M.add_folder(context,dir)
+	local rh = ResourceHandler.new()
+	rh.setResourceBase(dir)
+	rh.setDirectoriesListed(true)
+	local ch = ContextHandler.new(context)
+	ch.setHandler(rh)
+	M.handlers.addHandler(ch)
+	return rh
+end
+
+M.handler_wrapper = HandlerWrapper.new()
+M.handler_wrapper.setHandler(M.handlers)
+
+function M.zip()
+	local h = GzipHandler.new()
+	h.setHandler(M.handler_wrapper.getHandler())
+	M.handler_wrapper.setHandler(h)
+end
+
+M.log = NCSARequestLog.new()
+M.log.setExtended(false)
+M.log_handler = RequestLogHandler.new()
+M.log_handler.setRequestLog(M.log)
+
+function M.set_log_file(file_name)
+	M.log.setFilename(file_name)
+end
+
+local hc = HandlerCollection.new()
+hc.setHandlers { SessionHandler.new(), M.handler_wrapper, DefaultHandler.new(), M.log_handler }
+
+
+function M.init(dir)
+	dir = gsub(dir,"/$","")  -- remove trailing '/' if any
+	Http.dir = dir
+	function Io.schemes.site(path)
+		return Io.uri( dir..path )
+	end
+	M.authentication_handler.setPassword(Io.password)
+	local base = dir
+	if matches(base,"^classpath:") then
+		base = dir.."#"..M.welcome_file.."#"..M.welcome_file..".luan"
+	end
+	M.resource_handler.setResourceBase(Io.uri(base).to_string())
+	M.resource_handler.setWelcomeFiles {M.welcome_file}
+	M.luan_handler.setWelcomeFile(M.welcome_file)
+	M.handlers.addHandler(NotFound.new())
+	M.server = Server.new(M.port)
+	M.server.setHandler(hc)
+	Package.load("site:/init.luan")
+end
+
+function M.start()
+	M.server.start()
+end
+
+function M.start_rpc()
+	function Rpc.functions.call(domain,fn_name,...)
+		return M.luan_handler.call_rpc(fn_name,...)
+	end
+
+	Thread.fork(Rpc.serve)
+end
+
+function M.serve(dir)
+	M.init(dir)
+	M.start()
+	M.start_rpc()
+end
+
+return M