Mercurial Hosting > luan
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"); |