public async Task <IHttpWebResponse> PerformAsync()
        {
            var rawRequest = await PrepareAsync();

            var rawResponse = await GetResponseAsync(rawRequest);

            if (_config.Advanced.ContentNegotiation && _contentNegotiator.IsApplicable(rawResponse))
            {
                _contentTypeProvider = () => _contentNegotiator.GetSupportedContentType(rawResponse);
                rawRequest           = await PrepareAsync();

                rawResponse = await GetResponseAsync(rawRequest);
            }

            if (rawResponse.StatusCode == HttpStatusCode.NotModified)
            {
                var cached = _config.Advanced.ModifiedSinceCache.Get(rawRequest);
                rawResponse.SetResponseStream(cached.ResponseStream);
            }
            else
            {
                await _config.Advanced.ModifiedSinceCache.AddAsync(rawRequest, rawResponse);
            }

            ResetModifiers();
            return(rawResponse);
        }