From 05786ec2ecf24a9244d43a88dce4c645eb0059b4 Mon Sep 17 00:00:00 2001 From: Archana Naik Date: Mon, 10 Mar 2014 23:02:28 -0700 Subject: [PATCH] Upleveled from android port with following commits: 3c1ff16 Andrew Grieve - CB-5762 android: Fix lengthComputable set wrong for gzip downloads 8374b3d Colin Mahoney - CB-5631 Removed SimpleTrackingInputStream.read(byte[] buffer) 6f91ac3 Bas Bosman - CB-4907 Close stream when we're finished with it 651460f Christoph Neumann - CB-6000 Nginx rejects Content-Type without a space before "boundary". 35f80e4 Ian Clelland - CB-6050: Use instance method on actual file plugin object to get FileEntry to return on download --- src/amazon/FileTransfer.java | 53 +++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/amazon/FileTransfer.java b/src/amazon/FileTransfer.java index 2e0c31c..513400e 100644 --- a/src/amazon/FileTransfer.java +++ b/src/amazon/FileTransfer.java @@ -158,11 +158,8 @@ public class FileTransfer extends CordovaPlugin { return updateBytesRead(super.read()); } - @Override - public int read(byte[] buffer) throws IOException { - return updateBytesRead(super.read(buffer)); - } - + // Note: FilterInputStream delegates read(byte[] bytes) to the below method, + // so we don't override it or else double count (CB-5631). @Override public int read(byte[] bytes, int offset, int count) throws IOException { return updateBytesRead(super.read(bytes, offset, count)); @@ -318,7 +315,7 @@ public class FileTransfer extends CordovaPlugin { // Use a post method. conn.setRequestMethod(httpMethod); - conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY); + conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); // Set the cookies on the response String cookie = AmazonCookieManager.getInstance().getCookie(target); @@ -585,15 +582,19 @@ public class FileTransfer extends CordovaPlugin { if(err != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(err, "UTF-8")); - String line = reader.readLine(); - while(line != null) - { - bodyBuilder.append(line); - line = reader.readLine(); - if(line != null) - bodyBuilder.append('\n'); + try { + String line = reader.readLine(); + while(line != null) { + bodyBuilder.append(line); + line = reader.readLine(); + if(line != null) { + bodyBuilder.append('\n'); + } + } + body = bodyBuilder.toString(); + } finally { + reader.close(); } - body = bodyBuilder.toString(); } } // IOException can leave connection object in a bad state, so catch all exceptions. @@ -760,8 +761,10 @@ public class FileTransfer extends CordovaPlugin { if (connection.getContentEncoding() == null || connection.getContentEncoding().equalsIgnoreCase("gzip")) { // Only trust content-length header if we understand // the encoding -- identity or gzip - progress.setLengthComputable(true); - progress.setTotal(connection.getContentLength()); + if (connection.getContentLength() != -1) { + progress.setLengthComputable(true); + progress.setTotal(connection.getContentLength()); + } } inputStream = getInputStream(connection); } @@ -794,9 +797,21 @@ public class FileTransfer extends CordovaPlugin { Log.d(LOG_TAG, "Saved file: " + target); // create FileEntry object - JSONObject fileEntry = FileUtils.getEntry(file); - - result = new PluginResult(PluginResult.Status.OK, fileEntry); + FileUtils filePlugin = (FileUtils)webView.pluginManager.getPlugin("File"); + if (filePlugin != null) { + JSONObject fileEntry = filePlugin.getEntryForFile(file); + if (fileEntry != null) { + result = new PluginResult(PluginResult.Status.OK, fileEntry); + } else { + JSONObject error = createFileTransferError(CONNECTION_ERR, source, target, connection); + Log.e(LOG_TAG, "File plugin cannot represent download path"); + result = new PluginResult(PluginResult.Status.IO_EXCEPTION, error); + } + } else { + Log.e(LOG_TAG, "File plugin not found; cannot save downloaded file"); + result = new PluginResult(PluginResult.Status.ERROR, "File plugin not found; cannot save downloaded file"); + } + } catch (FileNotFoundException e) { JSONObject error = createFileTransferError(FILE_NOT_FOUND_ERR, source, target, connection); Log.e(LOG_TAG, error.toString(), e);