Mercurial Hosting > luan
annotate src/luan/modules/http/LuanHandler.java @ 1186:ef8cd42e23d5
add back reset_luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 21 Feb 2018 21:50:20 -0700 |
parents | 94cf2576a922 |
children | 9f522cfe0c30 |
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 |
1160 | 3 import java.io.Writer; |
4 import java.io.PrintWriter; | |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 import java.io.IOException; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
6 import java.lang.reflect.Method; |
1004
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
7 import java.net.BindException; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
8 import java.util.concurrent.locks.ReadWriteLock; |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
9 import java.util.concurrent.locks.ReentrantReadWriteLock; |
280
2164b4479661
log web exceptions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
264
diff
changeset
|
10 import org.slf4j.Logger; |
2164b4479661
log web exceptions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
264
diff
changeset
|
11 import org.slf4j.LoggerFactory; |
1160 | 12 import luan.webserver.Request; |
13 import luan.webserver.Response; | |
14 import luan.webserver.Server; | |
15 import luan.webserver.Handler; | |
16 import luan.webserver.Status; | |
17 import luan.webserver.ResponseOutputStream; | |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
18 import luan.Luan; |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
19 import luan.LuanState; |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
20 import luan.LuanTable; |
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
21 import luan.LuanFunction; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
22 import luan.LuanJavaFunction; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
777
diff
changeset
|
23 import luan.LuanCloner; |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
24 import luan.LuanException; |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
25 import luan.modules.PackageLuan; |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
26 |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
27 |
1160 | 28 public class LuanHandler implements Handler { |
1186 | 29 private final LuanState luanInit; |
627
a98812908fbc
add loggerRoot param to LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
531
diff
changeset
|
30 private final Logger logger; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
31 private final ReadWriteLock lock = new ReentrantReadWriteLock(); |
1186 | 32 private LuanState luan; |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
33 |
1186 | 34 private static final Method resetLuanMethod; |
35 static { | |
36 try { | |
37 resetLuanMethod = LuanHandler.class.getMethod("reset_luan"); | |
38 } catch(NoSuchMethodException e) { | |
39 throw new RuntimeException(e); | |
40 } | |
41 } | |
42 | |
43 public LuanHandler(LuanState luan,String loggerRoot) { | |
44 this.luanInit = luan; | |
627
a98812908fbc
add loggerRoot param to LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
531
diff
changeset
|
45 if( loggerRoot==null ) |
a98812908fbc
add loggerRoot param to LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
531
diff
changeset
|
46 loggerRoot = ""; |
a98812908fbc
add loggerRoot param to LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
531
diff
changeset
|
47 logger = LoggerFactory.getLogger(loggerRoot+LuanHandler.class.getName()); |
1186 | 48 try { |
49 LuanTable Http = (LuanTable)PackageLuan.require(luanInit,"luan:http/Http.luan"); | |
50 Http.rawPut( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) ); | |
51 } catch(LuanException e) { | |
52 throw new RuntimeException(e); | |
53 } | |
54 setLuan(); | |
55 } | |
1185
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
56 |
1186 | 57 private void setLuan() { |
1185
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
58 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); |
1186 | 59 luan = (LuanState)cloner.clone(luanInit); |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
60 try { |
1185
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
61 PackageLuan.load(luan,"site:/init.luan"); |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
62 } catch(LuanException e) { |
1185
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
63 String err = e.getLuanStackTraceString(); |
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
64 logger.error(err); |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
65 } |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
66 } |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
67 |
1160 | 68 @Override public Response handle(Request request) { |
1167 | 69 if( request.path.endsWith("/") ) |
70 return null; | |
71 String modName = "site:" + request.path +".luan"; | |
72 return handle(request,modName); | |
73 } | |
74 | |
75 Response handle(Request request,String modName) { | |
791
ca81307adf7c
set thread name in LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
786
diff
changeset
|
76 Thread thread = Thread.currentThread(); |
ca81307adf7c
set thread name in LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
786
diff
changeset
|
77 String oldName = thread.getName(); |
1160 | 78 thread.setName(request.headers.get("host")+request.path); |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
79 lock.readLock().lock(); |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
80 try { |
1167 | 81 Response response = HttpServicer.service(luan,request,modName); |
1160 | 82 return response; |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
83 } catch(LuanException e) { |
777
1460d297e960
add bbcode to blog example
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
84 //e.printStackTrace(); |
1122
e15be31cee92
remove LuanException.getFullMessage()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
85 String err = e.getLuanStackTraceString(); |
280
2164b4479661
log web exceptions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
264
diff
changeset
|
86 logger.error(err); |
1161 | 87 String msg = "Internel Server Error\n\n" + err; |
88 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg ); | |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
89 } finally { |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
90 lock.readLock().unlock(); |
791
ca81307adf7c
set thread name in LuanHandler
Franklin Schmidt <fschmidt@gmail.com>
parents:
786
diff
changeset
|
91 thread.setName(oldName); |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
92 } |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
93 } |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
94 |
1185
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
95 public void close() throws IOException { |
521
8a217fe5b4f3
cleaner LuanState.onClose()
Franklin Schmidt <fschmidt@gmail.com>
parents:
517
diff
changeset
|
96 synchronized(luan) { |
8a217fe5b4f3
cleaner LuanState.onClose()
Franklin Schmidt <fschmidt@gmail.com>
parents:
517
diff
changeset
|
97 luan.close(); |
8a217fe5b4f3
cleaner LuanState.onClose()
Franklin Schmidt <fschmidt@gmail.com>
parents:
517
diff
changeset
|
98 } |
517
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
494
diff
changeset
|
99 } |
1185
94cf2576a922
implement WebHandler for nginx
Franklin Schmidt <fschmidt@gmail.com>
parents:
1171
diff
changeset
|
100 |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
101 public Object call_rpc(String fnName,Object... args) throws LuanException { |
798 | 102 lock.readLock().lock(); |
103 try { | |
104 LuanFunction fn; | |
105 LuanState luan = this.luan; | |
106 synchronized(luan) { | |
107 PackageLuan.enableLoad(luan,"luan:Rpc.luan"); | |
108 LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan"); | |
109 LuanTable fns = (LuanTable)rpc.get(luan,"functions"); | |
110 fn = (LuanFunction)fns.get(luan,fnName); | |
111 if( fn == null ) | |
112 throw new LuanException( "function not found: " + fnName ); | |
113 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); | |
114 luan = (LuanState)cloner.clone(luan); | |
115 fn = (LuanFunction)cloner.get(fn); | |
116 } | |
117 return fn.call(luan,args); | |
118 } finally { | |
119 lock.readLock().unlock(); | |
743
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
120 } |
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
121 } |
2c41f2aec92f
improve Rpc and implement rpc call for local webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
122 |
1186 | 123 public void reset_luan() { |
124 new Thread() { | |
125 public void run() { | |
126 lock.writeLock().lock(); | |
127 try { | |
128 synchronized(luan) { | |
129 luan.close(); | |
130 setLuan(); | |
131 } | |
132 } catch(IOException e) { | |
133 logger.error("reset_luan failed",e); | |
134 } finally { | |
135 lock.writeLock().unlock(); | |
136 } | |
137 } | |
138 }.start(); | |
139 } | |
140 | |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
141 public Object runLuan(String sourceText,String sourceName) throws LuanException { |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
142 LuanFunction fn = Luan.load(sourceText,sourceName); |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
143 synchronized(luan) { |
798 | 144 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
145 LuanState luan = (LuanState)cloner.clone(this.luan); | |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
146 return fn.call(luan); |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
147 } |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
148 } |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
149 |
1004
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
150 public static void start(Server server) throws Exception { |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
151 try { |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
152 server.start(); |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
153 } catch(BindException e) { |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
154 throw new LuanException(e.toString()); |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
155 } |
3fa54d9d19cd
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
156 } |
1077
ca968ef1747a
better handling of BindException
Franklin Schmidt <fschmidt@gmail.com>
parents:
800
diff
changeset
|
157 |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
158 } |