annotate src/luan/modules/url/LuanUrl.java @ 1364:45363886f256

add url methods
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 29 May 2019 19:03:25 -0600
parents 1a7b8e38921a
children eb8b35dccd99
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
1 package luan.modules.url;
722
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;
1315
5763597ca5c0 add DomainHandler
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
8 import java.io.FileNotFoundException;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import java.io.UnsupportedEncodingException;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import java.net.URL;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 import java.net.URLConnection;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 import java.net.HttpURLConnection;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 import java.net.URLEncoder;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
14 import java.security.MessageDigest;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
15 import java.security.NoSuchAlgorithmException;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 import java.util.Map;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 import java.util.HashMap;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 import java.util.List;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 import java.util.Base64;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
20 import luan.lib.parser.ParseException;
733
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
21 import luan.Luan;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 import luan.LuanTable;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 import luan.LuanJavaFunction;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 import luan.LuanException;
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
25 import luan.modules.IoLuan;
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
26 import luan.modules.Utils;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 public final class LuanUrl extends IoLuan.LuanIn {
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
30
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 private static enum Method { GET, POST, DELETE }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32
1354
Franklin Schmidt <fschmidt@gmail.com>
parents: 1349
diff changeset
33 public final URL url;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 private Method method = Method.GET;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
35 private final Map<String,Object> headers = new HashMap<String,Object>();
1363
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
36 private static final byte[] NO_CONTENT = new byte[0];
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
37 private byte[] content = NO_CONTENT;
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
38 private MultipartClient multipart = null;
733
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
39 private int timeout = 0;
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
40 private String authUsername = null;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
41 private String authPassword = null;
1364
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1363
diff changeset
42 public HttpURLConnection httpCon;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1244
diff changeset
44 public LuanUrl(URL url,LuanTable options) throws LuanException {
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 if( options != null ) {
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1244
diff changeset
46 Map map = options.asMap();
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 String methodStr = getString(map,"method");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 if( methodStr != null ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 methodStr = methodStr.toUpperCase();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50 try {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 this.method = Method.valueOf(methodStr);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 } catch(IllegalArgumentException e) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 throw new LuanException( "invalid method: "+methodStr );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 }
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1244
diff changeset
56 Map headerMap = getMap(map,"headers");
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
57 if( headerMap != null ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
58 for( Object hack : headerMap.entrySet() ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
59 Map.Entry entry = (Map.Entry)hack;
1150
0842b9b570f8 change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents: 1094
diff changeset
60 String name = (String)entry.getKey();
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
61 Object val = entry.getValue();
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
62 if( val instanceof String ) {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
63 headers.put(name,val);
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
64 } else {
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
65 if( !(val instanceof LuanTable) )
1150
0842b9b570f8 change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents: 1094
diff changeset
66 throw new LuanException( "header '"+name+"' must be string or table" );
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
67 LuanTable t = (LuanTable)val;
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
68 if( !t.isList() )
1150
0842b9b570f8 change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents: 1094
diff changeset
69 throw new LuanException( "header '"+name+"' table must be list" );
723
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
70 headers.put(name,t.asList());
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
71 }
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
72 }
eaf30d5aaf6a handle url headers
Franklin Schmidt <fschmidt@gmail.com>
parents: 722
diff changeset
73 }
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1244
diff changeset
74 Map auth = getMap(map,"authorization");
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 if( auth != null ) {
1151
Franklin Schmidt <fschmidt@gmail.com>
parents: 1150
diff changeset
76 if( headers!=null && headers.containsKey("authorization") )
Franklin Schmidt <fschmidt@gmail.com>
parents: 1150
diff changeset
77 throw new LuanException( "can't define authorization with header 'authorization' defined" );
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
78 String username = getString(auth,"username");
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
79 if( username==null ) username = "";
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 String password = getString(auth,"password");
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
81 if( password==null ) password = "";
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
82 String type = getString(auth,"type");
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 if( !auth.isEmpty() )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 throw new LuanException( "unrecognized authorization options: "+auth );
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
85 if( type != null ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
86 if( !type.toLowerCase().equals("basic") )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
87 throw new LuanException( "authorization type can only be 'basic' or nil" );
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
88 String val = basicAuth(username,password);
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
89 headers.put("authorization",val);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
90 } else {
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
91 authUsername = username;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
92 authPassword = password;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
93 }
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 }
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1244
diff changeset
95 Map params = getMap(map,"parameters");
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
96 String enctype = getString(map,"enctype");
1363
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
97 Object content = map.remove("content");
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
98 if( content != null ) {
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
99 if( this.method != Method.POST )
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
100 throw new LuanException( "content can only be used with POST" );
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
101 if( params != null )
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
102 throw new LuanException( "content cannot be used with parameters" );
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
103 if( content instanceof String ) {
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
104 this.content = ((String)content).getBytes();
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
105 } else if( content instanceof byte[] ) {
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
106 this.content = (byte[])content;
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
107 } else
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
108 throw new LuanException( "content must be String or byte[]" );
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
109 }
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
110 if( enctype != null ) {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
111 if( !enctype.equals("multipart/form-data") )
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
112 throw new LuanException( "unrecognized enctype: "+enctype );
1363
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
113 if( this.method != Method.POST )
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
114 throw new LuanException( "multipart/form-data can only be used with POST" );
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
115 if( params==null )
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
116 throw new LuanException( "multipart/form-data requires parameters" );
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
117 if( params.isEmpty() )
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
118 throw new LuanException( "multipart/form-data parameters can't be empty" );
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
119 multipart = new MultipartClient(params);
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
120 }
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
121 else if( params != null ) {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
122 StringBuilder sb = new StringBuilder();
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
123 for( Object hack : params.entrySet() ) {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
124 Map.Entry entry = (Map.Entry)hack;
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
125 String key = (String)entry.getKey();
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
126 Object val = entry.getValue();
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
127 String keyEnc = encode(key);
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
128 if( val instanceof String ) {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
129 and(sb);
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
130 sb.append( keyEnc ).append( '=' ).append( encode((String)val) );
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
131 } else {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
132 if( !(val instanceof LuanTable) )
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
133 throw new LuanException( "parameter '"+key+"' must be string or table" );
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
134 LuanTable t = (LuanTable)val;
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
135 if( !t.isList() )
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
136 throw new LuanException( "parameter '"+key+"' table must be list" );
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
137 for( Object obj : t.asList() ) {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
138 if( !(obj instanceof String) )
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
139 throw new LuanException( "parameter '"+key+"' values must be strings" );
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
140 and(sb);
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
141 sb.append( keyEnc ).append( '=' ).append( encode((String)obj) );
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
142 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
143 }
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
144 }
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
145 if( this.method==Method.POST ) {
1363
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
146 this.content = sb.toString().getBytes();
780
6a87d51ae0ed allow parameters for HTTP DELETE
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
147 } else {
1354
Franklin Schmidt <fschmidt@gmail.com>
parents: 1349
diff changeset
148 String urlS = url.toString();
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
149 if( urlS.indexOf('?') == -1 ) {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
150 urlS += '?';
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
151 } else {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
152 urlS += '&';
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
153 }
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
154 urlS += sb;
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
155 try {
1354
Franklin Schmidt <fschmidt@gmail.com>
parents: 1349
diff changeset
156 url = new URL(urlS);
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
157 } catch(IOException e) {
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
158 throw new RuntimeException(e);
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 }
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 }
733
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
162 Integer timeout = getInt(map,"time_out");
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
163 if( timeout != null )
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
164 this.timeout = timeout;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 if( !map.isEmpty() )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 throw new LuanException( "unrecognized options: "+map );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 }
1354
Franklin Schmidt <fschmidt@gmail.com>
parents: 1349
diff changeset
168 this.url = url;
722
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
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 private static void and(StringBuilder sb) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 if( sb.length() > 0 )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 sb.append('&');
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 }
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 private static String encode(String s) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 try {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178 return URLEncoder.encode(s,"UTF-8");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 } catch(UnsupportedEncodingException e) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 throw new RuntimeException(e);
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 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 private static String getString(Map map,String key) throws LuanException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 Object val = map.remove(key);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 if( val!=null && !(val instanceof String) )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 throw new LuanException( "parameter '"+key+"' must be a string" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 return (String)val;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190
733
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
191 private static Integer getInt(Map map,String key) throws LuanException {
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
192 Object val = map.remove(key);
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
193 if( val==null )
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
194 return null;
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
195 Integer i = Luan.asInteger(val);
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
196 if( i==null )
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
197 throw new LuanException( "parameter '"+key+"' must be an integer" );
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
198 return i;
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
199 }
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
200
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 private static LuanTable getTable(Map map,String key) throws LuanException {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202 Object val = map.remove(key);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 if( val!=null && !(val instanceof LuanTable) )
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204 throw new LuanException( "parameter '"+key+"' must be a table" );
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 return (LuanTable)val;
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1244
diff changeset
208 private static Map getMap(Map map,String key) throws LuanException {
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209 LuanTable t = getTable(map,key);
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1244
diff changeset
210 return t==null ? null : t.asMap();
722
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
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
213 @Override public InputStream inputStream() throws IOException, LuanException {
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
214 try {
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
215 return inputStream(null);
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
216 } catch(AuthException e) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
217 try {
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
218 return inputStream(e.authorization);
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
219 } catch(AuthException e2) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
220 throw new RuntimeException(e2); // never
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
221 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
222 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
223 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
224
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
225 private InputStream inputStream(String authorization)
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
226 throws IOException, LuanException, AuthException
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
227 {
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 URLConnection con = url.openConnection();
733
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
229 if( timeout != 0 ) {
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
230 con.setConnectTimeout(timeout);
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
231 con.setReadTimeout(timeout);
ffbbe25dab09 add http option time_out
Franklin Schmidt <fschmidt@gmail.com>
parents: 726
diff changeset
232 }
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
233 for( Map.Entry<String,Object> entry : headers.entrySet() ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
234 String key = entry.getKey();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
235 Object val = entry.getValue();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
236 if( val instanceof String ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
237 con.addRequestProperty(key,(String)val);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
238 } else {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
239 List list = (List)val;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
240 for( Object obj : list ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
241 con.addRequestProperty(key,(String)obj);
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 }
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
245 if( authorization != null )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
246 con.addRequestProperty("Authorization",authorization);
1087
4aab4dd3ac9c improve url error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1085
diff changeset
247 if( !(con instanceof HttpURLConnection) ) {
4aab4dd3ac9c improve url error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1085
diff changeset
248 if( method!=Method.GET )
4aab4dd3ac9c improve url error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1085
diff changeset
249 throw new LuanException("method must be GET but is "+method);
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250 return con.getInputStream();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252
1364
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1363
diff changeset
253 httpCon = (HttpURLConnection)con;
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254
1087
4aab4dd3ac9c improve url error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1085
diff changeset
255 if( method==Method.GET ) {
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
256 return getInputStream(httpCon,authorization);
1087
4aab4dd3ac9c improve url error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1085
diff changeset
257 }
4aab4dd3ac9c improve url error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1085
diff changeset
258
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 if( method==Method.DELETE ) {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 httpCon.setRequestMethod("DELETE");
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
261 return getInputStream(httpCon,authorization);
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
262 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
263
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
264 // POST
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
265
1165
668f29bc52ea clean up content-type
Franklin Schmidt <fschmidt@gmail.com>
parents: 1151
diff changeset
266 // httpCon.setRequestProperty("content-type","application/x-www-form-urlencoded");
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
267 httpCon.setDoOutput(true);
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
268 httpCon.setRequestMethod("POST");
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
269
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
270 OutputStream out;
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
271 if( multipart != null ) {
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
272 out = multipart.write(httpCon);
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
273 } else {
1363
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
274 // httpCon.setRequestProperty("Content-Length",Integer.toString(content.length));
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
275 out = httpCon.getOutputStream();
1363
1a7b8e38921a add url post content
Franklin Schmidt <fschmidt@gmail.com>
parents: 1354
diff changeset
276 out.write(content);
725
a741a3a33423 add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 723
diff changeset
277 }
726
14f136a4641f use enctype for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents: 725
diff changeset
278 out.flush();
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
279 try {
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
280 return getInputStream(httpCon,authorization);
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
281 } finally {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
282 out.close();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
283 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
284 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
285
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
286 private InputStream getInputStream(HttpURLConnection httpCon,String authorization)
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
287 throws IOException, LuanException, AuthException
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
288 {
1085
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
289 try {
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
290 return httpCon.getInputStream();
1349
0cceff521abb IO error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
291 // } catch(FileNotFoundException e) {
0cceff521abb IO error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
292 // throw e;
1085
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
293 } catch(IOException e) {
1094
cb4c20fce7d0 add "response_code" and "response_message" to http url luan exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents: 1087
diff changeset
294 int responseCode = httpCon.getResponseCode();
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
295 if( responseCode == 401 && authUsername != null && authorization==null ) {
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
296 String authStr = httpCon.getHeaderField("www-authenticate");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
297 //System.out.println("auth = "+authStr);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
298 try {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
299 WwwAuthenticate auth = new WwwAuthenticate(authStr);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
300 if( auth.type.equals("Basic") ) {
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
301 String val = basicAuth(authUsername,authPassword);
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
302 throw new AuthException(val);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
303 } else if( auth.type.equals("Digest") ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
304 String realm = auth.options.get("realm");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
305 if(realm==null) throw new RuntimeException("missing realm");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
306 String algorithm = auth.options.get("algorithm");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
307 if( algorithm!=null && !algorithm.equals("MD5") )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
308 throw new LuanException("unsupported digest algorithm: "+algorithm);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
309 String qop = auth.options.get("qop");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
310 if( qop!=null && !qop.equals("auth") )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
311 throw new LuanException("unsupported digest qop: "+qop);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
312 String nonce = auth.options.get("nonce");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
313 if(nonce==null) throw new RuntimeException("missing nonce");
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
314 String uri = fullPath(url);
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
315 String a1 = authUsername + ':' + realm + ':' + authPassword;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
316 String a2 = "" + method + ':' + uri;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
317 String nc = "00000001";
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
318 String cnonce = "7761faf2daa45b3b"; // who cares?
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
319 String response = md5(a1) + ':' + nonce;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
320 if( qop != null ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
321 response += ':' + nc + ':' + cnonce + ':' + qop;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
322 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
323 response += ':' + md5(a2);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
324 response = md5(response);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
325 String val = "Digest";
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
326 val += " username=\"" + authUsername + "\"";
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
327 val += ", realm=\"" + realm + "\"";
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
328 val += ", uri=\"" + uri + "\"";
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
329 val += ", nonce=\"" + nonce + "\"";
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
330 val += ", response=\"" + response + "\"";
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
331 if( qop != null ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
332 val += ", qop=" + qop;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
333 val += ", nc=" + nc;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
334 val += ", cnonce=\"" + cnonce + "\"";
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
335 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
336 //System.out.println("val = "+val);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
337 throw new AuthException(val);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
338 } else
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
339 throw new RuntimeException(auth.type);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
340 } catch(ParseException pe) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
341 throw new LuanException(pe);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
342 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
343 }
1094
cb4c20fce7d0 add "response_code" and "response_message" to http url luan exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents: 1087
diff changeset
344 String responseMessage = httpCon.getResponseMessage();
1085
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
345 InputStream is = httpCon.getErrorStream();
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
346 if( is == null )
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
347 throw e;
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
348 Reader in = new InputStreamReader(is);
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
349 String msg = Utils.readAll(in);
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
350 in.close();
1094
cb4c20fce7d0 add "response_code" and "response_message" to http url luan exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents: 1087
diff changeset
351 LuanException le = new LuanException(msg,e);
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
352 le.put("response_code",responseCode);
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
353 le.put("response_message",responseMessage);
1094
cb4c20fce7d0 add "response_code" and "response_message" to http url luan exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents: 1087
diff changeset
354 throw le;
1085
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
355 }
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
356 }
a04da9a3e9eb improve url delete error handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 780
diff changeset
357
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
358 @Override public String to_string() {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
359 return url.toString();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
360 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
361
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
362 @Override public String to_uri_string() {
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
363 return url.toString();
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
364 }
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
365
1318
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
366 private static String basicAuth(String username,String password) {
35a6a195819f in authorization rename user to username
Franklin Schmidt <fschmidt@gmail.com>
parents: 1317
diff changeset
367 String s = username + ':' + password;
1317
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
368 return "Basic " + Base64.getEncoder().encodeToString(s.getBytes());
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
369 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
370
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
371 private final class AuthException extends Exception {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
372 final String authorization;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
373
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
374 AuthException(String authorization) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
375 this.authorization = authorization;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
376 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
377 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
378
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
379 // retarded java api lacks this
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
380 public static String fullPath(URL url) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
381 String path = url.getPath();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
382 String query = url.getQuery();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
383 if( query != null )
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
384 path += "?" + query;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
385 return path;
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
386 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
387
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
388 // retarded java api lacks this
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
389 public static String md5(String s) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
390 try {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
391 byte[] md5 = MessageDigest.getInstance("MD5").digest(s.getBytes());
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
392 StringBuffer sb = new StringBuffer();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
393 for( byte b : md5 ) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
394 sb.append( String.format("%02x",b) );
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
395 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
396 return sb.toString();
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
397 } catch(NoSuchAlgorithmException e) {
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
398 throw new RuntimeException(e);
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
399 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
400 }
c286c1e36b81 add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents: 1315
diff changeset
401
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
402 }