annotate src/luan/modules/url/MultipartClient.java @ 1810:3c43b07e12b7 default tip

minor
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 12 May 2024 22:00:42 -0600
parents 27efb1fcbcb5
children
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:
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;
1402
27efb1fcbcb5 move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents: 1347
diff changeset
12 import goodjava.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 }