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();
            }
        }