/// <summary> /// Sends an HTTP get request to cluster http gateway. /// </summary> /// <param name="requestFunc">Func to create HttpRequest to send.</param> /// <param name="relativeUri">The relative URI.</param> /// <param name="requestId">Request Id for corelation</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The payload of the GET response.</returns> /// <exception cref="ServiceFabricException">When the response is not a success.</exception> private async Task <HttpResponseMessage> SendAsyncHandleUnsuccessfulResponse( Func <HttpRequestMessage> requestFunc, string relativeUri, string requestId, CancellationToken cancellationToken) { var response = await this.SendAsyncHandleSecurityExceptions(relativeUri, requestId, requestFunc, cancellationToken); if (response.IsSuccessStatusCode) { return(response); } var message = string.Format( SR.ErrorHttpOperationUnsuccessfulFormatString, relativeUri, response.StatusCode, response.ReasonPhrase, response.RequestMessage); ServiceFabricHttpClientEventSource.Current.ErrorResponse($"{this.ClientId}:{requestId}", message); if (response.Content != null) { FabricError error = null; try { var contentStream = await response.Content.ReadAsStreamAsync(); using (var streamReader = new StreamReader(contentStream)) { using (var reader = new JsonTextReader(streamReader)) { error = FabricErrorConverter.Deserialize(reader); } } } catch (JsonReaderException) { throw new ServiceFabricException( $"Server returned error while processing the request but did not provide a meaningful error response. Response Error Code {response.StatusCode}"); } if (error != null) { throw new ServiceFabricException($"{error.Error.Code.ToString()}. {error.Error.Message}"); } } else { throw new ServiceFabricException( $"Server returned error while processing the request but did not provide a meaningful error response. Response Error Code {response.StatusCode}"); } return(response); }
/// <summary> /// Sends an HTTP get request to cluster http gateway. /// </summary> /// <param name="requestFunc">Func to create HttpRequest to send.</param> /// <param name="requestUri">Request Uri.</param> /// <param name="clientRequestId">Request Id for corelation</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The payload of the GET response.</returns> /// <exception cref="ServiceFabricException">When the response is not a success.</exception> private async Task <HttpResponseMessage> SendAsyncHandleUnsuccessfulResponse( Func <HttpRequestMessage> requestFunc, Uri requestUri, string clientRequestId, CancellationToken cancellationToken) { HttpRequestMessage FinalRequestFunc() { var request = requestFunc.Invoke(); request.RequestUri = requestUri; // Add claims token to request if needed. this.bearerTokenHandler.AddTokenToRequest(request); // Add client request id to header for corelation on server. request.Headers.Add(Constants.ServiceFabricHttpRequestIdHeaderName, $"{clientRequestId}"); request.Headers.Add(Constants.ServiceFabricHttpClientTypeHeaderName, $"{this.ClientTypeHeaderValue}"); return(request); } var response = await this.SendAsyncHandleSecurityExceptions(FinalRequestFunc, clientRequestId, cancellationToken); if (response.IsSuccessStatusCode) { return(response); } // Continue with handling the unsuccessful response. var message = string.Format( SR.ErrorHttpOperationUnsuccessfulFormatString, requestUri.ToString(), response.StatusCode, response.ReasonPhrase, response.RequestMessage); ServiceFabricHttpClientEventSource.Current.ErrorResponse($"{clientRequestId}", message); // Try to get Fabric Error Code if present in response body. if (response.Content != null) { FabricError error = null; try { var contentStream = await response.Content.ReadAsStreamAsync(); if (contentStream.Length != 0) { using (var streamReader = new StreamReader(contentStream)) { using (var reader = new JsonTextReader(streamReader)) { error = FabricErrorConverter.Deserialize(reader); } } } } catch (JsonReaderException ex) { ServiceFabricHttpClientEventSource.Current.ErrorMessage($"{clientRequestId}", $"Request Url: {requestUri} JsonReaderException: {ex.ToString()}"); throw new ServiceFabricException(string.Format(SR.ServerErrorNoMeaningFulResponse, response.StatusCode)); } if (error != null) { throw new ServiceFabricException(error.Message, error.ErrorCode ?? FabricErrorCodes.UNKNOWN, false); } else { // Handle NotFound 404, without any ErrorCode. if (response.StatusCode.Equals(HttpStatusCode.NotFound)) { throw new ServiceFabricException(SR.ErrorMessageHTTP404, FabricErrorCodes.FABRIC_E_DOES_NOT_EXIST, false); } } } // Couldn't determine FabricError code, throw exception with status code. throw new ServiceFabricException(string.Format(SR.ServerErrorNoMeaningFulResponse, response.StatusCode)); }