Mercurial Hosting > luan
annotate src/luan/modules/http/jetty/HttpServicer.java @ 1159:3ef883468fd0
remove Http.per_session_pages
fix clone closure bug
replace Thread.global with Thread.global_callable()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 05 Feb 2018 12:37:59 -0700 |
parents | bbad9a21277c |
children |
rev | line source |
---|---|
1136 | 1 package luan.modules.http.jetty; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
3 import java.io.InputStream; |
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
4 import java.io.BufferedInputStream; |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
5 import java.io.PrintWriter; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
6 import java.io.IOException; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
7 import java.util.Map; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 import java.util.Set; |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
9 import java.util.List; |
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
10 import java.util.ArrayList; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 import java.util.Arrays; |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
12 import java.util.Iterator; |
89
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
13 import java.util.Enumeration; |
626
53a50c70c5e2
add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
14 import java.util.concurrent.Executor; |
53a50c70c5e2
add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
15 import java.util.concurrent.Executors; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 import javax.servlet.ServletOutputStream; |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
17 import javax.servlet.ServletException; |
89
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
18 import javax.servlet.http.Cookie; |
1080
0d884377e923
eliminate other head
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
19 import javax.servlet.http.HttpServletRequest; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
20 import javax.servlet.http.HttpServletResponse; |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
21 import javax.servlet.http.Part; |
436 | 22 import org.slf4j.Logger; |
23 import org.slf4j.LoggerFactory; | |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
24 import org.eclipse.jetty.util.MultiPartInputStream; |
140
f4ce03ff6b2f
add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
139
diff
changeset
|
25 import luan.Luan; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
26 import luan.LuanState; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
27 import luan.LuanFunction; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
28 import luan.LuanException; |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
29 import luan.LuanTable; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
30 import luan.LuanCloner; |
169
9169581dc8fc
add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
168
diff
changeset
|
31 import luan.modules.PackageLuan; |
9169581dc8fc
add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
168
diff
changeset
|
32 import luan.modules.IoLuan; |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
33 import luan.modules.TableLuan; |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
34 import luan.modules.Utils; |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
35 import luan.modules.url.LuanUrl; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
36 |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
37 |
251
705d14f4d8ee
start web testing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
249
diff
changeset
|
38 public final class HttpServicer { |
436 | 39 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
|
40 |
1080
0d884377e923
eliminate other head
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
41 public static boolean service(LuanState luan,HttpServletRequest request,HttpServletResponse response,String modName) |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
42 throws LuanException |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
43 { |
138
06159094b802
replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
136
diff
changeset
|
44 LuanFunction fn; |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
45 synchronized(luan) { |
798 | 46 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
|
47 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
|
48 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
|
49 if( mod.equals(Boolean.FALSE) ) |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
173
diff
changeset
|
50 return false; |
505
7bc63886d4f2
web page modules now return a function
Franklin Schmidt <fschmidt@gmail.com>
parents:
504
diff
changeset
|
51 if( !(mod instanceof LuanFunction) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
52 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
|
53 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1154
diff
changeset
|
54 luan = (LuanState)cloner.clone(luan); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1154
diff
changeset
|
55 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
|
56 } |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
138
diff
changeset
|
57 |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
58 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
|
59 |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
60 // request |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
61 LuanFunction newRequestFn = (LuanFunction)module.rawGet("new_request"); |
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
62 LuanTable requestTbl = (LuanTable)newRequestFn.call(luan); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
63 module.rawPut("request",requestTbl); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
64 requestTbl.rawPut("java",request); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
65 requestTbl.rawPut("method",request.getMethod()); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
66 requestTbl.rawPut("path",request.getRequestURI()); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
67 requestTbl.rawPut("protocol",request.getProtocol()); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
68 requestTbl.rawPut("scheme",request.getScheme()); |
732
d7371dc8c2e7
add Http.request.port
Franklin Schmidt <fschmidt@gmail.com>
parents:
725
diff
changeset
|
69 requestTbl.rawPut("port",request.getServerPort()); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
70 |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
71 LuanTable headersTbl = (LuanTable)requestTbl.rawGet("headers"); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
72 for( Enumeration<String> enKeys = request.getHeaderNames(); enKeys.hasMoreElements(); ) { |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
73 String key = enKeys.nextElement(); |
1150
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
74 List<String> values = new ArrayList<String>(); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
75 for( Enumeration<String> en = request.getHeaders(key); en.hasMoreElements(); ) { |
1150
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
76 values.add(en.nextElement()); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
77 } |
1150
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
78 int size = values.size(); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
79 if(size==0) throw new RuntimeException(); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
80 key = key.toLowerCase(); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
81 Object value = size==1 ? values.get(0) : new LuanTable(values); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
82 headersTbl.rawPut(key,value); |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
83 } |
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
84 |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
85 LuanTable parametersTbl = (LuanTable)requestTbl.rawGet("parameters"); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
86 String contentType = request.getContentType(); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
87 if( contentType==null || !contentType.startsWith("multipart/form-data") ) { |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
88 for( Map.Entry<String,String[]> entry : request.getParameterMap().entrySet() ) { |
1152
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
89 String[] a = entry.getValue(); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
90 Object value = a.length==1 ? a[0] : new LuanTable(Arrays.asList(a)); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
91 parametersTbl.rawPut(entry.getKey(),value); |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
92 } |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
93 } else { // multipart |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
94 try { |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
95 InputStream in = new BufferedInputStream(request.getInputStream()); |
1080
0d884377e923
eliminate other head
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
96 final MultiPartInputStream mpis = new MultiPartInputStream(in,contentType,null,null); |
0d884377e923
eliminate other head
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
97 mpis.setDeleteOnExit(true); |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
98 for( Part p : mpis.getParts() ) { |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
99 final MultiPartInputStream.MultiPart part = (MultiPartInputStream.MultiPart)p; |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
100 String name = part.getName(); |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
101 /* |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
102 System.out.println("name = "+name); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
103 System.out.println("getContentType = "+part.getContentType()); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
104 System.out.println("getHeaderNames = "+part.getHeaderNames()); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
105 System.out.println("content-disposition = "+part.getHeader("content-disposition")); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
106 System.out.println(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
723
diff
changeset
|
107 */ |
362
9dbf3433f70f
remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents:
361
diff
changeset
|
108 Object value; |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
109 String filename = part.getContentDispositionFilename(); |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
110 if( filename == null ) { |
362
9dbf3433f70f
remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents:
361
diff
changeset
|
111 value = new String(part.getBytes()); |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
112 } else { |
796 | 113 LuanTable partTbl = new LuanTable(); |
114 partTbl.rawPut("filename",filename); | |
115 partTbl.rawPut("content_type",part.getContentType()); | |
1152
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
116 { |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
117 InputStream inPart = part.getInputStream(); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
118 byte[] content = Utils.readAll(inPart); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
119 inPart.close(); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
120 partTbl.rawPut("content",content); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
121 } |
362
9dbf3433f70f
remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents:
361
diff
changeset
|
122 value = partTbl; |
9dbf3433f70f
remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents:
361
diff
changeset
|
123 } |
1152
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
124 Object obj = parametersTbl.rawGet(name); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
125 if( obj == null ) { |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
126 parametersTbl.rawPut(name,value); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
127 } else if( obj instanceof LuanTable && ((LuanTable)obj).isList() ) { |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
128 LuanTable list = (LuanTable)obj; |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
129 list.rawPut(list.rawLength()+1,value); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
130 } else { |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
131 LuanTable list = new LuanTable(); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
132 list.rawPut(1,obj); |
21d157b153fe
change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1150
diff
changeset
|
133 list.rawPut(2,value); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
134 parametersTbl.rawPut(name,list); |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
135 } |
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
136 } |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
137 } catch(IOException e) { |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
138 throw new RuntimeException(e); |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
139 } catch(ServletException e) { |
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
140 throw new RuntimeException(e); |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
141 } |
361
0581238084ad
fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents:
359
diff
changeset
|
142 } |
357
496d61b1fb5a
implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents:
325
diff
changeset
|
143 |
1153
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
144 LuanTable cookieTbl = (LuanTable)requestTbl.rawGet("cookies"); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
145 for( Cookie cookie : request.getCookies() ) { |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
146 cookieTbl.rawPut( cookie.getName(), unescape(cookie.getValue()) ); |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
147 } |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
148 |
498
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
149 |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
150 // response |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
151 LuanTable responseTbl = new LuanTable(); |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
152 responseTbl.rawPut("java",response); |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
153 LuanFunction newResponseFn = (LuanFunction)module.rawGet("new_response"); |
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
154 newResponseFn.call( luan, new Object[]{responseTbl} ); |
498
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
155 module.rawPut("response",responseTbl); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
156 |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
157 fn.call(luan); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
158 return true; |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
159 } |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
496
diff
changeset
|
160 |
568
aa17ad66a370
fix http response headers
Franklin Schmidt <fschmidt@gmail.com>
parents:
514
diff
changeset
|
161 public static void setResponse(LuanTable responseTbl,HttpServletResponse response) throws LuanException { |
498
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
162 int status = Luan.asInteger(responseTbl.rawGet("status")); |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
163 response.setStatus(status); |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
164 LuanTable responseHeaders = (LuanTable)responseTbl.rawGet("headers"); |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
165 for( Map.Entry<Object,Object> entry : responseHeaders.rawIterable() ) { |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
166 String name = (String)entry.getKey(); |
1150
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
167 Object val = entry.getValue(); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
168 if( val instanceof LuanTable ) { |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
169 LuanTable values = (LuanTable)val; |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
170 for( Object value : values.asList() ) { |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
171 setResponse(response,name,value); |
223
a9fe265dbac3
upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
172 } |
1150
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
173 } else { |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
174 setResponse(response,name,val); |
223
a9fe265dbac3
upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
175 } |
436 | 176 } |
217
a608066395c5
clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
177 } |
a608066395c5
clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
178 |
1150
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
179 private static void setResponse(HttpServletResponse response,String name,Object value) throws LuanException { |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
180 if( value instanceof String ) { |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
181 response.setHeader(name,(String)value); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
182 return; |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
183 } |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
184 Integer i = Luan.asInteger(value); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
185 if( i != null ) { |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
186 response.setIntHeader(name,i); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
187 return; |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
188 } |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
189 throw new IllegalArgumentException("value must be string or integer for headers table"); |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
190 } |
0842b9b570f8
change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1136
diff
changeset
|
191 |
89
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
192 |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
193 |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
194 // static utils |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
195 |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
196 private static String escape(String value) { |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
197 return value.replaceAll(";", "%3B"); |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
198 } |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
199 |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
200 private static String unescape(String value) { |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
201 return value.replaceAll("%3B", ";"); |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
202 } |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
203 |
1080
0d884377e923
eliminate other head
Franklin Schmidt <fschmidt@gmail.com>
parents:
1000
diff
changeset
|
204 private static Cookie getCookie(HttpServletRequest request,String name) { |
89
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
205 Cookie[] cookies = request.getCookies(); |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
206 if( cookies == null ) |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
207 return null; |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
208 for (Cookie cookie : cookies) { |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
209 if (cookie.getName().equals(name)) |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
210 return cookie; |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
211 } |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
212 return null; |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
213 } |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
214 |
1153
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
215 public static void setCookie(HttpServletRequest request,HttpServletResponse response,String name,String value,LuanTable attributes) { |
89
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
216 Cookie cookie = getCookie(request,name); |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
217 if( cookie==null || !cookie.getValue().equals(value) ) { |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
218 cookie = new Cookie(name, escape(value)); |
1153
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
219 if( attributes != null ) { |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
220 String path = (String)attributes.rawGet("Path"); |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
221 if( path != null ) |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
222 cookie.setPath(path); |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
223 String domain = (String)attributes.rawGet("Domain"); |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
224 if (domain != null && domain.length() > 0) |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
225 cookie.setDomain(domain); |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
226 String maxAge = (String)attributes.rawGet("Max-Age"); |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
227 if( maxAge != null ) |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
228 cookie.setMaxAge(Integer.parseInt(maxAge)); |
1f4da56abd4f
change http cookies interface
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
229 } |
89
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
230 response.addCookie(cookie); |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
231 } |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
232 } |
8ef2d6701541
improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
233 |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
234 } |