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