Mercurial Hosting > luan
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 } |