local extension = ... local logger = extension:getLogger() local FileHttpHandler = require('jls.net.http.handler.FileHttpHandler') local HtmlFileHttpHandler = require('jls.net.http.handler.HtmlFileHttpHandler') local ProxyHttpHandler = require('jls.net.http.handler.ProxyHttpHandler') local WebDavHttpHandler = require('jls.net.http.handler.WebDavHttpHandler') local utils = require('lha.utils') local webBaseAddons = extension:require('web-base.addons', true) webBaseAddons.register(extension) local function isValidPath(name) if not name or name == '' or name == 'engine' or name == 'things' then logger:warn('Invalid share name "%s"', name) return false end return true end extension:subscribeEvent('startup', function() local configuration = extension:getConfiguration() if configuration.shares then for _, share in ipairs(configuration.shares) do local dir = utils.getAbsoluteFile(share.dir or 'share', extension:getEngine():getWorkDirectory()) if not dir:exists() then logger:warn('Share directory "%s" not found', dir) elseif not dir:isDirectory() then logger:warn('Invalid share directory "%s"', dir) end if isValidPath(share.name) then logger:info('Share directory "%s" on "/%s"', dir, share.name) local path = '/'..share.name..'/(.*)' if share.mode == 'HTML' then extension:addContext(path, HtmlFileHttpHandler:new(dir, share.permissions)) elseif share.mode == 'WebDAV' then extension:addContext(path, WebDavHttpHandler:new(dir, share.permissions)) else extension:addContext(path, FileHttpHandler:new(dir, share.permissions)) end end end end if configuration.proxies then for _, proxy in ipairs(configuration.proxies) do if isValidPath(proxy.name) and proxy.url then logger:info('Reverse proxy to "%s" on "%s"', proxy.url, proxy.name) local path = '/'..proxy.name..'/(.*)' local proxyHttpHandler = ProxyHttpHandler:new():configureReverse(proxy.url) if proxy.noReferer then function proxyHttpHandler:prepareRequest(exchange, request, url) request:setHeader('origin') request:setHeader('referer') request:setHeader('sec-fetch-dest') request:setHeader('sec-fetch-mode') request:setHeader('sec-fetch-site') end end extension:addContext(path, proxyHttpHandler) end end end end)