annotate core/src/luan/modules/LuanUrl.java @ 723:eaf30d5aaf6a

handle url headers
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 03 Jun 2016 18:43:27 -0600
parents 647602e8291a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan.modules;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.io.InputStream;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import java.io.InputStreamReader;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import java.io.OutputStream;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 import java.io.Reader;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 import java.io.IOException;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 import java.io.UnsupportedEncodingException;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import java.net.URL;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import java.net.URLConnection;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 import java.net.HttpURLConnection;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 import java.net.URLEncoder;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 import java.util.Map;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 import java.util.HashMap;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 import java.util.List;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 import java.util.Base64;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 import luan.LuanState;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 import luan.LuanTable;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 import luan.LuanJavaFunction;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20 import luan.LuanException;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 public final class LuanUrl extends IoLuan.LuanIn {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 private static enum Method { GET, POST, DELETE }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 private URL url;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 private Method method = Method.GET;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 private Map headers;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 private String content;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 LuanUrl(LuanState luan,URL url,LuanTable options) throws LuanException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 this.url = url;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 if( options != null ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 Map map = options.asMap(luan);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 String methodStr = getString(map,"method");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 if( methodStr != null ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 methodStr = methodStr.toUpperCase();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 try {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 this.method = Method.valueOf(methodStr);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 } catch(IllegalArgumentException e) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 throw new LuanException( "invalid method: "+methodStr );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 }
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
44 Map headerMap = getMap(luan,map,"headers");
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
45 if( headerMap != null ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
46 headers = new HashMap();
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
47 for( Object hack : headerMap.entrySet() ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
48 Map.Entry entry = (Map.Entry)hack;
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
49 String key = (String)entry.getKey();
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
50 Object val = entry.getValue();
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
51 String name = toHttpHeaderName(key);
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
52 if( val instanceof String ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
53 headers.put(name,val);
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
54 } else {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
55 if( !(val instanceof LuanTable) )
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
56 throw new LuanException( "header '"+key+"' must be string or table" );
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
57 LuanTable t = (LuanTable)val;
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
58 if( !t.isList() )
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
59 throw new LuanException( "header '"+key+"' table must be list" );
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
60 headers.put(name,t.asList());
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
61 }
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
62 }
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
63 }
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 Map auth = getMap(luan,map,"authorization");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 if( auth != null ) {
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
66 if( headers!=null && headers.containsKey("Authorization") )
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
67 throw new LuanException( "can't define authorization with header 'Authorization' defined" );
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 String user = getString(auth,"user");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 String password = getString(auth,"password");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 if( !auth.isEmpty() )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 throw new LuanException( "unrecognized authorization options: "+auth );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 StringBuilder sb = new StringBuilder();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 if( user != null )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 sb.append(user);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 sb.append(':');
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 if( password != null )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 sb.append(password);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 String val = "Basic " + Base64.getEncoder().encodeToString(sb.toString().getBytes());
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 if( headers == null )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 headers = new HashMap();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 headers.put("Authorization",val);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 Map params = getMap(luan,map,"parameters");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 if( params != null ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 StringBuilder sb = new StringBuilder();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 for( Object hack : params.entrySet() ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 Map.Entry entry = (Map.Entry)hack;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 String key = (String)entry.getKey();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 Object val = entry.getValue();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 String keyEnc = encode(key);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 if( val instanceof String ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92 and(sb);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93 sb.append( keyEnc ).append( '=' ).append( encode((String)val) );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 } else {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95 if( !(val instanceof LuanTable) )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96 throw new LuanException( "parameter '"+key+"' must be string or table" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97 LuanTable t = (LuanTable)val;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98 if( !t.isList() )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99 throw new LuanException( "parameter '"+key+"' table must be list" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 for( Object obj : t.asList() ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101 if( !(obj instanceof String) )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 throw new LuanException( "parameter '"+key+"' values must be strings" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 and(sb);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 sb.append( keyEnc ).append( '=' ).append( encode((String)obj) );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 if( this.method==Method.DELETE )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 throw new LuanException( "the DELETE method cannot take parameters" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 if( this.method==Method.POST ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 content = sb.toString();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112 } else { // GET
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
113 String urlS = this.url.toString();
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114 if( urlS.indexOf('?') == -1 ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 urlS += '?';
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 } else {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 urlS += '&';
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 urlS += sb;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 try {
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
121 this.url = new URL(urlS);
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
122 } catch(IOException e) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
123 throw new RuntimeException(e);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
124 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 if( !map.isEmpty() )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 throw new LuanException( "unrecognized options: "+map );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
132 public static String toHttpHeaderName(String luanName) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
133 luanName = luanName.toLowerCase();
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
134 StringBuilder buf = new StringBuilder();
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
135 boolean capitalize = true;
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
136 char[] a = luanName.toCharArray();
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
137 for( int i=0; i<a.length; i++ ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
138 char c = a[i];
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
139 if( c == '_' || c == '-' ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
140 a[i] = '-';
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
141 capitalize = true;
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
142 } else if( capitalize ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
143 a[i] = Character.toUpperCase(c);
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
144 capitalize = false;
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
145 }
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
146 }
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
147 return String.valueOf(a);
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
148 }
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
149
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
150 private static void and(StringBuilder sb) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
151 if( sb.length() > 0 )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
152 sb.append('&');
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
153 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 private static String encode(String s) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 try {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 return URLEncoder.encode(s,"UTF-8");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158 } catch(UnsupportedEncodingException e) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 throw new RuntimeException(e);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 private static String getString(Map map,String key) throws LuanException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 Object val = map.remove(key);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 if( val!=null && !(val instanceof String) )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 throw new LuanException( "parameter '"+key+"' must be a string" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 return (String)val;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 private static LuanTable getTable(Map map,String key) throws LuanException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 Object val = map.remove(key);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 if( val!=null && !(val instanceof LuanTable) )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 throw new LuanException( "parameter '"+key+"' must be a table" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 return (LuanTable)val;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 private static Map getMap(LuanState luan,Map map,String key) throws LuanException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178 LuanTable t = getTable(map,key);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 return t==null ? null : t.asMap(luan);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182 @Override InputStream inputStream() throws IOException, LuanException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183 URLConnection con = url.openConnection();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 if( headers != null ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 for( Object hack : headers.entrySet() ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 Map.Entry entry = (Map.Entry)hack;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 String key = (String)entry.getKey();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 Object val = entry.getValue();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 if( val instanceof String ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190 con.addRequestProperty(key,(String)val);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
191 } else {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
192 List list = (List)val;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
193 for( Object obj : list ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
194 con.addRequestProperty(key,(String)obj);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
197 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
198 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199 if( method==Method.GET ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 return con.getInputStream();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 HttpURLConnection httpCon = (HttpURLConnection)con;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 if( method==Method.DELETE ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 httpCon.setRequestMethod("DELETE");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207 return httpCon.getInputStream();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
208 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 // POST
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
211
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212 // httpCon.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213 httpCon.setDoOutput(true);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214 httpCon.setRequestMethod("POST");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216 byte[] post = content.getBytes();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 // httpCon.setRequestProperty("Content-Length",Integer.toString(post.length));
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
218 OutputStream out = httpCon.getOutputStream();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219 out.write(post);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
220 out.flush();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
221 try {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 try {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 return httpCon.getInputStream();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
224 } catch(IOException e) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 InputStream is = httpCon.getErrorStream();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226 if( is == null )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227 throw e;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 Reader in = new InputStreamReader(is);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
229 String msg = Utils.readAll(in);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
230 in.close();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 throw new LuanException(msg,e);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
232 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
233 } finally {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
234 out.close();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
235 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
236 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
237
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
238 @Override public String to_string() {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
239 return url.toString();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
240 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
241
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 @Override public String to_uri_string() {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 return url.toString();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
245 /*
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
246 public String post(String postS) throws IOException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
247 return new UrlCall(url).post(postS);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
248 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
249
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250 @Override public LuanTable table() {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 LuanTable tbl = super.table();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252 try {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
253 tbl.rawPut( "post", new LuanJavaFunction(
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254 LuanUrl.class.getMethod( "post", String.class ), this
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
255 ) );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
256 } catch(NoSuchMethodException e) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
257 throw new RuntimeException(e);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
258 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 return tbl;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
261 */
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
262 }