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); } }
private Task <ElasticsearchResponse <T> > HandleStreamResponse <T>(Task <ElasticsearchResponse <Stream> > t, IRequestTimings rq, TransportRequestState <T> requestState) { var streamResponse = t.Result; // Audit the call into connection straight away rq.Finish(streamResponse != null && streamResponse.Success, streamResponse == null ? -1 : streamResponse.HttpStatusCode); rq.Dispose(); // Figure out the maximum number of retries, this might var maxRetries = this._delegator.GetMaximumRetries(requestState.RequestConfiguration); var retried = requestState.Retried; // If we haven't recieved a successful response and we are not yet done processing the stream attempt a retry if (t.Status != TaskStatus.RanToCompletion || !this.DoneProcessing(streamResponse, requestState, maxRetries, retried)) { return(this.RetryRequestAsync <T>(requestState)); } // If the response never recieved a status code and has a caught exception make sure we throw it if (streamResponse.HttpStatusCode.GetValueOrDefault(-1) <= 0 && streamResponse.OriginalException != null) { throw streamResponse.OriginalException; } // If the user explicitly wants a stream return the undisposed stream if (typeof(Stream).IsAssignableFrom(typeof(T))) { return(this.ReturnResponseAsTask <T>(streamResponse)); } var readResponseTask = (typeof(VoidResponse).IsAssignableFrom(typeof(T))) ? this.ReturnVoidResponse <T>(streamResponse) : this.ReturnTypedResponse(streamResponse, requestState); return(readResponseTask.ContinueWith(gotTypedResponse => { var r = gotTypedResponse.Result; if (this._settings.KeepRawResponse) { r.Response.ResponseRaw = r.Bytes; } this.OptionallyCloseResponseStreamAndSetSuccess(requestState, r.Error, r.Response, t.Result); if (r.Error != null && this._settings.ThrowOnElasticsearchServerExceptions) { throw new ElasticsearchServerException(r.Error); } if (r.Response.SuccessOrKnownError) { this._connectionPool.MarkAlive(requestState.CurrentNode); } return r.Response; })); }