private async SystemTasks.Task <FhirResponse> Request(CommandRequest request) { var internalTraceId = Guid.NewGuid(); var fhirResponse = new FhirResponse(); var handler = _httpRequestHelper.GetClientHandler(request); using (var client = new HttpClient(handler)) { var httpRequest = _httpRequestHelper.GetRequestMessage(request); //LogRequest(httpRequest, request.Resource, internalTraceId); using (HttpResponseMessage res = await client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead)) using (HttpContent content = res.Content) { //res.EnsureSuccessStatusCode(); //will throw a HttpRequestException to catch in future var mediaType = content.Headers.ContentType?.MediaType?.ToLowerInvariant(); if (res.Headers?.Location != null) { fhirResponse.ResponseLocation = res.Headers.Location; } //TODO: upgrade to core 2.2 and use IHttpClientFactory // for delegate handling and retries policy if (!string.IsNullOrEmpty(mediaType) && mediaType.Contains("fhir")) { fhirResponse = await ParseResource(content, request, fhirResponse); } else { fhirResponse = await ParseBinary(content, request, fhirResponse); } //get content from fhirResponse //string responseMessage = null; //LogResponse(res.Headers, (int)res.StatusCode, responseMessage, internalTraceId); if (!res.IsSuccessStatusCode) { var diagnostics = $"{res.StatusCode} encountered for the URL {httpRequest.RequestUri.AbsoluteUri}"; var errorResource = (fhirResponse.Resource.ResourceType != ResourceType.OperationOutcome) ? OperationOutcomeFactory.CreateGenericError(diagnostics) : fhirResponse.GetResource <OperationOutcome>(); throw new HttpFhirException("Request resulted in an error.", errorResource, res.StatusCode); } } } return(await SystemTasks.Task.Run(() => fhirResponse)); }
private async SystemTasks.Task <FhirResponse> Request(CommandRequest request) { var fhirResponse = new FhirResponse(); var handler = GetHandler(request); using (var client = new HttpClient(handler)) { var httpRequest = GetMessage(request); using (HttpResponseMessage res = await client.SendAsync(httpRequest)) using (HttpContent content = res.Content) { //res.EnsureSuccessStatusCode(); //will throw a HttpRequestException to catch in future var data = content.ReadAsStreamAsync().Result; if (data == null) { throw new HttpRequestException($"Request resulted in nothing for: {request.FullUrl}."); } if (res.Headers?.Location != null) { fhirResponse.ResponseLocation = res.Headers.Location; } using (var reader = new StreamReader(data, Encoding.UTF8)) { try { var body = reader.ReadToEnd(); if (!string.IsNullOrEmpty(body)) { var jsonParser = new FhirJsonParser(); fhirResponse.Resource = jsonParser.Parse <Resource>(body); } if (!res.IsSuccessStatusCode) { throw new HttpRequestException(new FhirJsonSerializer().SerializeToString(fhirResponse.GetResource <OperationOutcome>())); } } catch (Exception ex) { throw new HttpRequestException(ex.Message, ex.InnerException); } } } } return(await SystemTasks.Task.Run(() => fhirResponse)); }