Skip to content

Commit dcca6ee

Browse files
committed
Fix uploader API calls handling of non-string parameters e.g. Booleans
1 parent 26cc217 commit dcca6ee

File tree

3 files changed

+91
-89
lines changed

3 files changed

+91
-89
lines changed

cloudinary-core/src/main/java/com/cloudinary/Cloudinary.java

Lines changed: 84 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@
2222
import org.apache.commons.lang.StringUtils;
2323
import org.apache.http.client.utils.URIBuilder;
2424

25-
@SuppressWarnings({"rawtypes", "unchecked"})
25+
@SuppressWarnings({ "rawtypes", "unchecked" })
2626
public class Cloudinary {
2727
public final static String CF_SHARED_CDN = "d3jpl91pxevbkh.cloudfront.net";
2828
public final static String OLD_AKAMAI_SHARED_CDN = "cloudinary-a.akamaihd.net";
2929
public final static String AKAMAI_SHARED_CDN = "res.cloudinary.com";
3030
public final static String SHARED_CDN = AKAMAI_SHARED_CDN;
31-
31+
3232
public final static String VERSION = "1.0.11";
3333
public final static String USER_AGENT = "cld-java-" + VERSION;
34-
34+
3535
private final Map config = new HashMap();
36-
36+
3737
public Cloudinary(Map config) {
38-
this.config.putAll(config);
38+
this.config.putAll(config);
3939
}
40-
40+
4141
public Cloudinary(String cloudinaryUrl) {
4242
initFromUrl(cloudinaryUrl);
4343
}
@@ -47,67 +47,67 @@ public Cloudinary() {
4747
if (cloudinaryUrl != null) {
4848
initFromUrl(cloudinaryUrl);
4949
}
50-
50+
5151
}
52-
52+
5353
public Url url() {
5454
return new Url(this);
5555
}
56-
56+
5757
public Uploader uploader() {
5858
return new Uploader(this);
5959
}
6060

6161
public Api api() {
6262
return new Api(this);
6363
}
64-
64+
6565
public String cloudinaryApiUrl(String action, Map options) {
66-
String cloudinary = asString(options.get("upload_prefix"), asString(this.config.get("upload_prefix"), "https://api.cloudinary.com"));
67-
String cloud_name = asString(options.get("cloud_name"), asString(this.config.get("cloud_name")));
68-
if (cloud_name == null) throw new IllegalArgumentException("Must supply cloud_name in tag or in configuration");
69-
String resource_type = asString(options.get("resource_type"), "image");
70-
return StringUtils.join(new String[]{cloudinary, "v1_1", cloud_name, resource_type, action}, "/");
71-
}
72-
73-
private final static SecureRandom RND = new SecureRandom();
74-
75-
public String randomPublicId() {
76-
byte[] bytes = new byte[8];
77-
RND.nextBytes(bytes);
78-
return Hex.encodeHexString(bytes);
79-
}
80-
81-
public String signedPreloadedImage(Map result) {
82-
return result.get("resource_type") + "/upload/v" + result.get("version") + "/" + result.get("public_id") +
83-
(result.containsKey("format") ? "." + result.get("format") : "") + "#" + result.get("signature");
84-
}
85-
86-
public String apiSignRequest(Map<String, Object> paramsToSign, String apiSecret) {
87-
Collection<String> params = new ArrayList<String>();
88-
for (Map.Entry<String, Object> param : new TreeMap<String, Object>(paramsToSign).entrySet()) {
89-
if (param.getValue() instanceof Collection) {
90-
params.add(param.getKey() + "=" + StringUtils.join((Collection) param.getValue(), ","));
91-
} else if (param.getValue() instanceof String) {
92-
String value = (String) param.getValue();
93-
if (StringUtils.isNotBlank(value)) {
94-
params.add(param.getKey() + "=" + value);
95-
}
96-
}
97-
}
98-
String to_sign = StringUtils.join(params, "&");
99-
MessageDigest md = null;
100-
try {
101-
md = MessageDigest.getInstance("SHA-1");
102-
}
103-
catch(NoSuchAlgorithmException e) {
104-
throw new RuntimeException("Unexpected exception", e);
105-
}
106-
byte[] digest = md.digest((to_sign + apiSecret).getBytes());
107-
return Hex.encodeHexString(digest);
108-
}
109-
110-
public void signRequest(Map<String, Object> params, Map<String, Object> options) {
66+
String cloudinary = asString(options.get("upload_prefix"), asString(this.config.get("upload_prefix"), "https://api.cloudinary.com"));
67+
String cloud_name = asString(options.get("cloud_name"), asString(this.config.get("cloud_name")));
68+
if (cloud_name == null)
69+
throw new IllegalArgumentException("Must supply cloud_name in tag or in configuration");
70+
String resource_type = asString(options.get("resource_type"), "image");
71+
return StringUtils.join(new String[] { cloudinary, "v1_1", cloud_name, resource_type, action }, "/");
72+
}
73+
74+
private final static SecureRandom RND = new SecureRandom();
75+
76+
public String randomPublicId() {
77+
byte[] bytes = new byte[8];
78+
RND.nextBytes(bytes);
79+
return Hex.encodeHexString(bytes);
80+
}
81+
82+
public String signedPreloadedImage(Map result) {
83+
return result.get("resource_type") + "/upload/v" + result.get("version") + "/" + result.get("public_id")
84+
+ (result.containsKey("format") ? "." + result.get("format") : "") + "#" + result.get("signature");
85+
}
86+
87+
public String apiSignRequest(Map<String, Object> paramsToSign, String apiSecret) {
88+
Collection<String> params = new ArrayList<String>();
89+
for (Map.Entry<String, Object> param : new TreeMap<String, Object>(paramsToSign).entrySet()) {
90+
if (param.getValue() instanceof Collection) {
91+
params.add(param.getKey() + "=" + StringUtils.join((Collection) param.getValue(), ","));
92+
} else {
93+
String value = param.getValue().toString();
94+
if (StringUtils.isNotBlank(value)) {
95+
params.add(param.getKey() + "=" + value);
96+
}
97+
}
98+
}
99+
String to_sign = StringUtils.join(params, "&");
100+
MessageDigest md = null;
101+
try {
102+
md = MessageDigest.getInstance("SHA-1");
103+
} catch (NoSuchAlgorithmException e) {
104+
throw new RuntimeException("Unexpected exception", e);
105+
}
106+
byte[] digest = md.digest((to_sign + apiSecret).getBytes());
107+
return Hex.encodeHexString(digest);
108+
}
109+
110+
public void signRequest(Map<String, Object> params, Map<String, Object> options) {
111111
String apiKey = Cloudinary.asString(options.get("api_key"), this.getStringConfig("api_key"));
112112
if (apiKey == null)
113113
throw new IllegalArgumentException("Must supply api_key");
@@ -121,11 +121,11 @@ public void signRequest(Map<String, Object> params, Map<String, Object> options)
121121
}
122122
}
123123
params.put("signature", this.apiSignRequest(params, apiSecret));
124-
params.put("api_key", apiKey);
125-
}
124+
params.put("api_key", apiKey);
125+
}
126126

