internal void SetContent <TResponse>(HttpRequestMessage httpRequest, BaseRestClientRequest <TResponse> request)
            where TResponse : RestClientResponse
        {
            if (request.Content == null)
            {
                return;
            }

            if (_options.CompressionMethod == CompressionMethod.None)
            {
                httpRequest.Content = request.Content;
                return;
            }

            //we need to compress
            request.Content = new CompressedContent(request.Content, _options.CompressionMethod);
        }
        /// <summary>
        /// Executes a <see cref="RestClientRequest{TData}"/>
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <typeparam name="TResponse"></typeparam>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="InvalidOperationException"></exception>
        /// <exception cref="ClickViewClientException"></exception>
        public async Task <TResponse> ExecuteAsync <TResponse>(BaseRestClientRequest <TResponse> request, CancellationToken token = default)
            where TResponse : RestClientResponse
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            token.ThrowIfCancellationRequested();

            if (_options.Authenticator != null)
            {
                await _options.Authenticator.AuthenticateAsync(request, token).ConfigureAwait(false);
            }

            token.ThrowIfCancellationRequested();

            var requestUri = new Uri(
                QueryHelpers.AddQueryString(request.Resource, request.Parameters),
                UriKind.RelativeOrAbsolute);

            // if the request uri is not absolute, use the base uri
            if (!requestUri.IsAbsoluteUri)
            {
                if (_baseAddress != null)
                {
                    requestUri = new Uri(_baseAddress, requestUri);
                }
                else
                {
                    // only do the following logic if the _httpClient doesn't have a base address already
                    // we should remove this if we update the ctor to always have a baseAddress

                    if (_httpClient.BaseAddress == null)
                    {
                        throw new InvalidOperationException(
                                  "An invalid request URI was provided. The request URI must either be an absolute URI or BaseAddress must be set.");
                    }

                    requestUri = new Uri(_httpClient.BaseAddress, requestUri);
                }
            }

            using (var httpRequest = new HttpRequestMessage(request.Method, requestUri))
            {
                foreach (var h in request.Headers)
                {
                    httpRequest.Headers.TryAddWithoutValidation(h.Key, h.Value);
                }

                SetContent(httpRequest, request);

                try
                {
                    using (var response = await _httpClient.SendAsync(httpRequest, token).ConfigureAwait(false))
                    {
                        return(await request.GetResponseAsync(response).ConfigureAwait(false));
                    }
                }
                catch (HttpRequestException e)
                {
                    throw new ClickViewClientException(e.Message, e);
                }
            }
        }