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;
+			}
+		}
+	}
+
 }