Mercurial Hosting > luan
view src/luan/modules/http/Server.luan @ 1802:ca98dee04e08 default tip
add Parsers.json_null
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 21 Apr 2024 21:25:15 -0600 |
parents | d3ea0380dfb6 |
children |
line wrap: on
line source
local Luan = require "luan:Luan.luan" local error = Luan.error local String = require "luan:String.luan" local regex = String.regex or error() local contains = String.contains or error() local Io = require "luan:Io.luan" local uri = Io.uri or error() 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 Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "http/Server" require "java" local JavaServer = require "java:goodjava.webserver.Server" local FileHandler = require "java:goodjava.webserver.handlers.FileHandler" local DirHandler = require "java:goodjava.webserver.handlers.DirHandler" local IndexHandler = require "java:goodjava.webserver.handlers.IndexHandler" local ContentTypeHandler = require "java:goodjava.webserver.handlers.ContentTypeHandler" local SafeHandler = require "java:goodjava.webserver.handlers.SafeHandler" local LogHandler = require "java:goodjava.webserver.handlers.LogHandler" local ListHandler = require "java:goodjava.webserver.handlers.ListHandler" local HeadersHandler = require "java:goodjava.webserver.handlers.HeadersHandler" local LuanHandler = require "java:luan.modules.http.LuanHandler" local System = require "java:java.lang.System" local NotFound = require "java:luan.modules.http.NotFound" local Server = {} function Server.init_dir(dir) if not contains(dir,":") then dir = "file:"..dir end dir = regex("/$").gsub(dir,"") -- remove trailing '/' if any Http.dir = dir Http.is_serving = true function Io.schemes.site(path) local u = uri( dir..path ) if u ~= nil then u.uri_string = "site:"..path end return u end end function Server.start(server) try LuanHandler.start(server) catch e -- e.java.printStackTrace(); Io.print_to(Io.stderr, e ) System.exit(-1) end end function Server.start_rpc(luan_handler) function Rpc.functions.call(domain,fn_name,...) return luan_handler.call_rpc(fn_name,...) end Thread.run(Rpc.serve) end local file_regex = regex("^file:(.*)$") function Server.serve(dir,port) port = port or 8080 Server.init_dir(dir) local dir_path = file_regex.match(Http.dir) or error "server dir must be scheme 'file:'" local file_handler = FileHandler.new(dir_path) local luan_handler = LuanHandler.new() local handler = ListHandler.new( luan_handler, file_handler ) handler = ContentTypeHandler.new(handler) handler = IndexHandler.new(handler) local dir_handler = DirHandler.new(file_handler) local not_found_hander = NotFound.new(luan_handler) not_found_hander = ContentTypeHandler.new(not_found_hander) handler = ListHandler.new( handler, dir_handler, not_found_hander ) handler = HeadersHandler.new(handler) handler = SafeHandler.new(handler) handler = LogHandler.new(handler) local server = JavaServer.new(port,handler) Server.start(server) return server, luan_handler end return Server