comparison 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
comparison
equal deleted inserted replaced
1334:c88b486a9511 1335:e0cf0d108a77
54 public LuanHandler(Luan luanInit) { 54 public LuanHandler(Luan luanInit) {
55 this.luanInit = luanInit; 55 this.luanInit = luanInit;
56 this.logger = LuanLogger.getLogger(luanInit,LuanHandler.class.getName()); 56 this.logger = LuanLogger.getLogger(luanInit,LuanHandler.class.getName());
57 try { 57 try {
58 LuanTable Http = (LuanTable)luanInit.require("luan:http/Http.luan"); 58 LuanTable Http = (LuanTable)luanInit.require("luan:http/Http.luan");
59 Http.put( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) ); 59 Http.put( "reset_luan", new LuanJavaFunction(luanInit,resetLuanMethod,this) );
60 Http.put( "eval_in_root", new LuanJavaFunction(evalInRootMethod,this) ); 60 Http.put( "eval_in_root", new LuanJavaFunction(luanInit,evalInRootMethod,this) );
61 Http.put( "disable_luan", new LuanJavaFunction(disableLuanMethod,this) ); 61 Http.put( "disable_luan", new LuanJavaFunction(luanInit,disableLuanMethod,this) );
62 } catch(LuanException e) { 62 } catch(LuanException e) {
63 throw new RuntimeException(e); 63 throw new RuntimeException(e);
64 } 64 }
65 currentLuan = newLuan(); 65 currentLuan = newLuan();
66 } 66 }
67 67
68 private Luan newLuan() { 68 private Luan newLuan() {
69 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); 69 Luan luan;
70 Luan luan = (Luan)cloner.clone(luanInit); 70 synchronized(luanInit) {
71 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
72 luan = (Luan)cloner.clone(luanInit);
73 }
71 luan.onClose = this; 74 luan.onClose = this;
72 try { 75 try {
73 PackageLuan.load(luan,"site:/init.luan"); 76 PackageLuan.load(luan,"site:/init.luan");
74 } catch(LuanException e) { 77 } catch(LuanException e) {
75 //e.printStackTrace(); 78 //e.printStackTrace();
97 Thread thread = Thread.currentThread(); 100 Thread thread = Thread.currentThread();
98 String oldName = thread.getName(); 101 String oldName = thread.getName();
99 thread.setName(request.headers.get("host")+request.path); 102 thread.setName(request.headers.get("host")+request.path);
100 lock.readLock().lock(); 103 lock.readLock().lock();
101 try { 104 try {
102 return HttpServicer.service(currentLuan,request,modName); 105 return service(request,modName);
103 } catch(LuanException e) { 106 } catch(LuanException e) {
104 String err = e.getLuanStackTraceString(); 107 String err = e.getLuanStackTraceString();
105 logger.error(err+"\n"+request.rawHead.trim()+"\n"); 108 logger.error(err+"\n"+request.rawHead.trim()+"\n");
106 String msg = "Internel Server Error\n\n" + err; 109 String msg = "Internel Server Error\n\n" + err;
107 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg ); 110 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg );
135 138
136 public Object call_rpc(String fnName,Object... args) throws LuanException { 139 public Object call_rpc(String fnName,Object... args) throws LuanException {
137 lock.readLock().lock(); 140 lock.readLock().lock();
138 try { 141 try {
139 LuanFunction fn; 142 LuanFunction fn;
140 Luan luan = currentLuan; 143 synchronized(luanInit) {
141 synchronized(luan) { 144 enableLoad("luan:Rpc.luan");
142 PackageLuan.enableLoad(luan,"luan:Rpc.luan"); 145 LuanTable rpc = (LuanTable)currentLuan.require("luan:Rpc.luan");
143 LuanTable rpc = (LuanTable)luan.require("luan:Rpc.luan");
144 LuanTable fns = (LuanTable)rpc.get("functions"); 146 LuanTable fns = (LuanTable)rpc.get("functions");
145 fn = (LuanFunction)fns.get(fnName); 147 fn = (LuanFunction)fns.get(fnName);
146 if( fn == null ) 148 if( fn == null )
147 throw new LuanException( "function not found: " + fnName ); 149 throw new LuanException( "function not found: " + fnName );
148 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); 150 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
149 luan = (Luan)cloner.clone(luan);
150 fn = (LuanFunction)cloner.get(fn); 151 fn = (LuanFunction)cloner.get(fn);
151 } 152 }
152 return fn.call(luan,args); 153 return fn.call(args);
153 } finally { 154 } finally {
154 lock.readLock().unlock(); 155 lock.readLock().unlock();
155 } 156 }
156 } 157 }
157 158
174 } 175 }
175 176
176 public Object runLuan(String sourceText,String sourceName) throws LuanException { 177 public Object runLuan(String sourceText,String sourceName) throws LuanException {
177 lock.readLock().lock(); 178 lock.readLock().lock();
178 try { 179 try {
179 LuanFunction fn = Luan.load(sourceText,sourceName);
180 Luan luan = currentLuan; 180 Luan luan = currentLuan;
181 synchronized(luan) { 181 synchronized(luanInit) {
182 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); 182 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
183 Luan luan2 = (Luan)cloner.clone(luan); 183 Luan luan2 = (Luan)cloner.clone(luan);
184 return fn.call(luan2); 184 LuanFunction fn = luan2.load(sourceText,sourceName);
185 return fn.call();
185 } 186 }
186 } finally { 187 } finally {
187 lock.readLock().unlock(); 188 lock.readLock().unlock();
188 } 189 }
189 } 190 }
190 191
191 public void eval_in_root(String text) throws LuanException { 192 public void eval_in_root(String text) throws LuanException {
192 Luan oldLuan = currentLuan; 193 Luan luan;
193 Luan luan; 194 synchronized(luanInit) {
194 synchronized(oldLuan) {
195 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); 195 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
196 luan = (Luan)cloner.clone(oldLuan); 196 luan = (Luan)cloner.clone(currentLuan);
197 } 197 }
198 luan.onClose = this; 198 luan.onClose = this;
199 BasicLuan.load(text,"<eval_in_root>",null).call(luan); 199 luan.load(text,"<eval_in_root>",null).call();
200 currentLuan = luan; 200 currentLuan = luan;
201 } 201 }
202 202
203 public static void start(Server server) throws Exception { 203 public static void start(Server server) throws Exception {
204 try { 204 try {
206 } catch(BindException e) { 206 } catch(BindException e) {
207 throw new LuanException(e.toString()); 207 throw new LuanException(e.toString());
208 } 208 }
209 } 209 }
210 210
211
212
213 // from HttpServicer
214
215 private Response service(Request request,String modName)
216 throws LuanException
217 {
218 try {
219 return serviceLuan(request,modName);
220 } catch(LuanException e) {
221 return handleError(request,e);
222 }
223 }
224
225 private Response handleError(Request request,LuanException e)
226 throws LuanException
227 {
228 //e.printStackTrace();
229 Luan luan;
230 synchronized(luanInit) {
231 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
232 luan = (Luan)cloner.clone(currentLuan);
233 }
234 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan");
235 return (Response)module.fn("handle_error").call( request, e.table(luan) );
236 }
237
238 private Response serviceLuan(Request request,String modName)
239 throws LuanException
240 {
241 LuanFunction fn;
242 Luan luan;
243 synchronized(luanInit) {
244 enableLoad("luan:http/Http.luan",modName);
245 PackageLuan.require(currentLuan,"luan:http/Http.luan");
246 Object mod = PackageLuan.load(currentLuan,modName);
247 if( mod.equals(Boolean.FALSE) )
248 return null;
249 if( !(mod instanceof LuanFunction) )
250 throw new LuanException( "module '"+modName+"' must return a function" );
251 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
252 luan = (Luan)cloner.clone(currentLuan);
253 fn = (LuanFunction)cloner.get(mod);
254 }
255
256 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan");
257 module.fn("new_request").call(request);
258 module.fn("new_response").call();
259
260 fn.call();
261
262 return (Response)module.fn("finish").call();
263 }
264
265 private void enableLoad(String... mods) throws LuanException {
266 LuanTable loaded = PackageLuan.loaded(currentLuan);
267 for( String mod : mods ) {
268 if( loaded.rawGet(mod) == null ) {
269 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
270 currentLuan = (Luan)cloner.clone(currentLuan);
271 break;
272 }
273 }
274 }
275
211 } 276 }