IList <Uri> ITransportDelegator.Sniff(ITransportRequestState ownerState = null)
        {
            int pingTimeout      = Settings.PingTimeout.GetValueOrDefault(DefaultPingTimeout);
            var requestOverrides = new RequestConfiguration
            {
                ConnectTimeout = pingTimeout,
                RequestTimeout = pingTimeout,
                DisableSniff   = true //sniff call should never recurse
            };

            var requestParameters = new RequestParameters {
                RequestConfiguration = requestOverrides
            };

            try
            {
                string path = "_nodes/_all/clear?timeout=" + pingTimeout;
                OrientdbResponse <Stream> response;
                using (var requestState = new TransportRequestState <Stream>(Settings, requestParameters, "GET", path))
                {
                    response = _requestHandler.Request(requestState);

                    //inform the owing request state of the requests the sniffs did.
                    if (requestState.RequestMetrics != null && ownerState != null)
                    {
                        foreach (
                            RequestMetrics r in
                            requestState.RequestMetrics.Where(p => p.RequestType == RequestType.OrientdbCall))
                        {
                            r.RequestType = RequestType.Sniff;
                        }


                        if (ownerState.RequestMetrics == null)
                        {
                            ownerState.RequestMetrics = new List <RequestMetrics>();
                        }
                        ownerState.RequestMetrics.AddRange(requestState.RequestMetrics);
                    }
                    if (response.HttpStatusCode.HasValue && response.HttpStatusCode == (int)HttpStatusCode.Unauthorized)
                    {
                        throw new OrientdbAuthenticationException(response);
                    }
                    if (response.Response == null)
                    {
                        return(null);
                    }

                    using (response.Response)
                    {
                        return(Sniffer.FromStream(response, response.Response, Serializer));
                    }
                }
            }
            catch (MaxRetryException e)
            {
                throw new MaxRetryException(new SniffException(e));
            }
        }
        Task <bool> ITransportDelegator.PingAsync(ITransportRequestState requestState)
        {
            int pingTimeout = Settings.PingTimeout.GetValueOrDefault(DefaultPingTimeout);

            pingTimeout = requestState.RequestConfiguration != null
                ? requestState.RequestConfiguration.ConnectTimeout.GetValueOrDefault(pingTimeout)
                : pingTimeout;

            var requestOverrides = new RequestConfiguration
            {
                ConnectTimeout = pingTimeout,
                RequestTimeout = pingTimeout
            };
            IRequestTimings rq = requestState.InitiateRequest(RequestType.Ping);

            try
            {
                return(Connection.Head(requestState.CreatePathOnCurrentNode(""), requestOverrides)
                       .ContinueWith(t =>
                {
                    if (t.IsFaulted)
                    {
                        rq.Finish(false, null);
                        rq.Dispose();
                        throw new PingException(requestState.CurrentNode, t.Exception);
                    }
                    rq.Finish(t.Result.Success, t.Result.HttpStatusCode);
                    rq.Dispose();
                    OrientdbResponse <Stream> response = t.Result;
                    if (!response.HttpStatusCode.HasValue || response.HttpStatusCode.Value == -1)
                    {
                        throw new PingException(requestState.CurrentNode, t.Exception);
                    }
                    if (response.HttpStatusCode == (int)HttpStatusCode.Unauthorized)
                    {
                        throw new OrientdbAuthenticationException(response);
                    }
                    using (response.Response)
                        return response.Success;
                }));
            }
            catch (OrientdbAuthenticationException)
            {
                throw;
            }
            catch (Exception e)
            {
                var tcs           = new TaskCompletionSource <bool>();
                var pingException = new PingException(requestState.CurrentNode, e);
                tcs.SetException(pingException);
                return(tcs.Task);
            }
        }
        /* PING/SNIFF	*** ********************************************/

        bool ITransportDelegator.Ping(ITransportRequestState requestState)
        {
            int pingTimeout = Settings.PingTimeout.GetValueOrDefault(DefaultPingTimeout);

            pingTimeout = requestState.RequestConfiguration != null
                ? requestState.RequestConfiguration.ConnectTimeout.GetValueOrDefault(pingTimeout)
                : pingTimeout;

            var requestOverrides = new RequestConfiguration
            {
                ConnectTimeout = pingTimeout,
                RequestTimeout = pingTimeout
            };

            try
            {
                OrientdbResponse <Stream> response;
                using (IRequestTimings rq = requestState.InitiateRequest(RequestType.Ping))
                {
                    response = Connection.HeadSync(requestState.CreatePathOnCurrentNode(""), requestOverrides);
                    rq.Finish(response.Success, response.HttpStatusCode);
                }
                if (!response.HttpStatusCode.HasValue || response.HttpStatusCode.Value == -1)
                {
                    throw new Exception("ping returned no status code", response.OriginalException);
                }
                if (response.HttpStatusCode == (int)HttpStatusCode.Unauthorized)
                {
                    throw new OrientdbAuthenticationException(response);
                }
                if (response.Response == null)
                {
                    return(response.Success);
                }
                using (response.Response)
                    return(response.Success);
            }
            catch (OrientdbAuthenticationException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new PingException(requestState.CurrentNode, e);
            }
        }