From ab728386c144a31be76debb92877e2c1d1ddb8e6 Mon Sep 17 00:00:00 2001 From: Sergei Dryganets Date: Wed, 22 Aug 2018 18:29:42 -0700 Subject: [PATCH] Android. OkHttp crash fixed on upload re-try. --- .../react/modules/network/ProgressRequestBody.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.java b/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.java index 914ce3c901106a..3094732afea37a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.java @@ -19,7 +19,6 @@ public class ProgressRequestBody extends RequestBody { private final RequestBody mRequestBody; private final ProgressListener mProgressListener; - private BufferedSink mBufferedSink; private long mContentLength = 0L; public ProgressRequestBody(RequestBody requestBody, ProgressListener progressListener) { @@ -42,16 +41,17 @@ public long contentLength() throws IOException { @Override public void writeTo(BufferedSink sink) throws IOException { - if (mBufferedSink == null) { - mBufferedSink = Okio.buffer(outputStreamSink(sink)); - } + // In 99% of cases, this method is called strictly once. + // The only case when it is called more than once is internal okhttp upload re-try. + // We need to re-create CountingOutputStream in this case as progress should be re-evaluated. + BufferedSink sinkWrapper = Okio.buffer(outputStreamSink(sink)); // contentLength changes for input streams, since we're using inputStream.available(), // so get the length before writing to the sink contentLength(); - mRequestBody.writeTo(mBufferedSink); - mBufferedSink.flush(); + mRequestBody.writeTo(sinkWrapper); + sinkWrapper.flush(); } private Sink outputStreamSink(BufferedSink sink) {