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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1136
d30d400fd43d add http/jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
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
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
22 import org.slf4j.Logger;
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
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
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
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
9eccfede1094 fix cloning bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 796
diff changeset
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
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
113 LuanTable partTbl = new LuanTable();
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
114 partTbl.rawPut("filename",filename);
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
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
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
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 }