diff --git a/sdk-java/src/main/java/ly/count/sdk/java/internal/Transport.java b/sdk-java/src/main/java/ly/count/sdk/java/internal/Transport.java index ce313027..b766cacf 100644 --- a/sdk-java/src/main/java/ly/count/sdk/java/internal/Transport.java +++ b/sdk-java/src/main/java/ly/count/sdk/java/internal/Transport.java @@ -2,7 +2,6 @@ import java.io.BufferedReader; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -155,32 +154,28 @@ HttpURLConnection connection(final Request request) throws IOException { PrintWriter writer = null; try { if (maybePictureData != null) { - StringBuilder stringBuilder = new StringBuilder(); String boundary = Long.toHexString(System.currentTimeMillis()); - addMultipart(stringBuilder, boundary, "image/jpeg", "file", "image", maybePictureData); + connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); - Map map = request.params.map(); - for (Map.Entry kv : map.entrySet()) { - addMultipart(stringBuilder, boundary, "text/plain", kv.getKey(), kv.getValue(), null); - } + output = connection.getOutputStream(); + writer = new PrintWriter(new OutputStreamWriter(output, Utils.UTF8), true); - stringBuilder.append("--").append(boundary).append("--").append(Utils.CRLF); - System.out.println(stringBuilder); + addMultipart(output, writer, boundary, "image/jpeg", "binaryFile", "image", maybePictureData); - connection = openConnection(path + "checksum256=" + Utils.digestHex(PARAMETER_TAMPERING_DIGEST, stringBuilder + config.getParameterTamperingProtectionSalt(), L), request.params.toString(), usingGET); - connection.setConnectTimeout(1000 * config.getNetworkConnectionTimeout()); - connection.setReadTimeout(1000 * config.getNetworkReadTimeout()); + StringBuilder salting = new StringBuilder(); + Map map = request.params.map(); + for (String key : map.keySet()) { + String value = Utils.urldecode(map.get(key)); + salting.append(key).append('=').append(value).append('&'); + addMultipart(output, writer, boundary, "text/plain", key, value, null); + } - if (connection instanceof HttpsURLConnection && sslContext != null) { - HttpsURLConnection https = (HttpsURLConnection) connection; - https.setSSLSocketFactory(sslContext.getSocketFactory()); + if (config.getParameterTamperingProtectionSalt() != null) { + addMultipart(output, writer, boundary, "text/plain", CHECKSUM, Utils.digestHex(PARAMETER_TAMPERING_DIGEST, salting.substring(0, salting.length() - 1) + config.getParameterTamperingProtectionSalt(), L), null); } - connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); - output = connection.getOutputStream(); - writer = new PrintWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8), true); - writer.append(stringBuilder.toString()).flush(); + writer.append("--").append(boundary).append("--").append(Utils.CRLF).flush(); } else { //picture data is "null". If it was sent, we send "null" to server to clear the image there //we send a normal request in HTTP POST @@ -214,19 +209,18 @@ HttpURLConnection connection(final Request request) throws IOException { return connection; } - void addMultipart(StringBuilder stringBuilder, String boundary, String contentType, String name, String value, byte[] file) throws IOException { - stringBuilder.append("--").append(boundary).append(Utils.CRLF); + void addMultipart(OutputStream output, PrintWriter writer, String boundary, String contentType, String name, String value, byte[] file) throws IOException { + writer.append("--").append(boundary).append(Utils.CRLF); if (file != null) { - stringBuilder.append("Content-Disposition: form-data; name=\"").append(name).append("\"; filename=\"").append(value).append("\"").append(Utils.CRLF); - stringBuilder.append("Content-Type: ").append(contentType).append(Utils.CRLF); - stringBuilder.append(Utils.CRLF); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(file.length); - byteArrayOutputStream.write(file); - stringBuilder.append(byteArrayOutputStream.toString()); - stringBuilder.append(Utils.CRLF); + writer.append("Content-Disposition: form-data; name=\"").append(name).append("\"; filename=\"").append(value).append("\"").append(Utils.CRLF); + writer.append("Content-Type: ").append(contentType).append(Utils.CRLF); + writer.append(Utils.CRLF).flush(); + output.write(file); + output.flush(); + writer.append(Utils.CRLF).flush(); } else { - stringBuilder.append("Content-Disposition: form-data; name=\"").append(name).append("\"").append(Utils.CRLF); - stringBuilder.append(Utils.CRLF).append(value).append(Utils.CRLF); + writer.append("Content-Disposition: form-data; name=\"").append(name).append("\"").append(Utils.CRLF); + writer.append(Utils.CRLF).append(value).append(Utils.CRLF).flush(); } }