예제 #1
0
        private Task <RavenJToken> SendRequestInternal(Func <HttpRequestMessage> getRequestMessage, bool readErrorString = true)
        {
            if (isRequestSentToServer && Debugger.IsAttached == false)
            {
                throw new InvalidOperationException("Request was already sent to the server, cannot retry request.");
            }
            isRequestSentToServer = true;

            return(RunWithAuthRetry(async() =>
            {
                try
                {
                    var requestMessage = getRequestMessage();
                    CopyHeadersToHttpRequestMessage(requestMessage);
                    Response = await httpClient.SendAsync(requestMessage).ConfigureAwait(false);
                    SetResponseHeaders(Response);
                    AssertServerVersionSupported();
                    ResponseStatusCode = Response.StatusCode;
                }
                catch (HttpRequestException e)
                {
                    var exception = ErrorResponseException.FromException(e);
                    exception.Data.Add(Constants.RequestFailedExceptionMarker, true);
                    Response = exception.Response;
                    ResponseStatusCode = Response.StatusCode;
                    throw exception;
                }
                catch (TaskCanceledException e)
                {
                    var exception = ErrorResponseException.FromException(e);
                    exception.Data.Add(Constants.RequestFailedExceptionMarker, true);
                    Response = exception.Response;
                    ResponseStatusCode = Response.StatusCode;
                    throw exception;
                }
                finally
                {
                    sp.Stop();
                    if (requestTimeMetric != null)
                    {
                        requestTimeMetric.Update((int)sp.Elapsed.TotalMilliseconds);
                    }
                }

                // throw the conflict exception
                return await CheckForErrorsAndReturnCachedResultIfAnyAsync(readErrorString).ConfigureAwait(false);
            }));
        }