From 195274dadc52248dc3972022c49d427471059a0b Mon Sep 17 00:00:00 2001 From: Sergei Dryganets Date: Wed, 22 Aug 2018 23:00:07 -0700 Subject: [PATCH] Android. OkHttp crash fixed on upload re-try. (#20802) Summary: This change fixes this issue: https://github.com/facebook/react-native/issues/10423 Pull Request resolved: https://github.com/facebook/react-native/pull/20802 Differential Revision: D9478422 Pulled By: hramos fbshipit-source-id: ce3a098a71c8f50a62b011a2a277004ab7a7b655 --- .../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) {