Mercurial Hosting > luan
annotate src/luan/modules/http/impl/HttpServicer.java @ 1160:4beabb087be6
add http/impl
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 05 Feb 2018 22:33:59 -0700 |
parents | src/luan/modules/http/jetty/HttpServicer.java@3ef883468fd0 |
children | fef8f0742da9 |
rev | line source |
---|---|
1160 | 1 package luan.modules.http.impl; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
1160 | 3 import java.io.Closeable; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
4 import java.io.IOException; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 import java.util.Map; |
1160 | 6 import java.util.HashMap; |
436 | 7 import org.slf4j.Logger; |
8 import org.slf4j.LoggerFactory; | |
1160 | 9 import luan.webserver.Request; |
10 import luan.webserver.Response; | |
11 import luan.webserver.Status; | |
140
f4ce03ff6b2f
add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
139
diff
changeset
|
12 import luan.Luan; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
13 import luan.LuanState; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 import luan.LuanFunction; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 import luan.LuanException; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 import luan.LuanTable; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
17 import luan.LuanCloner; |
169
9169581dc8fc
add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
168
diff
changeset
|
18 import luan.modules.PackageLuan; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
19 |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
20 |
251
705d14f4d8ee
start web testing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
249
diff
changeset
|
21 public final class HttpServicer { |
436 | 22 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
|
23 |
1160 | 24 public static Response service(LuanState luan,Request request) |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
25 throws LuanException |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
26 { |
1160 | 27 if( request.path.endsWith("/") ) |
28 return null; | |
138
06159094b802
replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
136
diff
changeset
|
29 LuanFunction fn; |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
30 synchronized(luan) { |
1160 | 31 String modName = "site:" + request.path +".luan"; |
798 | 32 PackageLuan.enableLoad(luan,"luan:http/Http.luan",modName); |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
33 LuanTable module = (LuanTable)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
|
34 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
|
35 if( mod.equals(Boolean.FALSE) ) |
1160 | 36 return null; |
505
7bc63886d4f2
web page modules now return a function
Franklin Schmidt <fschmidt@gmail.com>
parents:
504
diff
changeset
|
37 if( !(mod instanceof LuanFunction) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
38 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
|
39 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1154
diff
changeset
|
40 luan = (LuanState)cloner.clone(luan); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1154
diff
changeset
|
41 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
|
42 } |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
138
diff
changeset
|
43 |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
44 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
|
45 |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
46 // request |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
47 LuanFunction newRequestFn = (LuanFunction)module.rawGet("new_request"); |
1160 | 48 newRequestFn.call( luan, new Object[]{request} ); |
49 | |
50 // response | |
51 Response response = new Response(); | |
52 LuanFunction newResponseFn = (LuanFunction)module.rawGet("new_response"); | |
53 LuanTable responseTbl = (LuanTable)newResponseFn.call( luan, new Object[]{response} ); | |
54 | |
55 fn.call(luan); | |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
56 |
1160 | 57 response.status = Status.getStatus( Luan.asInteger(responseTbl.rawGet("status")) ); |
58 LuanTable headersTbl = (LuanTable)responseTbl.rawGet("headers"); | |
59 if( !headersTbl.rawIsEmpty() ) { | |
60 Map headers = (Map)Luan.toJava(headersTbl); | |
61 for( Object obj : headers.entrySet() ) { | |
62 Map.Entry entry = (Map.Entry)obj; | |
63 String name = (String)entry.getKey(); | |
64 Object value = entry.getValue(); | |
65 response.headers.put(name,value); | |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
66 } |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
67 } |
1160 | 68 Closeable writer = (Closeable)responseTbl.rawGet("writer"); |
69 if( writer != null ) { | |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
70 try { |
1160 | 71 ((Closeable)writer).close(); |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
72 } catch(IOException e) { |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
73 throw new RuntimeException(e); |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
74 } |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
75 } |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
76 |
1160 | 77 return response; |
217
a608066395c5
clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
78 } |
a608066395c5
clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
79 |
1160 | 80 public static void setCookie(LuanState luan,Response response,String name,String value,LuanTable attributesTbl) |
81 throws LuanException | |
82 { | |
83 Map<String,String> attributes = new HashMap<String,String>(); | |
84 if( attributesTbl != null ) { | |
85 for( Map.Entry entry : attributesTbl.iterable(luan) ) { | |
86 String key = (String)entry.getKey(); | |
87 if( !(key instanceof String) ) | |
88 throw new LuanException("cookie attribute name must be string"); | |
89 String val = (String)entry.getValue(); | |
90 if( !(val instanceof String) ) | |
91 throw new LuanException("cookie attribute value must be string"); | |
92 attributes.put(key,val); | |
93 } | |
1150
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
94 } |
1160 | 95 response.setCookie(name,value,attributes); |
89
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
96 } |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
97 |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
98 } |