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