Mercurial Hosting > luan
annotate src/luan/modules/http/HttpServicer.java @ 1263:382c444a6c77
add Http.eval_in_root and Http.handle_error
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 24 Sep 2018 22:06:25 -0600 |
parents | c147e2e877e3 |
children | 3f4644246e39 |
rev | line source |
---|---|
1171 | 1 package luan.modules.http; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
436 | 3 import org.slf4j.Logger; |
4 import org.slf4j.LoggerFactory; | |
1160 | 5 import luan.webserver.Request; |
6 import luan.webserver.Response; | |
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
7 import luan.webserver.Status; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 import luan.LuanState; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
9 import luan.LuanFunction; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
10 import luan.LuanException; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 import luan.LuanTable; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
12 import luan.LuanCloner; |
169
9169581dc8fc
add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
168
diff
changeset
|
13 import luan.modules.PackageLuan; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
16 public final class HttpServicer { |
436 | 17 private static final Logger logger = LoggerFactory.getLogger(HttpServicer.class); |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
173
diff
changeset
|
18 |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
19 public static Response service(LuanState luan,Request request,String modName) { |
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
20 try { |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
21 return serviceLuan(luan,request,modName); |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
22 } catch(LuanException e) { |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
23 return handleError(luan,request,e); |
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
24 } |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
25 } |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
26 |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
27 private static Response handleError(LuanState luan,Request request,LuanException e) { |
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
28 //e.printStackTrace(); |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
29 /* |
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
30 String err = e.getLuanStackTraceString(); |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
31 logger.error(err+"\n"+request.rawHead.trim()+"\n"); |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
32 String msg = "Internel Server Error\n\n" + err; |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
33 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg ); |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
34 */ |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
35 synchronized(luan) { |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
36 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
37 luan = (LuanState)cloner.clone(luan); |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
38 } |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
39 try { |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
40 LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan"); |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
41 LuanFunction fn = (LuanFunction)module.rawGet("handle_error"); |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
42 return (Response)fn.call( luan, new Object[]{request,e.table()} ); |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
43 } catch(LuanException e2) { |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
44 throw new RuntimeException(e2); |
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
45 } |
1256
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
46 } |
c147e2e877e3
allow subclassing of HttpServicer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1240
diff
changeset
|
47 |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
48 private static Response serviceLuan(LuanState luan,Request request,String modName) |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
49 throws LuanException |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
50 { |
138
06159094b802
replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
136
diff
changeset
|
51 LuanFunction fn; |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
52 synchronized(luan) { |
798 | 53 PackageLuan.enableLoad(luan,"luan:http/Http.luan",modName); |
1240 | 54 PackageLuan.require(luan,"luan:http/Http.luan"); |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
173
diff
changeset
|
55 Object mod = PackageLuan.load(luan,modName); |
799
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
56 if( mod.equals(Boolean.FALSE) ) |
1160 | 57 return null; |
505
7bc63886d4f2
web page modules now return a function
Franklin Schmidt <fschmidt@gmail.com>
parents:
504
diff
changeset
|
58 if( !(mod instanceof LuanFunction) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
59 throw new LuanException( "module '"+modName+"' must return a function" ); |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1154
diff
changeset
|
60 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1154
diff
changeset
|
61 luan = (LuanState)cloner.clone(luan); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1154
diff
changeset
|
62 fn = (LuanFunction)cloner.get(mod); |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
63 } |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
138
diff
changeset
|
64 |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
65 LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan"); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
66 |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
67 // request |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
68 LuanFunction newRequestFn = (LuanFunction)module.rawGet("new_request"); |
1160 | 69 newRequestFn.call( luan, new Object[]{request} ); |
70 | |
71 // response | |
72 LuanFunction newResponseFn = (LuanFunction)module.rawGet("new_response"); | |
1163 | 73 newResponseFn.call(luan); |
1160 | 74 |
75 fn.call(luan); | |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
76 |
1163 | 77 LuanFunction finishFn = (LuanFunction)module.rawGet("finish"); |
78 Response response = (Response)finishFn.call(luan); | |
1160 | 79 return response; |
217
a608066395c5
clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
80 } |
a608066395c5
clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
81 |
1263
382c444a6c77
add Http.eval_in_root and Http.handle_error
Franklin Schmidt <fschmidt@gmail.com>
parents:
1256
diff
changeset
|
82 private HttpServicer() {} // never |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
83 } |