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