comparison web/src/luan/modules/web/HttpServicer.java @ 413:8937263f59f6

add __pairs; add back HttpServicer.get_parameter_values;
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 29 Apr 2015 19:01:18 -0600
parents 23b99a5039b5
children ce8e19567911
comparison
equal deleted inserted replaced
412:094f37c5e6f9 413:8937263f59f6
3 import java.io.InputStream; 3 import java.io.InputStream;
4 import java.io.BufferedInputStream; 4 import java.io.BufferedInputStream;
5 import java.io.PrintWriter; 5 import java.io.PrintWriter;
6 import java.io.IOException; 6 import java.io.IOException;
7 import java.util.Map; 7 import java.util.Map;
8 import java.util.HashMap;
8 import java.util.AbstractMap; 9 import java.util.AbstractMap;
9 import java.util.Set; 10 import java.util.Set;
10 import java.util.List; 11 import java.util.List;
11 import java.util.ArrayList; 12 import java.util.ArrayList;
12 import java.util.Arrays; 13 import java.util.Arrays;
122 LuanTable tbl = meta.newTable(); 123 LuanTable tbl = meta.newTable();
123 tbl.put("java",request); 124 tbl.put("java",request);
124 LuanTable parameters = new NameMeta() { 125 LuanTable parameters = new NameMeta() {
125 126
126 @Override Object get(String name) { 127 @Override Object get(String name) {
127 String[] a = request.getParameterValues(name); 128 return request.getParameter(name);
128 return a==null ? null : a.length==1 ? a[0] : a; 129 }
129 } 130
130 131 @Override protected Iterator keys() {
131 @Override Iterator<String> names() { 132 return new EnumerationIterator(request.getParameterNames());
132 return new EnumerationIterator<String>(request.getParameterNames());
133 } 133 }
134 /* 134 /*
135 @Override protected String type() { 135 @Override protected String type() {
136 return "request.parameters-table"; 136 return "request.parameters-table";
137 } 137 }
138 */ 138 */
139 }.newTable(); 139 }.newTable();
140 tbl.put( "parameters", parameters ); 140 tbl.put( "parameters", parameters );
141 add( tbl, "get_parameter_values", String.class );
141 LuanTable headers = new NameMeta() { 142 LuanTable headers = new NameMeta() {
142 143
143 @Override Object get(String name) { 144 @Override Object get(String name) {
144 return request.getHeader(name); 145 return request.getHeader(name);
145 } 146 }
146 147
147 @Override Iterator<String> names() { 148 @Override protected Iterator keys() {
148 return new EnumerationIterator<String>(request.getHeaderNames()); 149 return new EnumerationIterator(request.getHeaderNames());
149 } 150 }
150 /* 151 /*
151 @Override protected String type() { 152 @Override protected String type() {
152 return "request.headers-table"; 153 return "request.headers-table";
153 } 154 }
178 if( !(key instanceof String) ) 179 if( !(key instanceof String) )
179 return null; 180 return null;
180 String name = (String)key; 181 String name = (String)key;
181 return getCookieValue(request,name); 182 return getCookieValue(request,name);
182 } 183 }
183 /* 184
184 @Override public final Iterator<Map.Entry<Object,Object>> iterator() { 185 @Override protected Iterator<Object> keys() {
185 return new Iterator<Map.Entry<Object,Object>>() { 186 return new Iterator<Object>() {
186 final Cookie[] cookies = request.getCookies(); 187 final Cookie[] cookies = request.getCookies();
187 int i = 0; 188 int i = 0;
188 189
189 @Override public boolean hasNext() { 190 @Override public boolean hasNext() {
190 return i < cookies.length; 191 return i < cookies.length;
191 } 192 }
192 @Override public Map.Entry<Object,Object> next() { 193 @Override public Object next() {
193 Cookie cookie = cookies[i++]; 194 return cookies[i++].getName();
194 String name = cookie.getName();
195 Object val = unescape(cookie.getValue());
196 return new AbstractMap.SimpleEntry<Object,Object>(name,val);
197 } 195 }
198 @Override public void remove() { 196 @Override public void remove() {
199 throw new UnsupportedOperationException(); 197 throw new UnsupportedOperationException();
200 } 198 }
201 }; 199 };
202 } 200 }
203 201 /*
204 @Override protected String type() { 202 @Override protected String type() {
205 return "request.cookies-table"; 203 return "request.cookies-table";
206 } 204 }
207 */ 205 */
208 }.newTable(); 206 }.newTable();
213 try { 211 try {
214 InputStream in = new BufferedInputStream(request.getInputStream()); 212 InputStream in = new BufferedInputStream(request.getInputStream());
215 final MultiPartInputStream mpis = new MultiPartInputStream(in,contentType,null,null); 213 final MultiPartInputStream mpis = new MultiPartInputStream(in,contentType,null,null);
216 mpis.setDeleteOnExit(true); 214 mpis.setDeleteOnExit(true);
217 parameters = new LuanTable(); 215 parameters = new LuanTable();
216 final Map map = new HashMap();
218 for( Part p : mpis.getParts() ) { 217 for( Part p : mpis.getParts() ) {
219 final MultiPartInputStream.MultiPart part = (MultiPartInputStream.MultiPart)p; 218 final MultiPartInputStream.MultiPart part = (MultiPartInputStream.MultiPart)p;
220 String name = part.getName(); 219 String name = part.getName();
221 Object value; 220 Object value;
222 String filename = part.getContentDispositionFilename(); 221 String filename = part.getContentDispositionFilename();
239 } 238 }
240 } 239 }
241 } ); 240 } );
242 value = partTbl; 241 value = partTbl;
243 } 242 }
244 Object old = parameters.get(name); 243 parameters.put(name,value);
244 Object old = map.get(name);
245 if( old == null ) { 245 if( old == null ) {
246 parameters.put(name,value); 246 map.put(name,value);
247 } else if( old instanceof Object[] ) { 247 } else if( old instanceof Object[] ) {
248 Object[] aOld = (Object[])old; 248 Object[] aOld = (Object[])old;
249 Object[] aNew = new Object[aOld.length+1]; 249 Object[] aNew = new Object[aOld.length+1];
250 System.arraycopy(aOld,0,aNew,0,aOld.length); 250 System.arraycopy(aOld,0,aNew,0,aOld.length);
251 aNew[aOld.length] = value; 251 aNew[aOld.length] = value;
252 parameters.put(name,aNew); 252 map.put(name,aNew);
253 } else { 253 } else {
254 parameters.put(name,new Object[]{old,value}); 254 map.put(name,new Object[]{old,value});
255 } 255 }
256 } 256 }
257 tbl.put( "parameters", parameters ); 257 tbl.put( "parameters", parameters );
258 tbl.put( "get_parameter_values", new LuanFunction() {
259 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
260 return args.length==0 ? null : map.get(args[0]);
261 }
262 } );
258 } catch(IOException e) { 263 } catch(IOException e) {
259 throw new RuntimeException(e); 264 throw new RuntimeException(e);
260 } catch(ServletException e) { 265 } catch(ServletException e) {
261 throw new RuntimeException(e); 266 throw new RuntimeException(e);
262 } 267 }
275 280
276 @Override Object get(String name) { 281 @Override Object get(String name) {
277 return response.getHeader(name); 282 return response.getHeader(name);
278 } 283 }
279 284
280 @Override Iterator<String> names() { 285 @Override protected Iterator keys() {
281 return response.getHeaderNames().iterator(); 286 return response.getHeaderNames().iterator();
282 } 287 }
283 288
284 @Override public boolean canNewindex() { 289 @Override public boolean canNewindex() {
285 return true; 290 return true;
337 342
338 @Override Object get(String name) { 343 @Override Object get(String name) {
339 return request.getSession().getAttribute(name); 344 return request.getSession().getAttribute(name);
340 } 345 }
341 346
342 @Override Iterator<String> names() { 347 @Override protected Iterator keys() {
343 return new EnumerationIterator<String>(request.getSession().getAttributeNames()); 348 return new EnumerationIterator(request.getSession().getAttributeNames());
344 } 349 }
345 350
346 @Override public boolean canNewindex() { 351 @Override public boolean canNewindex() {
347 return true; 352 return true;
348 } 353 }
375 } 380 }
376 } 381 }
377 */ 382 */
378 public LuanTable text_writer() throws IOException { 383 public LuanTable text_writer() throws IOException {
379 return IoLuan.textWriter(response.getWriter()); 384 return IoLuan.textWriter(response.getWriter());
385 }
386
387 public Object[] get_parameter_values(String name) {
388 return request.getParameterValues(name);
380 } 389 }
381 390
382 public void send_redirect(String redirectUrl) 391 public void send_redirect(String redirectUrl)
383 throws IOException 392 throws IOException
384 { 393 {
513 522
514 523
515 524
516 // util classes 525 // util classes
517 526
518 static final class EnumerationIterator<E> implements Iterator<E> { 527 static final class EnumerationIterator implements Iterator {
519 private final Enumeration<E> en; 528 private final Enumeration en;
520 529
521 EnumerationIterator(Enumeration<E> en) { 530 EnumerationIterator(Enumeration en) {
522 this.en = en; 531 this.en = en;
523 } 532 }
524 533
525 @Override public boolean hasNext() { 534 @Override public boolean hasNext() {
526 return en.hasMoreElements(); 535 return en.hasMoreElements();
527 } 536 }
528 537
529 @Override public E next() { 538 @Override public Object next() {
530 return en.nextElement(); 539 return en.nextElement();
531 } 540 }
532 541
533 @Override public void remove() { 542 @Override public void remove() {
534 throw new UnsupportedOperationException(); 543 throw new UnsupportedOperationException();
535 } 544 }
536 } 545 }
537 546
538 private static abstract class NameMeta extends LuanMeta { 547 private static abstract class NameMeta extends LuanMeta {
539 abstract Object get(String name); 548 abstract Object get(String name);
540 abstract Iterator<String> names();
541 549
542 @Override public Object __index(LuanState luan,LuanTable tbl,Object key) { 550 @Override public Object __index(LuanState luan,LuanTable tbl,Object key) {
543 if( !(key instanceof String) ) 551 if( !(key instanceof String) )
544 return null; 552 return null;
545 String name = (String)key; 553 String name = (String)key;
546 return get(name); 554 return get(name);
547 } 555 }
548 /* 556
549 @Override public final Iterator<Map.Entry<Object,Object>> iterator() {
550 return new Iterator<Map.Entry<Object,Object>>() {
551 Iterator<String> names = names();
552
553 @Override public boolean hasNext() {
554 return names.hasNext();
555 }
556 @Override public Map.Entry<Object,Object> next() {
557 String name = names.next();
558 Object val = get(name);
559 return new AbstractMap.SimpleEntry<Object,Object>(name,val);
560 }
561 @Override public void remove() {
562 throw new UnsupportedOperationException();
563 }
564 };
565 }
566 */
567 }; 557 };
568 558
569 private static String string(Object value) { 559 private static String string(Object value) {
570 if( !(value instanceof String) ) 560 if( !(value instanceof String) )
571 throw new IllegalArgumentException("value must be string"); 561 throw new IllegalArgumentException("value must be string");