view http/src/luan/modules/http/Server.luan @ 532:9bf9ad733827

add logging/init so that logging can be used if initialized elsewhere
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 27 May 2015 22:19:46 -0600
parents 92c3d22745b8
children 473e456444ff
line wrap: on
line source

require "luan:String"
local Io = require "luan:Io"
local Package = require "luan:Package"
local Http = require "luan:http/Http"
require "luan:logging/init"  -- initialize logging

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.private_password = "password"

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 = dir.gsub("/$","")  -- remove trailing '/' if any
	Http.dir = dir
	function Io.schemes.site(path,add_extension)
		return Io.uri( dir..path, add_extension )
	end
	M.authentication_handler.setPassword(M.private_password)
	local base = dir
	if base.match("^classpath:") ~= nil 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")
end

function M.start()
	M.server.start()
end

function M.serve(dir)
	M.init(dir)
	M.start()
end

return M