From 46b3bad7cd17cab80a695fae66636abf49e51e9f Mon Sep 17 00:00:00 2001 From: FOUGEROUSE Date: Tue, 7 Mar 2023 15:59:39 +0100 Subject: [PATCH 1/3] add resume mechanism for download request --- .../androidnetworking/common/ANConstants.java | 2 ++ .../androidnetworking/common/ANRequest.java | 12 ++++++++++ .../internal/InternalNetworking.java | 24 ++++++++++++++++--- .../com/androidnetworking/utils/Utils.java | 6 ++++- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java b/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java index 89d36aa2..5b47436b 100644 --- a/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java +++ b/android-networking/src/main/java/com/androidnetworking/common/ANConstants.java @@ -33,4 +33,6 @@ public final class ANConstants { public static final String USER_AGENT = "User-Agent"; public static final String SUCCESS = "success"; public static final String OPTIONS = "OPTIONS"; + public static final String RANGE = "Range"; + public static final String ACCEPT_ENCODING = "Accept-Encoding"; } diff --git a/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java b/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java index d85b1db8..2d27be4e 100644 --- a/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java +++ b/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java @@ -139,6 +139,7 @@ public class ANRequest { private Executor mExecutor = null; private OkHttpClient mOkHttpClient = null; private String mUserAgent = null; + private boolean mResumeAllowed = false; private Type mType = null; public ANRequest(GetRequestBuilder builder) { @@ -200,6 +201,7 @@ public ANRequest(DownloadBuilder builder) { this.mExecutor = builder.mExecutor; this.mOkHttpClient = builder.mOkHttpClient; this.mUserAgent = builder.mUserAgent; + this.mResumeAllowed = builder.mResumeAllowed; } public ANRequest(MultiPartBuilder builder) { @@ -465,6 +467,10 @@ public String getUserAgent() { return mUserAgent; } + public boolean getResumeAllowed() { + return mResumeAllowed; + } + public Type getType() { return mType; } @@ -1443,6 +1449,7 @@ public static class DownloadBuilder implements Reques private Executor mExecutor; private OkHttpClient mOkHttpClient; private String mUserAgent; + private boolean mResumeAllowed; public DownloadBuilder(String url, String dirPath, String fileName) { this.mUrl = url; @@ -1600,6 +1607,11 @@ public T setUserAgent(String userAgent) { return (T) this; } + public T allowResume(boolean resumeAllowed) { + mResumeAllowed = resumeAllowed; + return (T) this; + } + public T setPercentageThresholdForCancelling(int percentageThresholdForCancelling) { mPercentageThresholdForCancelling = percentageThresholdForCancelling; return (T) this; diff --git a/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java b/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java index 43c539bd..aaf2d706 100644 --- a/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java +++ b/android-networking/src/main/java/com/androidnetworking/internal/InternalNetworking.java @@ -205,9 +205,11 @@ public Response intercept(Chain chain) throws IOException { } } catch (IOException ioe) { try { - File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); - if (destinationFile.exists()) { - destinationFile.delete(); + if (!request.getResumeAllowed()) { + File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); + if (destinationFile.exists()) { + destinationFile.delete(); + } } } catch (Exception e) { e.printStackTrace(); @@ -276,12 +278,28 @@ public static void addHeadersToRequestBuilder(Request.Builder builder, ANRequest request.setUserAgent(sUserAgent); builder.addHeader(ANConstants.USER_AGENT, sUserAgent); } + if (request.getResumeAllowed()) { + File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); + if (destinationFile.exists()) { + long fileLength = destinationFile.length(); + builder.addHeader(ANConstants.ACCEPT_ENCODING, "identity"); + builder.addHeader(ANConstants.RANGE, "bytes=" + fileLength + "-"); + } + } Headers requestHeaders = request.getHeaders(); if (requestHeaders != null) { builder.headers(requestHeaders); if (request.getUserAgent() != null && !requestHeaders.names().contains(ANConstants.USER_AGENT)) { builder.addHeader(ANConstants.USER_AGENT, request.getUserAgent()); } + if (request.getResumeAllowed() && !requestHeaders.names().contains(ANConstants.RANGE)) { + File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName()); + if (destinationFile.exists()) { + long fileLength = destinationFile.length(); + builder.addHeader(ANConstants.ACCEPT_ENCODING, "identity"); + builder.addHeader(ANConstants.RANGE, "bytes=" + fileLength + "-"); + } + } } } diff --git a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java index 588cba83..14f26246 100644 --- a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java +++ b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java @@ -182,7 +182,11 @@ public static void saveFile(Response response, String dirPath, dir.mkdirs(); } File file = new File(dir, fileName); - fos = new FileOutputStream(file); + if (response.code() == 206 && file.exists()) { + fos = new FileOutputStream(file, true); + } else { + fos = new FileOutputStream(file); + } while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } From ee39c33a92ada3ea60353ec9d5630eb134b5e1ac Mon Sep 17 00:00:00 2001 From: FOUGEROUSE Date: Tue, 7 Mar 2023 17:17:47 +0100 Subject: [PATCH 2/3] check if input stream has available bytes to read --- .../src/main/java/com/androidnetworking/utils/Utils.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java index 14f26246..393eb8cd 100644 --- a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java +++ b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java @@ -187,10 +187,12 @@ public static void saveFile(Response response, String dirPath, } else { fos = new FileOutputStream(file); } - while ((len = is.read(buf)) != -1) { - fos.write(buf, 0, len); + if(is.available() > 0) { + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + } + fos.flush(); } - fos.flush(); } finally { try { if (is != null) is.close(); From 097ee2d45f62a05c5f7f24f6121d79002efa3ae2 Mon Sep 17 00:00:00 2001 From: FOUGEROUSE Date: Wed, 8 Mar 2023 10:00:24 +0100 Subject: [PATCH 3/3] fix last commit --- .../main/java/com/androidnetworking/utils/Utils.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java index 393eb8cd..bf90be4b 100644 --- a/android-networking/src/main/java/com/androidnetworking/utils/Utils.java +++ b/android-networking/src/main/java/com/androidnetworking/utils/Utils.java @@ -172,7 +172,7 @@ public static int findBestSampleSize(int actualWidth, int actualHeight, public static void saveFile(Response response, String dirPath, String fileName) throws IOException { InputStream is = null; - byte[] buf = new byte[2048]; + byte[] buf = new byte[8192]; int len; FileOutputStream fos = null; try { @@ -182,16 +182,14 @@ public static void saveFile(Response response, String dirPath, dir.mkdirs(); } File file = new File(dir, fileName); - if (response.code() == 206 && file.exists()) { + int code = response.code(); + if ((code == 206 || code == 416) && file.exists()) { fos = new FileOutputStream(file, true); } else { fos = new FileOutputStream(file); } - if(is.available() > 0) { - while ((len = is.read(buf)) != -1) { - fos.write(buf, 0, len); - } - fos.flush(); + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); } } finally { try {