private void OnResponse( FetchState fetchState, Stream responseData, int responseContentLength) { PooledByteBufferOutputStream pooledOutputStream; if (responseContentLength > 0) { pooledOutputStream = _pooledByteBufferFactory.NewOutputStream(responseContentLength); } else { pooledOutputStream = _pooledByteBufferFactory.NewOutputStream(); } byte[] ioArray = _byteArrayPool.Get(READ_SIZE); try { int length; while ((length = responseData.Read(ioArray, 0, ioArray.Length)) > 0) { pooledOutputStream.Write(ioArray, 0, length); MaybeHandleIntermediateResult(pooledOutputStream, fetchState); float progress = CalculateProgress(pooledOutputStream.Size, responseContentLength); fetchState.Consumer.OnProgressUpdate(progress); } _networkFetcher.OnFetchCompletion(fetchState, pooledOutputStream.Size); HandleFinalResult(pooledOutputStream, fetchState); } finally { _byteArrayPool.Release(ioArray); pooledOutputStream.Dispose(); } }