Mercurial Hosting > luan
annotate src/luan/modules/http/LuanHandler.java @ 1360:ee0f0e6c89a0
fix reset_luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 21 Apr 2019 02:32:41 -0600 |
parents | 9721d4709bfb |
children | 5c3702f60200 |
rev | line source |
---|---|
1171 | 1 package luan.modules.http; |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
1231 | 3 import java.io.Closeable; |
1160 | 4 import java.io.Writer; |
5 import java.io.PrintWriter; | |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
6 import java.io.IOException; |
1264 | 7 import java.lang.ref.Reference; |
8 import java.lang.ref.WeakReference; | |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
9 import java.lang.reflect.Method; |
1004
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
10 import java.net.BindException; |
1264 | 11 import java.util.List; |
12 import java.util.ArrayList; | |
13 import java.util.concurrent.locks.ReadWriteLock; | |
14 import java.util.concurrent.locks.ReentrantReadWriteLock; | |
1337 | 15 import luan.lib.logging.Logger; |
1347
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
16 import luan.lib.webserver.Request; |
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
17 import luan.lib.webserver.Response; |
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
18 import luan.lib.webserver.Status; |
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
19 import luan.lib.webserver.Server; |
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
20 import luan.lib.webserver.Handler; |
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1337
diff
changeset
|
21 import luan.lib.webserver.ResponseOutputStream; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
22 import luan.Luan; |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
23 import luan.LuanTable; |
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
24 import luan.LuanFunction; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
25 import luan.LuanJavaFunction; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
777
diff
changeset
|
26 import luan.LuanCloner; |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
27 import luan.LuanException; |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
28 import luan.modules.PackageLuan; |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1257
diff
changeset
|
29 import luan.modules.BasicLuan; |
1321
307e76ccd0d6
generalize separate logging
Franklin Schmidt <fschmidt@gmail.com>
parents:
1319
diff
changeset
|
30 import luan.modules.logging.LuanLogger; |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
31 |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
32 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
33 public final class LuanHandler implements Handler, Luan.OnClose { |
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
34 private final Luan luanInit; |
627
a98812908fbc
add loggerRoot param to LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
531
diff
changeset
|
35 private final Logger logger; |
1360 | 36 private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
37 private final List<Reference<Closeable>> onClose = new ArrayList<Reference<Closeable>>(); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
38 private volatile Luan currentLuan; |
1319
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
39 private volatile boolean isDisabled = false; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
40 |
1186 | 41 private static final Method resetLuanMethod; |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1257
diff
changeset
|
42 private static final Method evalInRootMethod; |
1319
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
43 private static final Method disableLuanMethod; |
1186 | 44 static { |
45 try { | |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1257
diff
changeset
|
46 resetLuanMethod = LuanHandler.class.getMethod( "reset_luan" ); |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1257
diff
changeset
|
47 evalInRootMethod = LuanHandler.class.getMethod( "eval_in_root", String.class ); |
1319
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
48 disableLuanMethod = LuanHandler.class.getMethod( "disable_luan" ); |
1186 | 49 } catch(NoSuchMethodException e) { |
50 throw new RuntimeException(e); | |
51 } | |
52 } | |
53 | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
54 public LuanHandler(Luan luanInit) { |
1231 | 55 this.luanInit = luanInit; |
1321
307e76ccd0d6
generalize separate logging
Franklin Schmidt <fschmidt@gmail.com>
parents:
1319
diff
changeset
|
56 this.logger = LuanLogger.getLogger(luanInit,LuanHandler.class.getName()); |
1186 | 57 try { |
1283
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
58 LuanTable Http = (LuanTable)luanInit.require("luan:http/Http.luan"); |
1350 | 59 if( Http.get("reset_luan") == null ) |
60 Http.put( "reset_luan", new LuanJavaFunction(luanInit,resetLuanMethod,this) ); | |
1335 | 61 Http.put( "eval_in_root", new LuanJavaFunction(luanInit,evalInRootMethod,this) ); |
62 Http.put( "disable_luan", new LuanJavaFunction(luanInit,disableLuanMethod,this) ); | |
1186 | 63 } catch(LuanException e) { |
64 throw new RuntimeException(e); | |
65 } | |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
66 currentLuan = newLuan(); |
1186 | 67 } |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
68 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
69 private Luan newLuan() { |
1335 | 70 Luan luan; |
71 synchronized(luanInit) { | |
72 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); | |
73 luan = (Luan)cloner.clone(luanInit); | |
74 } | |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
75 luan.onClose = this; |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
76 try { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
77 PackageLuan.load(luan,"site:/init.luan"); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
78 } catch(LuanException e) { |
1321
307e76ccd0d6
generalize separate logging
Franklin Schmidt <fschmidt@gmail.com>
parents:
1319
diff
changeset
|
79 //e.printStackTrace(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
80 String err = e.getLuanStackTraceString(); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
81 logger.error(err); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
82 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
83 return luan; |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
84 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
85 |
1264 | 86 /* |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
87 public Luan getLuan() { |
1257
e38f5869e9df
don't reset in send_redirect and other improvements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
88 return luan; |
e38f5869e9df
don't reset in send_redirect and other improvements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
89 } |
1264 | 90 */ |
1160 | 91 @Override public Response handle(Request request) { |
1319
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
92 if( isDisabled ) |
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
93 return null; |
1167 | 94 if( request.path.endsWith("/") ) |
95 return null; | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
96 return handle(request,false); |
1167 | 97 } |
98 | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
99 Response handle(Request request,boolean notFound) { |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
100 Thread thread = Thread.currentThread(); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
101 String oldName = thread.getName(); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
102 thread.setName(request.headers.get("host")+request.path); |
1360 | 103 rwLock.readLock().lock(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
104 try { |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
105 return service(request,notFound); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
106 } catch(LuanException e) { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
107 String err = e.getLuanStackTraceString(); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
108 logger.error(err+"\n"+request.rawHead.trim()+"\n"); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
109 String msg = "Internel Server Error\n\n" + err; |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
110 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg ); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
111 } finally { |
1360 | 112 rwLock.readLock().unlock(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
113 thread.setName(oldName); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
114 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
115 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
116 |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
117 public void onClose(Closeable c) { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
118 synchronized(onClose) { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
119 onClose.add(new WeakReference<Closeable>(c)); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
120 } |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
121 } |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
122 |
1231 | 123 public void close() { |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
124 synchronized(onClose) { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
125 for( Reference<Closeable> ref : onClose ) { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
126 Closeable c = ref.get(); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
127 if( c != null ) { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
128 try { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
129 c.close(); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
130 } catch(IOException e) { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
131 logger.error(c.toString(),e); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
132 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
133 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
134 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
135 onClose.clear(); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
136 } |
517
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
494
diff
changeset
|
137 } |
1185
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
138 |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
139 public Object call_rpc(String fnName,Object... args) throws LuanException { |
1360 | 140 rwLock.readLock().lock(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
141 try { |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
142 LuanFunction fn; |
1335 | 143 synchronized(luanInit) { |
144 enableLoad("luan:Rpc.luan"); | |
145 LuanTable rpc = (LuanTable)currentLuan.require("luan:Rpc.luan"); | |
1267 | 146 LuanTable fns = (LuanTable)rpc.get("functions"); |
147 fn = (LuanFunction)fns.get(fnName); | |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
148 if( fn == null ) |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
149 throw new LuanException( "function not found: " + fnName ); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
150 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
151 fn = (LuanFunction)cloner.get(fn); |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
152 } |
1335 | 153 return fn.call(args); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
154 } finally { |
1360 | 155 rwLock.readLock().unlock(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
156 } |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
157 } |
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
158 |
1186 | 159 public void reset_luan() { |
1360 | 160 new Thread() {public void run(){ |
161 rwLock.writeLock().lock(); | |
162 try { | |
163 close(); | |
164 currentLuan = newLuan(); | |
165 } finally { | |
166 rwLock.writeLock().unlock(); | |
167 } | |
168 }}.start(); | |
1186 | 169 } |
170 | |
1319
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
171 public void disable_luan() { |
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
172 isDisabled = true; |
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
173 } |
f7355714742f
add Http.disable_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
174 |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
175 public Object runLuan(String sourceText,String sourceName) throws LuanException { |
1360 | 176 rwLock.readLock().lock(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
177 try { |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
178 Luan luan = currentLuan; |
1335 | 179 synchronized(luanInit) { |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
180 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
181 Luan luan2 = (Luan)cloner.clone(luan); |
1335 | 182 LuanFunction fn = luan2.load(sourceText,sourceName); |
183 return fn.call(); | |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
184 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
185 } finally { |
1360 | 186 rwLock.readLock().unlock(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
187 } |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
188 } |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
189 |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1257
diff
changeset
|
190 public void eval_in_root(String text) throws LuanException { |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1332
diff
changeset
|
191 Luan luan; |
1335 | 192 synchronized(luanInit) { |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
193 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); |
1335 | 194 luan = (Luan)cloner.clone(currentLuan); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
195 } |
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
196 luan.onClose = this; |
1335 | 197 luan.load(text,"<eval_in_root>",null).call(); |
1265
3f4644246e39
LuanHandler cleanup and add Server.serve_for_proxy
Franklin Schmidt <fschmidt@gmail.com>
parents:
1264
diff
changeset
|
198 currentLuan = luan; |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1257
diff
changeset
|
199 } |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1257
diff
changeset
|
200 |
1004
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
201 public static void start(Server server) throws Exception { |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
202 try { |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
203 server.start(); |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
204 } catch(BindException e) { |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
205 throw new LuanException(e.toString()); |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
206 } |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
207 } |
1077
ca968ef1747a
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
800
diff
changeset
|
208 |
1335 | 209 |
210 | |
211 // from HttpServicer | |
212 | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
213 private Response service(Request request,boolean notFound) |
1335 | 214 throws LuanException |
215 { | |
216 try { | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
217 if( !notFound ) |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
218 return serviceLuan(request); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
219 else |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
220 return serviceNotFound(request); |
1335 | 221 } catch(LuanException e) { |
222 return handleError(request,e); | |
223 } | |
224 } | |
225 | |
226 private Response handleError(Request request,LuanException e) | |
227 throws LuanException | |
228 { | |
229 //e.printStackTrace(); | |
230 Luan luan; | |
231 synchronized(luanInit) { | |
232 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); | |
233 luan = (Luan)cloner.clone(currentLuan); | |
234 } | |
235 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan"); | |
236 return (Response)module.fn("handle_error").call( request, e.table(luan) ); | |
237 } | |
238 | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
239 private Response serviceLuan(Request request) |
1335 | 240 throws LuanException |
241 { | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
242 String modName = "site:" + request.path +".luan"; |
1335 | 243 LuanFunction fn; |
244 Luan luan; | |
245 synchronized(luanInit) { | |
246 enableLoad("luan:http/Http.luan",modName); | |
1359 | 247 currentLuan.require("luan:http/Http.luan"); |
1335 | 248 Object mod = PackageLuan.load(currentLuan,modName); |
249 if( mod.equals(Boolean.FALSE) ) | |
250 return null; | |
251 if( !(mod instanceof LuanFunction) ) | |
252 throw new LuanException( "module '"+modName+"' must return a function" ); | |
253 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); | |
254 luan = (Luan)cloner.clone(currentLuan); | |
255 fn = (LuanFunction)cloner.get(mod); | |
256 } | |
257 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan"); | |
258 module.fn("new_request").call(request); | |
259 module.fn("new_response").call(); | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
260 fn.call(); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
261 return (Response)module.fn("finish").call(); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
262 } |
1335 | 263 |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
264 private Response serviceNotFound(Request request) |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
265 throws LuanException |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
266 { |
1359 | 267 LuanFunction fn; |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
268 Luan luan; |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
269 synchronized(luanInit) { |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
270 enableLoad("luan:http/Http.luan"); |
1359 | 271 LuanTable module = (LuanTable)currentLuan.require("luan:http/Http.luan"); |
272 fn = module.fn("not_found_handler"); | |
273 if( fn == null ) | |
274 return null; | |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
275 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
276 luan = (Luan)cloner.clone(currentLuan); |
1359 | 277 fn = (LuanFunction)cloner.get(fn); |
1358
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
278 } |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
279 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan"); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
280 module.fn("new_request").call(request); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
281 module.fn("new_response").call(); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
282 Object obj = Luan.first(fn.call()); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
283 if( !(obj instanceof Boolean) ) |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
284 throw new LuanException("not_found_handler must return boolean"); |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
285 boolean handled = (Boolean)obj; |
1d31c1f3ea30
better not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1351
diff
changeset
|
286 return handled ? (Response)module.fn("finish").call() : null; |
1335 | 287 } |
288 | |
289 private void enableLoad(String... mods) throws LuanException { | |
290 LuanTable loaded = PackageLuan.loaded(currentLuan); | |
291 for( String mod : mods ) { | |
292 if( loaded.rawGet(mod) == null ) { | |
293 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); | |
294 currentLuan = (Luan)cloner.clone(currentLuan); | |
295 break; | |
296 } | |
297 } | |
298 } | |
299 | |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
300 } |