Mercurial Hosting > luan
annotate src/luan/modules/url/MultipartClient.java @ 1347:643cf1c37723
move webserver to lib and bug fixes
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 25 Feb 2019 13:02:33 -0700 |
parents | 383f924dfe9d |
children | 27efb1fcbcb5 |
rev | line source |
---|---|
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
1 package luan.modules.url; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
2 |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
3 import java.io.OutputStream; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
4 import java.io.IOException; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 import java.net.HttpURLConnection; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
6 import java.util.List; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
7 import java.util.ArrayList; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
8 import java.util.Map; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
9 import java.util.HashMap; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
10 import luan.LuanTable; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
11 import luan.LuanException; |
1347
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1274
diff
changeset
|
12 import luan.lib.webserver.Request; |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
13 |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
14 |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
15 public final class MultipartClient { |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
16 private static final byte[] __CRLF = {'\r','\n'}; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
17 private static final byte[] __DASHDASH = {'-','-'}; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
18 private static final String __ISO_8859_1 = "ISO-8859-1"; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
19 |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
20 private final Map params = new HashMap(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
21 |
1274
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
22 private static Object get(Map<Object,Object> params,String key) throws LuanException { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
23 Object val = params.remove(key); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
24 if( val==null) |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
25 throw new LuanException( "parameter '"+key+"' is required in multipart file" ); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
26 return val; |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
27 } |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
28 |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
29 private static String getString(Map<Object,Object> params,String key) throws LuanException { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
30 Object val = get(params,key); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
31 if( !(val instanceof String) ) |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
32 throw new LuanException( "parameter '"+key+"' must be a string" ); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
33 return (String)val; |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
34 } |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
35 |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
36 MultipartClient(Map params) throws LuanException { |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
37 for( Object hack : params.entrySet() ) { |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
38 Map.Entry entry = (Map.Entry)hack; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
39 String key = (String)entry.getKey(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
40 Object val = entry.getValue(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
41 List list = new ArrayList(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
42 if( val instanceof String ) { |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
43 list.add(val); |
1274
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
44 } else if(val instanceof LuanTable) { |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
45 LuanTable t = (LuanTable)val; |
1274
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
46 if( t.isList() ) { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
47 for( Object obj : t.asList() ) { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
48 if( obj instanceof String ) { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
49 list.add(obj); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
50 } else |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
51 throw new LuanException( "parameter '"+key+"' values must be strings or tables" ); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
52 } |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
53 } else { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
54 Map<Object,Object> map = t.asMap(); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
55 String filename = getString(map,"filename"); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
56 String contentType = getString(map,"content_type"); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
57 Object content = get(map,"content"); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
58 if( !(content instanceof String || content instanceof byte[]) ) |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
59 throw new LuanException( "content must be a string or binary" ); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
60 list.add( new Request.MultipartFile(filename,contentType,content) ); |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
61 } |
1274
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
62 } else { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
63 throw new LuanException( "parameter '"+key+"' must be string or table" ); |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
64 } |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
65 this.params.put(key,list); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
66 } |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
67 } |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
68 |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
69 public OutputStream write(HttpURLConnection httpCon) throws IOException { |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
70 String boundary = "luan" + System.identityHashCode(this) + Long.toString(System.currentTimeMillis(),36); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
71 byte[] boundaryBytes = boundary.getBytes(__ISO_8859_1); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
72 |
1165
668f29bc52ea
clean up content-type
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
73 httpCon.setRequestProperty("content-type","multipart/form-data; boundary="+boundary); |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
74 OutputStream out = httpCon.getOutputStream(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
75 for( Object hack : params.entrySet() ) { |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
76 Map.Entry entry = (Map.Entry)hack; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
77 String name = (String)entry.getKey(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
78 List list = (List)entry.getValue(); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
79 for( Object obj : list ) { |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
80 out.write(__DASHDASH); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
81 out.write(boundaryBytes); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
82 out.write(__CRLF); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
83 out.write(("Content-Disposition: form-data; name=\""+name+"\"").getBytes(__ISO_8859_1)); |
1274
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
84 if( obj instanceof String ) { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
85 String val = (String)obj; |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
86 out.write(__CRLF); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
87 out.write(__CRLF); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
88 out.write(val.getBytes()); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
89 } else { |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
90 Request.MultipartFile mpf = (Request.MultipartFile)obj; |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
91 out.write(("; filename=\""+mpf.filename+"\"").getBytes(__ISO_8859_1)); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
92 out.write(__CRLF); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
93 out.write(("Content-Type: "+mpf.contentType).getBytes(__ISO_8859_1)); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
94 out.write(__CRLF); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
95 out.write(__CRLF); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
96 byte[] content = mpf.content instanceof String ? ((String)mpf.content).getBytes() : (byte[])mpf.content; |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
97 out.write(content); |
383f924dfe9d
support multipart files in http request
Franklin Schmidt <fschmidt@gmail.com>
parents:
1165
diff
changeset
|
98 } |
725
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
99 out.write(__CRLF); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
100 } |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
101 } |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
102 out.write(__DASHDASH); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
103 out.write(boundaryBytes); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
104 out.write(__DASHDASH); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
105 out.write(__CRLF); |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
106 return out; |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
107 } |
a741a3a33423
add url support for multipart/form-data
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
108 } |