comparison src/luan/lib/HttpLib.java @ 89:8ef2d6701541

improve HttpLib git-svn-id: https://luan-java.googlecode.com/svn/trunk@90 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 28 Feb 2013 09:47:38 +0000
parents 6ca02b188dba
children b1e87f1bcc13
comparison
equal deleted inserted replaced
88:6ca02b188dba 89:8ef2d6701541
3 import java.io.PrintStream; 3 import java.io.PrintStream;
4 import java.io.IOException; 4 import java.io.IOException;
5 import java.util.Map; 5 import java.util.Map;
6 import java.util.Set; 6 import java.util.Set;
7 import java.util.Arrays; 7 import java.util.Arrays;
8 import java.util.Enumeration;
8 import javax.servlet.ServletOutputStream; 9 import javax.servlet.ServletOutputStream;
10 import javax.servlet.http.Cookie;
9 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse; 12 import javax.servlet.http.HttpServletResponse;
11 import luan.LuanState; 13 import luan.LuanState;
12 import luan.LuanFunction; 14 import luan.LuanFunction;
13 import luan.LuanElement; 15 import luan.LuanElement;
14 import luan.LuanException; 16 import luan.LuanException;
15 import luan.LuanTable; 17 import luan.LuanTable;
18 import luan.LuanJavaFunction;
19 import luan.LuanExitException;
16 20
17 21
18 public final class HttpLib { 22 public final class HttpLib {
19 23
20 public static final String NAME = "http"; 24 public static final String NAME = "http";
34 ServletOutputStream sout = response.getOutputStream(); 38 ServletOutputStream sout = response.getOutputStream();
35 luan.out = new PrintStream(sout); 39 luan.out = new PrintStream(sout);
36 40
37 LuanTable module = (LuanTable)luan.loaded().get(NAME); 41 LuanTable module = (LuanTable)luan.loaded().get(NAME);
38 42
39 LuanTable parameters = new LuanTable(); 43 try {
40 LuanTable parameter_lists = new LuanTable(); 44 new HttpLib(request,response,module);
41 @SuppressWarnings("unchecked") 45 } catch(NoSuchMethodException e) {
42 Map<String,String[]> paramMap = request.getParameterMap(); 46 throw new RuntimeException(e);
43 for( Map.Entry<String,String[]> entry : paramMap.entrySet() ) { 47 }
44 String name = entry.getKey();
45 String[] values = entry.getValue();
46 parameters.put(name,values[0]);
47 parameter_lists.put( name, new LuanTable(Arrays.asList((Object[])values)) );
48 }
49 module.put("parameters",parameters);
50 module.put("parameter_lists",parameter_lists);
51 48
52 luan.JAVA.call(fn,FN_NAME); 49 luan.JAVA.call(fn,FN_NAME);
53 } 50 }
54 /* 51
55 private final HttpServletRequest request; 52 private final HttpServletRequest request;
56 private final HttpServletResponse response; 53 private final HttpServletResponse response;
57 54
58 private HttpLib(HttpServletRequest request,HttpServletResponse response) { 55 private HttpLib(HttpServletRequest request,HttpServletResponse response,LuanTable module) throws NoSuchMethodException {
59 this.request = request; 56 this.request = request;
60 this.response = response; 57 this.response = response;
61 } 58
62 */ 59 LuanTable req = new LuanTable();
60 module.put("request",req);
61 LuanTable resp = new LuanTable();
62 module.put("response",resp);
63
64 req.put( "get_parameter", new LuanJavaFunction(HttpServletRequest.class.getMethod("getParameter",String.class),request) );
65 req.put( "get_parameter_values", new LuanJavaFunction(HttpServletRequest.class.getMethod("getParameterValues",String.class),request) );
66 req.put( "get_header", new LuanJavaFunction(HttpServletRequest.class.getMethod("getHeader",String.class),request) );
67 add( req, "get_cookie_value", String.class );
68 req.put( "method", new LuanJavaFunction(HttpServletRequest.class.getMethod("getMethod"),request) );
69 req.put( "servlet_path", new LuanJavaFunction(HttpServletRequest.class.getMethod("getServletPath"),request) );
70 req.put( "server_name", new LuanJavaFunction(HttpServletRequest.class.getMethod("getServerName"),request) );
71 add( req, "current_url" );
72 req.put( "remote_address", new LuanJavaFunction(HttpServletRequest.class.getMethod("getRemoteAddr"),request) );
73
74 add( resp, "send_redirect", String.class );
75 add( resp, "send_error", Integer.TYPE, String.class );
76 resp.put( "set_header", new LuanJavaFunction(HttpServletResponse.class.getMethod("setHeader",String.class,String.class),response) );
77 add( resp, "set_cookie", String.class, String.class, Boolean.TYPE, String.class );
78 add( resp, "remove_cookie", String.class, String.class );
79 }
80
81 private void add(LuanTable t,String method,Class<?>... parameterTypes) throws NoSuchMethodException {
82 t.put( method, new LuanJavaFunction(HttpLib.class.getMethod(method,parameterTypes),this) );
83 }
84
85 public String get_cookie_value(String name) {
86 return getCookieValue(request, name);
87 }
88
89 public String current_url() {
90 return getCurrentURL(request);
91 }
92
93 public void send_redirect(String redirectUrl)
94 throws IOException
95 {
96 response.sendRedirect(redirectUrl);
97 throw new LuanExitException();
98 }
99
100 public void send_error(int code,String text)
101 throws IOException
102 {
103 response.sendError(code, text);
104 throw new LuanExitException();
105 }
106
107 public void set_cookie(String name,String value,boolean isPersistent, String domain) {
108 setCookie(request,response,name,value,isPersistent,domain);
109 }
110
111 public void remove_cookie(String name, String domain) {
112 removeCookie(request,response,name,domain);
113 }
114
115
116 // static utils
117
118 public static String getQueryString(HttpServletRequest request) {
119 return getQueryString(request,0);
120 }
121
122 public static String getQueryString(HttpServletRequest request,int maxValueLen) {
123 String method = request.getMethod();
124 if( method.equals("GET") )
125 return request.getQueryString();
126 if( !method.equals("POST") && !method.equals("HEAD") )
127 throw new RuntimeException(method);
128 Enumeration en = request.getParameterNames();
129 StringBuilder queryBuf = new StringBuilder();
130 if( !en.hasMoreElements() )
131 return null;
132 do {
133 String param = (String)en.nextElement();
134 String value = request.getParameter(param);
135 if( maxValueLen > 0 ) {
136 int len = value.length();
137 if( len > maxValueLen )
138 value = value.substring(0,maxValueLen) + "..." + (len-maxValueLen);
139 }
140 queryBuf.append(param);
141 queryBuf.append('=');
142 queryBuf.append(value);
143 queryBuf.append('&');
144 } while( en.hasMoreElements() );
145 queryBuf.deleteCharAt(queryBuf.length() - 1);
146 return queryBuf.toString();
147 }
148
149 public static String getCurrentURL(HttpServletRequest request) {
150 return getCurrentURL(request,0);
151 }
152
153 public static String getCurrentURL(HttpServletRequest request,int maxValueLen) {
154 // StringBuffer buf = HttpUtils.getRequestURL(request);
155 StringBuffer buf = request.getRequestURL();
156 String qStr = getQueryString(request,maxValueLen);
157 if(qStr != null && qStr.length() > 0) {
158 buf.append('?');
159 buf.append(qStr);
160 }
161 return buf.toString();
162 }
163
164 private static String escape(String value) {
165 return value.replaceAll(";", "%3B");
166 }
167
168 private static String unescape(String value) {
169 return value.replaceAll("%3B", ";");
170 }
171
172 private static Cookie getCookie(HttpServletRequest request,String name) {
173 Cookie[] cookies = request.getCookies();
174 if( cookies == null )
175 return null;
176 for (Cookie cookie : cookies) {
177 if (cookie.getName().equals(name))
178 return cookie;
179 }
180 return null;
181 }
182
183 public static String getCookieValue(HttpServletRequest request,String name) {
184 Cookie cookie = getCookie(request,name);
185 return cookie==null ? null : unescape(cookie.getValue());
186 }
187
188 public static void setCookie(HttpServletRequest request,HttpServletResponse response,String name,String value,boolean isPersistent, String domain) {
189 Cookie cookie = getCookie(request,name);
190 if( cookie==null || !cookie.getValue().equals(value) ) {
191 cookie = new Cookie(name, escape(value));
192 cookie.setPath("/");
193 if (domain != null && domain.length() > 0)
194 cookie.setDomain(domain);
195 if( isPersistent )
196 cookie.setMaxAge(10000000);
197 response.addCookie(cookie);
198 }
199 }
200
201 public static void removeCookie(HttpServletRequest request,
202 HttpServletResponse response,
203 String name,
204 String domain
205
206 ) {
207 Cookie cookie = getCookie(request, name);
208 if(cookie != null) {
209 Cookie delCookie = new Cookie(name, "delete");
210 delCookie.setPath("/");
211 delCookie.setMaxAge(0);
212 if (domain != null && domain.length() > 0)
213 delCookie.setDomain(domain);
214 response.addCookie(delCookie);
215 }
216 }
217
63 } 218 }