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 CommandRequest BuildRequest(string asid, string jwtOrgCode, string providerOds)
        {
            var consumer = _sdsService.GetFor(asid);
            var provider = _sdsService.GetFor(providerOds, FhirConstants.ReadBinaryInteractionId);

            if (consumer == null)
            {
                throw new HttpFhirException("Local system not registered with SDS.", OperationOutcomeFactory.CreateGenericError($"Unknown ASID {asid}"), HttpStatusCode.BadRequest);
            }

            if (provider == null)
            {
                throw new HttpFhirException("External system not registered with SDS.", OperationOutcomeFactory.CreateGenericError($"Unknown ODS code {providerOds}"), HttpStatusCode.BadRequest);
            }

            var command = new CommandRequest
            {
                BaseUrl          = $"{(_spineSettings.SspUseSecure ? _spineSettings.SspSecureServerUrl : _spineSettings.SspServerUrl)}",
                ResourceType     = ResourceType.Binary,
                Method           = HttpMethod.Get,
                UseSecure        = _spineSettings.SspUseSecure,
                ClientThumbprint = consumer?.Thumbprint,
                ServerThumbprint = _spineSettings.SspSslThumbprint,
                RegenerateUrl    = false
            };

            var jwt = JwtFactory.Generate(JwtScopes.Read, jwtOrgCode, "fakeRoleId", asid, command.FullUrl.AbsoluteUri, SystemUrlBase, "*");

            command.Headers.Add(HeaderNames.Authorization, $"Bearer {jwt}");
            command.Headers.Add(FhirConstants.HeaderSspFrom, consumer?.Asid); // GET consumer ASID
            command.Headers.Add(FhirConstants.HeaderSspTo, provider?.Asid);   // GET provider asid
            command.Headers.Add(FhirConstants.HeaderSspInterationId, FhirConstants.ReadBinaryInteractionId);
            command.Headers.Add(FhirConstants.HeaderSspTraceId, Guid.NewGuid().ToString());

            return(command);
        }