annotate src/luan/modules/http/HttpServicer.java @ 1000:32d4b569567c

simplify handle()
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 19 Oct 2016 04:22:51 -0600
parents 3dcc52e17535
children 0d884377e923
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;
810
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
8 import java.util.LinkedHashMap;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9 import java.util.Set;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
10 import java.util.List;
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
11 import java.util.ArrayList;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
12 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
13 import java.util.Iterator;
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
14 import java.util.Enumeration;
626
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
15 import java.util.concurrent.Executor;
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
16 import java.util.concurrent.Executors;
810
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
17 import java.util.concurrent.atomic.AtomicInteger;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
18 import javax.servlet.ServletOutputStream;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
19 import javax.servlet.ServletException;
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
20 import javax.servlet.http.Cookie;
1000
32d4b569567c simplify handle()
Franklin Schmidt <fschmidt@gmail.com>
parents: 859
diff changeset
21 import org.eclipse.jetty.server.Request;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
22 import javax.servlet.http.HttpServletResponse;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
23 import javax.servlet.http.Part;
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
24 import org.slf4j.Logger;
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
25 import org.slf4j.LoggerFactory;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
26 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
27 import luan.Luan;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
28 import luan.LuanState;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
29 import luan.LuanFunction;
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;
796
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
32 //import luan.LuanPropertyMeta;
781
fbbdd369a13a rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
33 import luan.LuanCloner;
169
9169581dc8fc add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 168
diff changeset
34 import luan.modules.PackageLuan;
9169581dc8fc add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 168
diff changeset
35 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
36 import luan.modules.TableLuan;
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
37 import luan.modules.Utils;
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
38 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
39
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
40
251
705d14f4d8ee start web testing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 249
diff changeset
41 public final class HttpServicer {
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
42 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
43
810
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
44 public static long sessionTimeout = 60*60*1000L; // one hour
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
45 private static AtomicInteger sessionCounter = new AtomicInteger();
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
46 private static Map<String,LuanState> sessionMap = new LinkedHashMap<String,LuanState>() {
814
Franklin Schmidt <fschmidt@gmail.com>
parents: 810
diff changeset
47 @Override protected boolean removeEldestEntry(Map.Entry<String,LuanState> eldest) {
810
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
48 return (Long)eldest.getValue().registry().get("sessionTimeout") < System.currentTimeMillis();
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
49 }
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
50 };
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
51
1000
32d4b569567c simplify handle()
Franklin Schmidt <fschmidt@gmail.com>
parents: 859
diff changeset
52 public static boolean service(LuanState luan,Request 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
53 throws LuanException
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
54 {
138
06159094b802 replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 136
diff changeset
55 LuanFunction fn;
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
56 synchronized(luan) {
798
9eccfede1094 fix cloning bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 796
diff changeset
57 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
58 LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan");
504
dbdf4b8193a8 add Http.per_session()
Franklin Schmidt <fschmidt@gmail.com>
parents: 500
diff changeset
59 LuanTable per_session_pages = (LuanTable)module.rawGet("per_session_pages");
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 173
diff changeset
60 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
61 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
62 return false;
505
7bc63886d4f2 web page modules now return a function
Franklin Schmidt <fschmidt@gmail.com>
parents: 504
diff changeset
63 if( !(mod instanceof LuanFunction) )
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
64 throw new LuanException( "module '"+modName+"' must return a function" );
504
dbdf4b8193a8 add Http.per_session()
Franklin Schmidt <fschmidt@gmail.com>
parents: 500
diff changeset
65 if( Boolean.TRUE.equals(per_session_pages.rawGet(mod)) ) {
810
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
66 LuanState sessionLuan = null;
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
67 Cookie cookie = getCookie(request,"session");
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
68 if( cookie != null )
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
69 sessionLuan = sessionMap.get(cookie.getValue());
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
70 if( sessionLuan!=null ) {
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
71 luan = sessionLuan;
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
72 } else {
785
d69d3c51c44e more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents: 782
diff changeset
73 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
782
655280eab1e2 start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents: 781
diff changeset
74 luan = (LuanState)cloner.clone(luan);
810
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
75 luan.registry().put( "sessionTimeout", System.currentTimeMillis() + sessionTimeout );
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
76 String key = Integer.toString(sessionCounter.incrementAndGet());
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
77 setCookie(request,response,"session",key,false,null);
022ff91bde60 fix session pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 799
diff changeset
78 sessionMap.put(key,luan);
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
79 }
505
7bc63886d4f2 web page modules now return a function
Franklin Schmidt <fschmidt@gmail.com>
parents: 504
diff changeset
80 fn = (LuanFunction)PackageLuan.require(luan,modName);
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
81 } else {
787
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 785
diff changeset
82 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
782
655280eab1e2 start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents: 781
diff changeset
83 luan = (LuanState)cloner.clone(luan);
505
7bc63886d4f2 web page modules now return a function
Franklin Schmidt <fschmidt@gmail.com>
parents: 504
diff changeset
84 fn = (LuanFunction)cloner.get(mod);
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
85 }
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
86 }
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
87
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
88 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
89
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
90 // request
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
91 LuanFunction newRequestFn = (LuanFunction)module.rawGet("new_request");
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
92 LuanTable requestTbl = (LuanTable)newRequestFn.call(luan);
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
93 module.rawPut("request",requestTbl);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
94 requestTbl.rawPut("java",request);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
95 requestTbl.rawPut("method",request.getMethod());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
96 requestTbl.rawPut("path",request.getRequestURI());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
97 requestTbl.rawPut("protocol",request.getProtocol());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
98 requestTbl.rawPut("scheme",request.getScheme());
732
d7371dc8c2e7 add Http.request.port
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
99 requestTbl.rawPut("port",request.getServerPort());
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
100
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
101 LuanTable headersTbl = (LuanTable)requestTbl.rawGet("headers");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
102 for( Enumeration<String> enKeys = request.getHeaderNames(); enKeys.hasMoreElements(); ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
103 String key = enKeys.nextElement();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
104 LuanTable values = new LuanTable();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
105 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
106 values.rawPut(values.rawLength()+1,en.nextElement());
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
107 }
500
ab9c2afefb47 add response.binary_writer
Franklin Schmidt <fschmidt@gmail.com>
parents: 499
diff changeset
108 key = toLuanHeaderName(key);
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
109 headersTbl.rawPut(key,values);
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
110 }
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
111
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
112 LuanTable parametersTbl = (LuanTable)requestTbl.rawGet("parameters");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
113 String contentType = request.getContentType();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
114 if( contentType==null || !contentType.startsWith("multipart/form-data") ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
115 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
116 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
117 }
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
118 } else { // multipart
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
119 try {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
120 InputStream in = new BufferedInputStream(request.getInputStream());
859
3dcc52e17535 simplify multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 814
diff changeset
121 final MultiPartInputStream mpis = new MultiPartInputStream(in,contentType);
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
122 for( Part p : mpis.getParts() ) {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
123 final MultiPartInputStream.MultiPart part = (MultiPartInputStream.MultiPart)p;
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
124 String name = part.getName();
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
125 /*
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
126 System.out.println("name = "+name);
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
127 System.out.println("getContentType = "+part.getContentType());
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
128 System.out.println("getHeaderNames = "+part.getHeaderNames());
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
129 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
130 System.out.println();
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
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 Object value;
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
133 String filename = part.getContentDispositionFilename();
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
134 if( filename == null ) {
362
9dbf3433f70f remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents: 361
diff changeset
135 value = new String(part.getBytes());
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
136 } else {
796
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
137 /*
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
138 LuanTable partTbl = LuanPropertyMeta.INSTANCE.newTable();
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
139 partTbl.rawPut("filename",filename);
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
140 partTbl.rawPut("content_type",part.getContentType());
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
141 LuanPropertyMeta.INSTANCE.getters(partTbl).rawPut( "content", new LuanFunction() {
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
142 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
143 try {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
144 InputStream in = part.getInputStream();
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
145 byte[] content = Utils.readAll(in);
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
146 in.close();
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
147 return content;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
148 } catch(IOException e) {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
149 throw new RuntimeException(e);
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
150 }
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
151 }
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
152 } );
796
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
153 */
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
154 LuanTable partTbl = new LuanTable();
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
155 partTbl.rawPut("filename",filename);
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
156 partTbl.rawPut("content_type",part.getContentType());
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
157 LuanTable mt = new LuanTable();
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
158 partTbl.setMetatable(mt);
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
159 mt.rawPut( "__index", new LuanFunction() {
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
160 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
161 Object key = args[1];
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
162 if( "content".equals(key) ) {
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
163 try {
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
164 InputStream in = part.getInputStream();
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
165 byte[] content = Utils.readAll(in);
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
166 in.close();
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
167 return content;
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
168 } catch(IOException e) {
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
169 throw new RuntimeException(e);
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
170 }
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
171 }
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
172 return null;
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
173 }
6b8ea0a9b7c9 remove LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents: 793
diff changeset
174 } );
362
9dbf3433f70f remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents: 361
diff changeset
175 value = partTbl;
9dbf3433f70f remove Http.request.get_parameter_values and Http.request.parts;
Franklin Schmidt <fschmidt@gmail.com>
parents: 361
diff changeset
176 }
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
177 LuanTable list = (LuanTable)parametersTbl.rawGet(name);
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
178 if( list == null ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
179 list = new LuanTable();
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
180 parametersTbl.rawPut(name,list);
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
181 }
514
7d1afc73f835 fix multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 505
diff changeset
182 list.rawPut(parametersTbl.rawLength()+1,value);
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
183 }
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
184 } catch(IOException e) {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
185 throw new RuntimeException(e);
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
186 } catch(ServletException e) {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
187 throw new RuntimeException(e);
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
188 }
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
189 }
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
190
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
191 LuanTable cookieTbl = (LuanTable)requestTbl.rawGet("cookie");
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
192 for( Cookie cookie : request.getCookies() ) {
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
193 cookieTbl.rawPut( cookie.getName(), unescape(cookie.getValue()) );
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
194 }
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
195
498
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
196
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
197 // response
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
198 LuanTable responseTbl = new LuanTable();
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
199 responseTbl.rawPut("java",response);
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
200 LuanFunction newResponseFn = (LuanFunction)module.rawGet("new_response");
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
201 newResponseFn.call( luan, new Object[]{responseTbl} );
498
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
202 module.rawPut("response",responseTbl);
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
203
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
204 fn.call(luan);
626
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
205 handle_run_later(luan);
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
206 return true;
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
207 }
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
208
568
aa17ad66a370 fix http response headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 514
diff changeset
209 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
210 int status = Luan.asInteger(responseTbl.rawGet("status"));
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
211 response.setStatus(status);
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
212 LuanTable responseHeaders = (LuanTable)responseTbl.rawGet("headers");
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
213 for( Map.Entry<Object,Object> entry : responseHeaders.rawIterable() ) {
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
214 String name = (String)entry.getKey();
500
ab9c2afefb47 add response.binary_writer
Franklin Schmidt <fschmidt@gmail.com>
parents: 499
diff changeset
215 name = toHttpHeaderName(name);
498
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
216 LuanTable values = (LuanTable)entry.getValue();
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
217 for( Object value : values.asList() ) {
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
218 if( value instanceof String ) {
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
219 response.setHeader(name,(String)value);
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
220 continue;
223
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
221 }
498
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
222 Integer i = Luan.asInteger(value);
223
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
223 if( i != null ) {
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
224 response.setIntHeader(name,i);
498
ee55be414a34 Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
225 continue;
223
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
226 }
a9fe265dbac3 upgrade to jetty 8
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 222
diff changeset
227 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
228 }
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
229 }
217
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
230 }
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
231
89
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
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
234 // static utils
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
235
500
ab9c2afefb47 add response.binary_writer
Franklin Schmidt <fschmidt@gmail.com>
parents: 499
diff changeset
236 public static String toLuanHeaderName(String httpName) {
ab9c2afefb47 add response.binary_writer
Franklin Schmidt <fschmidt@gmail.com>
parents: 499
diff changeset
237 return httpName.toLowerCase().replace('-','_');
ab9c2afefb47 add response.binary_writer
Franklin Schmidt <fschmidt@gmail.com>
parents: 499
diff changeset
238 }
ab9c2afefb47 add response.binary_writer
Franklin Schmidt <fschmidt@gmail.com>
parents: 499
diff changeset
239
ab9c2afefb47 add response.binary_writer
Franklin Schmidt <fschmidt@gmail.com>
parents: 499
diff changeset
240 public static String toHttpHeaderName(String luanName) {
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 696
diff changeset
241 /*
499
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
242 StringBuilder buf = new StringBuilder();
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
243 boolean capitalize = true;
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
244 char[] a = luanName.toCharArray();
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
245 for( int i=0; i<a.length; i++ ) {
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
246 char c = a[i];
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
247 if( c == '_' ) {
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
248 a[i] = '-';
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
249 capitalize = true;
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
250 } else if( capitalize ) {
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
251 a[i] = Character.toUpperCase(c);
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
252 capitalize = false;
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
253 }
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
254 }
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
255 return String.valueOf(a);
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 696
diff changeset
256 */
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 696
diff changeset
257 return LuanUrl.toHttpHeaderName(luanName);
499
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
258 }
fa4af530697f add http/dump
Franklin Schmidt <fschmidt@gmail.com>
parents: 498
diff changeset
259
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
260 private static String escape(String value) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
261 return value.replaceAll(";", "%3B");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
262 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
263
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
264 private static String unescape(String value) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
265 return value.replaceAll("%3B", ";");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
266 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
267
1000
32d4b569567c simplify handle()
Franklin Schmidt <fschmidt@gmail.com>
parents: 859
diff changeset
268 private static Cookie getCookie(Request request,String name) {
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
269 Cookie[] cookies = request.getCookies();
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
270 if( cookies == null )
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
271 return null;
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
272 for (Cookie cookie : cookies) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
273 if (cookie.getName().equals(name))
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
274 return cookie;
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 return null;
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
1000
32d4b569567c simplify handle()
Franklin Schmidt <fschmidt@gmail.com>
parents: 859
diff changeset
279 public static void setCookie(Request request,HttpServletResponse response,String name,String value,boolean isPersistent, String domain) {
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
280 Cookie cookie = getCookie(request,name);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
281 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
282 cookie = new Cookie(name, escape(value));
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
283 cookie.setPath("/");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
284 if (domain != null && domain.length() > 0)
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
285 cookie.setDomain(domain);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
286 if( isPersistent )
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
287 cookie.setMaxAge(10000000);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
288 response.addCookie(cookie);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
289 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
290 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
291
1000
32d4b569567c simplify handle()
Franklin Schmidt <fschmidt@gmail.com>
parents: 859
diff changeset
292 public static void removeCookie(Request request,
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
293 HttpServletResponse response,
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
294 String name,
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
295 String domain
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 Cookie cookie = getCookie(request, name);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
298 if(cookie != null) {
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
299 Cookie delCookie = new Cookie(name, "delete");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
300 delCookie.setPath("/");
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
301 delCookie.setMaxAge(0);
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 delCookie.setDomain(domain);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
304 response.addCookie(delCookie);
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
305 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
306 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
307
626
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
308
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
309
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
310 private static String RUN_LATER_KEY = "Http.run_later";
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
311 private static final Executor exec = Executors.newSingleThreadExecutor();
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
312
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
313 public static void run_later(final LuanState luan,final LuanFunction fn,final Object... args) {
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
314 List list = (List)luan.registry().get(RUN_LATER_KEY);
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
315 if( list == null ) {
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
316 list = new ArrayList();
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
317 luan.registry().put(RUN_LATER_KEY,list);
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
318 }
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
319 list.add(
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
320 new Runnable(){public void run() {
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
321 try {
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
322 fn.call(luan,args);
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
323 } catch(LuanException e) {
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
324 e.printStackTrace();
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
325 }
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
326 }}
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
327 );
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
328 }
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
329
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
330 private static void handle_run_later(LuanState luan) {
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
331 List list = (List)luan.registry().get(RUN_LATER_KEY);
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
332 if( list==null )
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
333 return;
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
334 for( Object obj : list ) {
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
335 exec.execute((Runnable)obj);
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
336 }
53a50c70c5e2 add Luan.assert_function() and Http.run_later()
Franklin Schmidt <fschmidt@gmail.com>
parents: 578
diff changeset
337 }
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
338 }