annotate http/src/luan/modules/http/HttpServicer.java @ 497:55f9f74f1e55

Http.request is now pure luan
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 17 May 2015 19:25:47 -0600
parents c65df5b25932
children ee55be414a34
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
494
2b9bc97f0439 change luan:web to luan:http
Franklin Schmidt <fschmidt@gmail.com>
parents: 493
diff changeset
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
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;
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 411
diff changeset
8 import java.util.HashMap;
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
9 import java.util.AbstractMap;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
10 import java.util.Set;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
11 import java.util.List;
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
12 import java.util.ArrayList;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
13 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
14 import java.util.Iterator;
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
15 import java.util.Enumeration;
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;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
19 import javax.servlet.http.HttpServletRequest;
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;
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
21 import javax.servlet.http.HttpSession;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
22 import javax.servlet.http.Part;
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
23 import org.slf4j.Logger;
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
24 import org.slf4j.LoggerFactory;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
25 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
26 import luan.Luan;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
27 import luan.LuanState;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
28 import luan.LuanFunction;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
29 import luan.LuanElement;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
30 import luan.LuanException;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
31 import luan.LuanTable;
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
32 import luan.LuanMeta;
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
33 import luan.LuanJavaFunction;
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
34 import luan.LuanPropertyMeta;
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
35 import luan.DeepCloner;
169
9169581dc8fc add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 168
diff changeset
36 import luan.modules.PackageLuan;
9169581dc8fc add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 168
diff changeset
37 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
38 import luan.modules.TableLuan;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
39 import luan.modules.Utils;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
40
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
41
251
705d14f4d8ee start web testing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 249
diff changeset
42 public final class HttpServicer {
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
43 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
44
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 173
diff changeset
45 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
46 throws LuanException
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
47 {
138
06159094b802 replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 136
diff changeset
48 LuanFunction fn;
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
49 synchronized(luan) {
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 173
diff changeset
50 Object mod = PackageLuan.load(luan,modName);
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 173
diff changeset
51 if( mod==null )
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 173
diff changeset
52 return false;
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
53 if( !(mod instanceof LuanTable) )
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
54 throw luan.exception( "module '"+modName+"' must return a table" );
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
55 LuanTable tbl = (LuanTable)mod;
443
bf5e62a9090c remove toBoolean() and to_boolean()
Franklin Schmidt <fschmidt@gmail.com>
parents: 436
diff changeset
56 if( Boolean.TRUE.equals(tbl.get(luan,"per_session")) ) {
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
57 HttpSession session = request.getSession();
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
58 LuanState sessionLuan = (LuanState)session.getValue("luan");
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
59 if( sessionLuan!=null ) {
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
60 luan = sessionLuan;
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
61 } else {
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
62 DeepCloner cloner = new DeepCloner();
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 428
diff changeset
63 luan = (LuanState)cloner.deepClone(luan);
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
64 session.putValue("luan",luan);
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
65 }
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
66 tbl = (LuanTable)PackageLuan.require(luan,modName);
325
78a6a71afbfd use SimplyHTML
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 313
diff changeset
67 fn = getService(luan,tbl);
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
68 } else {
325
78a6a71afbfd use SimplyHTML
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 313
diff changeset
69 fn = getService(luan,tbl);
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
70 DeepCloner cloner = new DeepCloner();
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 428
diff changeset
71 luan = (LuanState)cloner.deepClone(luan);
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 428
diff changeset
72 fn = (LuanFunction)cloner.get(fn);
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
73 }
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
74 }
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
75
494
2b9bc97f0439 change luan:web to luan:http
Franklin Schmidt <fschmidt@gmail.com>
parents: 493
diff changeset
76 LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http");
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
77
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
78 // request
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
79 LuanTable requestTbl = (LuanTable)luan.call( (LuanFunction)module.rawGet("new_request") );
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
80 module.rawPut("request",requestTbl);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
81 requestTbl.rawPut("java",request);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
82 requestTbl.rawPut("method",request.getMethod());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
83 requestTbl.rawPut("path",request.getRequestURI());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
84 requestTbl.rawPut("protocol",request.getProtocol());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
85 requestTbl.rawPut("scheme",request.getScheme());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
86
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
87 LuanTable headersTbl = (LuanTable)requestTbl.rawGet("headers");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
88 for( Enumeration<String> enKeys = request.getHeaderNames(); enKeys.hasMoreElements(); ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
89 String key = enKeys.nextElement();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
90 key = key.toLowerCase().replace('-','_');
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
91 LuanTable values = new LuanTable();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
92 for( Enumeration<String> en = request.getHeaders(key); en.hasMoreElements(); ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
93 values.rawPut(values.rawLength()+1,en.nextElement());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
94 }
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
95 headersTbl.rawPut(key,values);
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
96 }
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
97
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
98 LuanTable parametersTbl = (LuanTable)requestTbl.rawGet("parameters");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
99 String contentType = request.getContentType();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
100 if( contentType==null || !contentType.startsWith("multipart/form-data") ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
101 for( Map.Entry<String,String[]> entry : request.getParameterMap().entrySet() ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
102 parametersTbl.rawPut(entry.getKey(),new LuanTable(Arrays.asList(entry.getValue())));
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
103 }
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
104 } else { // multipart
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
105 try {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
106 InputStream in = new BufferedInputStream(request.getInputStream());
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
107 final MultiPartInputStream mpis = new MultiPartInputStream(in,contentType,null,null);
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
108 mpis.setDeleteOnExit(true);
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
109 for( Part p : mpis.getParts() ) {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
110 final MultiPartInputStream.MultiPart part = (MultiPartInputStream.MultiPart)p;
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
111 String name = part.getName();
362
9dbf3433f70f remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents: 361
diff changeset
112 Object value;
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
113 String filename = part.getContentDispositionFilename();
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
114 if( filename == null ) {
362
9dbf3433f70f remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents: 361
diff changeset
115 value = new String(part.getBytes());
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
116 } else {
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
117 LuanTable partTbl = LuanPropertyMeta.INSTANCE.newTable();
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
118 partTbl.rawPut("filename",filename);
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
119 partTbl.rawPut("content_type",part.getContentType());
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
120 LuanPropertyMeta.INSTANCE.getters(partTbl).rawPut( "content", new LuanFunction() {
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
121 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
122 try {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
123 InputStream in = part.getInputStream();
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
124 byte[] content = Utils.readAll(in);
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
125 in.close();
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
126 return content;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
127 } catch(IOException e) {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
128 throw new RuntimeException(e);
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
129 }
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
130 }
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
131 } );
362
9dbf3433f70f remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents: 361
diff changeset
132 value = partTbl;
9dbf3433f70f remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents: 361
diff changeset
133 }
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
134 LuanTable list = (LuanTable)parametersTbl.rawGet(name);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
135 if( list == null ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
136 list = new LuanTable();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
137 parametersTbl.rawPut(name,list);
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
138 }
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
139 parametersTbl.rawPut(parametersTbl.rawLength()+1,value);
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
140 }
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
141 } catch(IOException e) {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
142 throw new RuntimeException(e);
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
143 } catch(ServletException e) {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
144 throw new RuntimeException(e);
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
145 }
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
146 }
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
147
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
148 LuanTable cookieTbl = (LuanTable)requestTbl.rawGet("cookie");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
149 for( Cookie cookie : request.getCookies() ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
150 cookieTbl.rawPut( cookie.getName(), unescape(cookie.getValue()) );
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
151 }
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
152
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
153 HttpServicer lib = new HttpServicer(request,response);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
154 try {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
155 module.put( luan, "response", lib.responseTable() );
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
156 } catch(NoSuchMethodException e) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
157 throw new RuntimeException(e);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
158 }
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 luan.call(fn,"<http>");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
161 return true;
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
162 }
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
163
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
164 private static LuanFunction getService(LuanState luan,LuanTable tbl)
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
165 throws LuanException
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
166 {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
167 Object respond = tbl.get(luan,"respond");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
168 if( respond == null )
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
169 throw luan.exception( "function 'respond' is not defined" );
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
170 if( !(respond instanceof LuanFunction) )
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
171 throw luan.exception( "'respond' must be a function but is a " + Luan.type(respond) );
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
172 return (LuanFunction)respond;
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
173 }
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
174
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
175
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
176 private final HttpServletRequest request;
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
177 private final HttpServletResponse response;
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
178
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
179 private HttpServicer(HttpServletRequest request,HttpServletResponse response) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
180 this.request = request;
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
181 this.response = response;
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
182 }
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
183
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
184 private LuanTable responseTable() throws NoSuchMethodException {
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
185 LuanTable tbl = LuanPropertyMeta.INSTANCE.newTable();
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
186 LuanTable getters = LuanPropertyMeta.INSTANCE.getters(tbl);
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
187 LuanTable setters = LuanPropertyMeta.INSTANCE.setters(tbl);
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
188 tbl.rawPut("java",response);
477
b8ddd55c9b11 delete LuanExitException
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
189 tbl.rawPut( "send_redirect", new LuanJavaFunction(
b8ddd55c9b11 delete LuanExitException
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
190 HttpServletResponse.class.getMethod( "sendRedirect", String.class ), response
b8ddd55c9b11 delete LuanExitException
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
191 ) );
b8ddd55c9b11 delete LuanExitException
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
192 tbl.rawPut( "send_error", new LuanJavaFunction(
b8ddd55c9b11 delete LuanExitException
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
193 HttpServletResponse.class.getMethod( "sendError", Integer.TYPE, String.class ), response
b8ddd55c9b11 delete LuanExitException
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
194 ) );
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
195 LuanTable headers = new NameMeta() {
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
196
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
197 @Override Object get(String name) {
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
198 return response.getHeader(name);
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
199 }
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
200
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
201 @Override protected Iterator keys(LuanTable tbl) {
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
202 return response.getHeaderNames().iterator();
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
203 }
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
204
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
205 @Override public boolean canNewindex() {
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
206 return true;
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
207 }
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
208
428
df95199ca4c0 rename __newindex to __new_index
Franklin Schmidt <fschmidt@gmail.com>
parents: 427
diff changeset
209 @Override public void __new_index(LuanState luan,LuanTable tbl,Object key,Object val) {
223
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
210 if( !(key instanceof String) )
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
211 throw new IllegalArgumentException("key must be string for headers table");
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
212 String name = (String)key;
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
213 if( val instanceof String ) {
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
214 response.setHeader(name,(String)val);
224
05eb2837ddbf change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 223
diff changeset
215 return;
223
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
216 }
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
217 Integer i = Luan.asInteger(val);
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
218 if( i != null ) {
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
219 response.setIntHeader(name,i);
224
05eb2837ddbf change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 223
diff changeset
220 return;
223
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
221 }
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
222 throw new IllegalArgumentException("value must be string or integer for headers table");
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
223 }
416
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
224
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
225 @Override protected String type(LuanTable tbl) {
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
226 return "response.headers";
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
227 }
416
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
228
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
229 }.newTable();
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
230 tbl.rawPut( "headers", headers );
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
231 getters.rawPut( "content_type", new LuanJavaFunction(
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
232 HttpServletResponse.class.getMethod( "getContentType" ), response
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
233 ) );
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
234 setters.rawPut( "content_type", new LuanJavaFunction(
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
235 HttpServletResponse.class.getMethod( "setContentType", String.class ), response
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
236 ) );
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
237 getters.rawPut( "character_encoding", new LuanJavaFunction(
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
238 HttpServletResponse.class.getMethod( "getCharacterEncoding" ), response
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
239 ) );
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
240 setters.rawPut( "character_encoding", new LuanJavaFunction(
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
241 HttpServletResponse.class.getMethod( "setCharacterEncoding", String.class ), response
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
242 ) );
217
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
243 add( tbl, "text_writer" );
225
7c768f63bbb3 better cookie API
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 224
diff changeset
244 add( tbl, "set_cookie", String.class, String.class, Boolean.TYPE, String.class );
7c768f63bbb3 better cookie API
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 224
diff changeset
245 add( tbl, "remove_cookie", String.class, String.class );
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
246 try {
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
247 getters.rawPut( "status", new LuanJavaFunction(
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
248 HttpServletResponse.class.getMethod( "getStatus" ), response
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
249 ) );
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
250 } catch(NoSuchMethodException e) {
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
251 logger.info("please upgrade jetty");
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
252 }
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
253 setters.rawPut( "status", new LuanJavaFunction(
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
254 HttpServletResponse.class.getMethod( "setStatus", Integer.TYPE ), response
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
255 ) );
217
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
256 return tbl;
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
257 }
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
258
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
259 private void add(LuanTable t,String method,Class<?>... parameterTypes) throws NoSuchMethodException {
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
260 t.rawPut( method, new LuanJavaFunction(HttpServicer.class.getMethod(method,parameterTypes),this) );
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
261 }
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
262
138
06159094b802 replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 136
diff changeset
263 public LuanTable text_writer() throws IOException {
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
264 return IoLuan.textWriter(response.getWriter());
138
06159094b802 replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 136
diff changeset
265 }
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
266
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
267 public void set_cookie(String name,String value,boolean isPersistent, String domain) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
268 setCookie(request,response,name,value,isPersistent,domain);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
269 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
270
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
271 public void remove_cookie(String name, String domain) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
272 removeCookie(request,response,name,domain);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
273 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
274
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
275
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
276 // static utils
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
277
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
278 private static String escape(String value) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
279 return value.replaceAll(";", "%3B");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
280 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
281
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
282 private static String unescape(String value) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
283 return value.replaceAll("%3B", ";");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
284 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
285
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
286 private static Cookie getCookie(HttpServletRequest request,String name) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
287 Cookie[] cookies = request.getCookies();
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
288 if( cookies == null )
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
289 return null;
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
290 for (Cookie cookie : cookies) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
291 if (cookie.getName().equals(name))
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
292 return cookie;
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
293 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
294 return null;
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
295 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
296
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
297 public static void setCookie(HttpServletRequest request,HttpServletResponse response,String name,String value,boolean isPersistent, String domain) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
298 Cookie cookie = getCookie(request,name);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
299 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
300 cookie = new Cookie(name, escape(value));
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
301 cookie.setPath("/");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
302 if (domain != null && domain.length() > 0)
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
303 cookie.setDomain(domain);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
304 if( isPersistent )
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
305 cookie.setMaxAge(10000000);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
306 response.addCookie(cookie);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
307 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
308 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
309
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
310 public static void removeCookie(HttpServletRequest request,
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
311 HttpServletResponse response,
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
312 String name,
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
313 String domain
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
314 ) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
315 Cookie cookie = getCookie(request, name);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
316 if(cookie != null) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
317 Cookie delCookie = new Cookie(name, "delete");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
318 delCookie.setPath("/");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
319 delCookie.setMaxAge(0);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
320 if (domain != null && domain.length() > 0)
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
321 delCookie.setDomain(domain);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
322 response.addCookie(delCookie);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
323 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
324 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
325
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
326
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
327
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
328 // util classes
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
329
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
330 private static abstract class NameMeta extends LuanMeta {
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
331 abstract Object get(String name);
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
332
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 377
diff changeset
333 @Override public Object __index(LuanState luan,LuanTable tbl,Object key) {
222
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
334 if( !(key instanceof String) )
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
335 return null;
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
336 String name = (String)key;
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
337 return get(name);
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
338 }
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
339
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
340 };
b76fcb72d97d add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 221
diff changeset
341
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
342 }