127127
public String privateDownload(String publicId, String format, Map<String, Object> options) throws URISyntaxException {
128-
Map<String, Object> params = new HashMap<String, Object>();
128+
Map<String, Object> params = new HashMap<String, Object>();
129129
params.put("public_id", publicId);
130130
params.put("format", format);
131131
params.put("attachment", options.get("attachment"));
@@ -138,9 +138,9 @@ public String privateDownload(String publicId, String format, Map<String, Object
138138
}
139139
return builder.toString();
140140
}
141-
141+
142142
public String zipDownload(String tag, Map<String, Object> options) throws URISyntaxException {
143-
Map<String, Object> params = new HashMap<String, Object>();
143+
Map<String, Object> params = new HashMap<String, Object>();
144144
params.put("timestamp", new Long(System.currentTimeMillis() / 1000L).toString());
145145
params.put("tag", tag);
146146
Object transformation = options.get("transformation");
@@ -158,7 +158,7 @@ public String zipDownload(String tag, Map<String, Object> options) throws URISyn
158158
}
159159
return builder.toString();
160160
}
161-
161+
162162
protected void initFromUrl(String cloudinaryUrl) {
163163
URI cloudinaryUri = URI.create(cloudinaryUrl);
164164
setConfig("cloud_name", cloudinaryUri.getHost());
@@ -214,13 +214,13 @@ public static String asString(Object value, String defaultValue) {
214214
public static List asArray(Object value) {
215215
if (value == null) {
216216
return Collections.EMPTY_LIST;
217-
} else if (value instanceof int[]){
217+
} else if (value instanceof int[]) {
218218
List array = new ArrayList();
219-
for (int i: (int[]) value) {
219+
for (int i : (int[]) value) {
220220
array.add(new Integer(i));
221221
}
222222
return array;
223-
} else if (value instanceof Object[]){
223+
} else if (value instanceof Object[]) {
224224
return Arrays.asList((Object[]) value);
225225
} else if (value instanceof List) {
226226
return (List) value;
@@ -229,7 +229,7 @@ public static List asArray(Object value) {
229229
array.add(value);
230230
return array;
231231
}
232-
}
232+
}
233233

234234
public static Boolean asBoolean(Object value, Boolean defaultValue) {
235235
if (value == null) {
@@ -240,7 +240,7 @@ public static Boolean asBoolean(Object value, Boolean defaultValue) {
240240
return "true".equals(value);
241241
}
242242
}
243-
243+
244244
public static Float asFloat(Object value) {
245245
if (value == null) {
246246
return null;
@@ -250,23 +250,24 @@ public static Float asFloat(Object value) {
250250
return Float.parseFloat(value.toString());
251251
}
252252
}
253-
254-
public static Map asMap(Object...values) {
255-
if (values.length % 2 != 0) throw new RuntimeException("Usage - (key, value, key, value, ...)");
253+
254+
public static Map asMap(Object... values) {
255+
if (values.length % 2 != 0)
256+
throw new RuntimeException("Usage - (key, value, key, value, ...)");
256257
Map result = new HashMap(values.length / 2);
257-
for (int i = 0; i < values.length; i+=2) {
258-
result.put(values[i], values[i+1]);
258+
for (int i = 0; i < values.length; i += 2) {
259+
result.put(values[i], values[i + 1]);
259260
}
260261
return result;
261262
}
262-
263+
263264
public static Map emptyMap() {
264265
return Collections.EMPTY_MAP;
265266
}
266-
267+
267268
public static String encodeMap(Object arg) {
268269
if (arg != null && arg instanceof Map) {
269-
Map<String,String> mapArg = (Map<String,String>) arg;
270+
Map<String, String> mapArg = (Map<String, String>) arg;
270271
HashSet out = new HashSet();
271272
for (Map.Entry<String, String> entry : mapArg.entrySet()) {
272273
out.add(entry.getKey() + "=" + entry.getValue());
@@ -278,14 +279,14 @@ public static String encodeMap(Object arg) {
278279
return arg.toString();
279280
}
280281
}
281-
282+
282283
public static Map<String, ? extends Object> only(Map<String, ? extends Object> hash, String... keys) {
283-
Map<String, Object> result = new HashMap<String, Object>();
284-
for (String key : keys) {
285-
if (hash.containsKey(key)) {
286-
result.put(key, hash.get(key));
287-
}
288-
}
289-
return result;
290-
}
284+
Map<String, Object> result = new HashMap<String, Object>();
285+
for (String key : keys) {
286+
if (hash.containsKey(key)) {
287+
result.put(key, hash.get(key));
288+
}
289+
}
290+
return result;
291+
}
291292
}

cloudinary-core/src/main/java/com/cloudinary/Uploader.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,15 +293,15 @@ public Map callApi(String action, Map<String, Object> params, Map options, Objec
293293
MultipartEntity multipart = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
294294
// Remove blank parameters
295295
for (Map.Entry<String, Object> param : params.entrySet()) {
296-
if (param.getValue() instanceof String) {
297-
String value = (String) param.getValue();
298-
if (StringUtils.isNotBlank(value)) {
299-
multipart.addPart(param.getKey(), new StringBody(value));
300-
}
301-
} else if (param.getValue() instanceof Collection) {
296+
if (param.getValue() instanceof Collection) {
302297
for (Object value : (Collection) param.getValue()) {
303298
multipart.addPart(param.getKey()+"[]", new StringBody(Cloudinary.asString(value)));
304299
}
300+
} else {
301+
String value = param.getValue().toString();
302+
if (StringUtils.isNotBlank(value)) {
303+
multipart.addPart(param.getKey(), new StringBody(value));
304+
}
305305
}
306306
}
307307

cloudinary-core/src/test/java/com/cloudinary/test/UploaderTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ public void testUploadLargeRawFiles() throws Exception {
345345
// support uploading large raw files
346346
Map response = cloudinary.uploader().uploadLargeRaw("src/test/resources/docx.docx", Cloudinary.emptyMap());
347347
assertEquals(new java.io.File("src/test/resources/docx.docx").length(), response.get("bytes"));
348+
assertEquals(Boolean.TRUE, response.get("done"));
348349
}
349350

350351
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy