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); })); }