public async Task <HttpResponseMessage> ExecuteRequestAsync(ODataRequest request, CancellationToken cancellationToken)
        {
            HttpConnection httpConnection = null;

            try
            {
                await PreExecuteAsync(request).ConfigureAwait(false);

                _session.Trace("{0} request: {1}", request.Method, request.RequestMessage.RequestUri.AbsoluteUri);
                if (request.RequestMessage.Content != null && (_session.Settings.TraceFilter & ODataTrace.RequestContent) != 0)
                {
                    var content = await request.RequestMessage.Content.ReadAsStringAsync().ConfigureAwait(false);

                    _session.Trace("Request content:{0}{1}", Environment.NewLine, content);
                }

                HttpResponseMessage response;
                if (_session.Settings.RequestExecutor != null)
                {
                    response = await _session.Settings.RequestExecutor(request.RequestMessage).ConfigureAwait(false);
                }
                else
                {
                    httpConnection = _session.Settings.RenewHttpConnection
                        ? new HttpConnection(_session.Settings)
                        : _session.GetHttpConnection();

                    response = await httpConnection.HttpClient.SendAsync(request.RequestMessage, cancellationToken).ConfigureAwait(false);

                    if (cancellationToken.IsCancellationRequested)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                    }
                }

                _session.Trace("Request completed: {0}", response.StatusCode);
                if (response.Content != null && (_session.Settings.TraceFilter & ODataTrace.ResponseContent) != 0)
                {
                    var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                    _session.Trace("Response content:{0}{1}", Environment.NewLine, content);
                }

                await PostExecute(response).ConfigureAwait(false);

                return(response);
            }
            catch (WebException ex)
            {
                throw WebRequestException.CreateFromWebException(ex);
            }
            catch (AggregateException ex)
            {
                if (ex.InnerException is WebException)
                {
                    throw WebRequestException.CreateFromWebException(ex.InnerException as WebException);
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                if (httpConnection != null && _session.Settings.RenewHttpConnection)
                {
                    httpConnection.Dispose();
                }
            }
        }