Mercurial Hosting > luan
diff src/luan/modules/http/LuanHandler.java @ 1335:e0cf0d108a77
major cleanup
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 14 Feb 2019 03:10:45 -0700 |
parents | 25746915a241 |
children | 8b61c8c4e07a |
line wrap: on
line diff
--- a/src/luan/modules/http/LuanHandler.java Tue Feb 12 22:53:57 2019 -0700 +++ b/src/luan/modules/http/LuanHandler.java Thu Feb 14 03:10:45 2019 -0700 @@ -56,9 +56,9 @@ this.logger = LuanLogger.getLogger(luanInit,LuanHandler.class.getName()); try { LuanTable Http = (LuanTable)luanInit.require("luan:http/Http.luan"); - Http.put( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) ); - Http.put( "eval_in_root", new LuanJavaFunction(evalInRootMethod,this) ); - Http.put( "disable_luan", new LuanJavaFunction(disableLuanMethod,this) ); + Http.put( "reset_luan", new LuanJavaFunction(luanInit,resetLuanMethod,this) ); + Http.put( "eval_in_root", new LuanJavaFunction(luanInit,evalInRootMethod,this) ); + Http.put( "disable_luan", new LuanJavaFunction(luanInit,disableLuanMethod,this) ); } catch(LuanException e) { throw new RuntimeException(e); } @@ -66,8 +66,11 @@ } private Luan newLuan() { - LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); - Luan luan = (Luan)cloner.clone(luanInit); + Luan luan; + synchronized(luanInit) { + LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); + luan = (Luan)cloner.clone(luanInit); + } luan.onClose = this; try { PackageLuan.load(luan,"site:/init.luan"); @@ -99,7 +102,7 @@ thread.setName(request.headers.get("host")+request.path); lock.readLock().lock(); try { - return HttpServicer.service(currentLuan,request,modName); + return service(request,modName); } catch(LuanException e) { String err = e.getLuanStackTraceString(); logger.error(err+"\n"+request.rawHead.trim()+"\n"); @@ -137,19 +140,17 @@ lock.readLock().lock(); try { LuanFunction fn; - Luan luan = currentLuan; - synchronized(luan) { - PackageLuan.enableLoad(luan,"luan:Rpc.luan"); - LuanTable rpc = (LuanTable)luan.require("luan:Rpc.luan"); + synchronized(luanInit) { + enableLoad("luan:Rpc.luan"); + LuanTable rpc = (LuanTable)currentLuan.require("luan:Rpc.luan"); LuanTable fns = (LuanTable)rpc.get("functions"); fn = (LuanFunction)fns.get(fnName); if( fn == null ) throw new LuanException( "function not found: " + fnName ); LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); - luan = (Luan)cloner.clone(luan); fn = (LuanFunction)cloner.get(fn); } - return fn.call(luan,args); + return fn.call(args); } finally { lock.readLock().unlock(); } @@ -176,12 +177,12 @@ public Object runLuan(String sourceText,String sourceName) throws LuanException { lock.readLock().lock(); try { - LuanFunction fn = Luan.load(sourceText,sourceName); Luan luan = currentLuan; - synchronized(luan) { + synchronized(luanInit) { LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); Luan luan2 = (Luan)cloner.clone(luan); - return fn.call(luan2); + LuanFunction fn = luan2.load(sourceText,sourceName); + return fn.call(); } } finally { lock.readLock().unlock(); @@ -189,14 +190,13 @@ } public void eval_in_root(String text) throws LuanException { - Luan oldLuan = currentLuan; Luan luan; - synchronized(oldLuan) { + synchronized(luanInit) { LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); - luan = (Luan)cloner.clone(oldLuan); + luan = (Luan)cloner.clone(currentLuan); } luan.onClose = this; - BasicLuan.load(text,"<eval_in_root>",null).call(luan); + luan.load(text,"<eval_in_root>",null).call(); currentLuan = luan; } @@ -208,4 +208,69 @@ } } + + + // from HttpServicer + + private Response service(Request request,String modName) + throws LuanException + { + try { + return serviceLuan(request,modName); + } catch(LuanException e) { + return handleError(request,e); + } + } + + private Response handleError(Request request,LuanException e) + throws LuanException + { +//e.printStackTrace(); + Luan luan; + synchronized(luanInit) { + LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); + luan = (Luan)cloner.clone(currentLuan); + } + LuanTable module = (LuanTable)luan.require("luan:http/Http.luan"); + return (Response)module.fn("handle_error").call( request, e.table(luan) ); + } + + private Response serviceLuan(Request request,String modName) + throws LuanException + { + LuanFunction fn; + Luan luan; + synchronized(luanInit) { + enableLoad("luan:http/Http.luan",modName); + PackageLuan.require(currentLuan,"luan:http/Http.luan"); + Object mod = PackageLuan.load(currentLuan,modName); + if( mod.equals(Boolean.FALSE) ) + return null; + if( !(mod instanceof LuanFunction) ) + throw new LuanException( "module '"+modName+"' must return a function" ); + LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); + luan = (Luan)cloner.clone(currentLuan); + fn = (LuanFunction)cloner.get(mod); + } + + LuanTable module = (LuanTable)luan.require("luan:http/Http.luan"); + module.fn("new_request").call(request); + module.fn("new_response").call(); + + fn.call(); + + return (Response)module.fn("finish").call(); + } + + private void enableLoad(String... mods) throws LuanException { + LuanTable loaded = PackageLuan.loaded(currentLuan); + for( String mod : mods ) { + if( loaded.rawGet(mod) == null ) { + LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); + currentLuan = (Luan)cloner.clone(currentLuan); + break; + } + } + } + }