private async Task ExecuteRequests(Hl7.Fhir.Model.Bundle responseBundle, Hl7.Fhir.Model.Bundle.HTTPVerb httpVerb) { foreach (RouteContext request in _requests[httpVerb]) { var entryComponent = new Hl7.Fhir.Model.Bundle.EntryComponent(); if (request.Handler != null) { HttpContext httpContext = request.HttpContext; await request.Handler.Invoke(httpContext); httpContext.Response.Body.Seek(0, SeekOrigin.Begin); string bodyContent = new StreamReader(httpContext.Response.Body).ReadToEnd(); ResponseHeaders responseHeaders = httpContext.Response.GetTypedHeaders(); entryComponent.Response = new Hl7.Fhir.Model.Bundle.ResponseComponent { Status = httpContext.Response.StatusCode.ToString(), Location = responseHeaders.Location?.OriginalString, Etag = responseHeaders.ETag?.ToString(), LastModified = responseHeaders.LastModified, }; if (!string.IsNullOrWhiteSpace(bodyContent)) { var entryComponentResource = _fhirJsonParser.Parse <Resource>(bodyContent); if (entryComponentResource.ResourceType == ResourceType.OperationOutcome) { entryComponent.Response.Outcome = entryComponentResource; } else { entryComponent.Resource = entryComponentResource; } } } else { entryComponent.Response = new Hl7.Fhir.Model.Bundle.ResponseComponent { Status = ((int)HttpStatusCode.NotFound).ToString() }; } responseBundle.Entry.Add(entryComponent); } }
private async Task ExecuteRequests(Hl7.Fhir.Model.Bundle responseBundle, Hl7.Fhir.Model.Bundle.HTTPVerb httpVerb) { foreach (RouteContext request in _requests[httpVerb]) { var entryComponent = new Hl7.Fhir.Model.Bundle.EntryComponent(); if (request.Handler != null) { HttpContext httpContext = request.HttpContext; IFhirRequestContext originalFhirRequestContext = _fhirRequestContextAccessor.FhirRequestContext; request.RouteData.Values.TryGetValue(KnownActionParameterNames.ResourceType, out object resourceType); var newFhirRequestContext = new FhirRequestContext( httpContext.Request.Method, httpContext.Request.GetDisplayUrl(), originalFhirRequestContext.BaseUri.OriginalString, originalFhirRequestContext.CorrelationId, httpContext.Request.Headers, httpContext.Response.Headers, resourceType?.ToString()) { Principal = originalFhirRequestContext.Principal, }; _fhirRequestContextAccessor.FhirRequestContext = newFhirRequestContext; _bundleHttpContextAccessor.HttpContext = httpContext; await request.Handler.Invoke(httpContext); httpContext.Response.Body.Seek(0, SeekOrigin.Begin); string bodyContent = new StreamReader(httpContext.Response.Body).ReadToEnd(); ResponseHeaders responseHeaders = httpContext.Response.GetTypedHeaders(); entryComponent.Response = new Hl7.Fhir.Model.Bundle.ResponseComponent { Status = httpContext.Response.StatusCode.ToString(), Location = responseHeaders.Location?.OriginalString, Etag = responseHeaders.ETag?.ToString(), LastModified = responseHeaders.LastModified, }; if (!string.IsNullOrWhiteSpace(bodyContent)) { var entryComponentResource = _fhirJsonParser.Parse <Resource>(bodyContent); if (entryComponentResource.ResourceType == ResourceType.OperationOutcome) { entryComponent.Response.Outcome = entryComponentResource; if (responseBundle.Type == Hl7.Fhir.Model.Bundle.BundleType.TransactionResponse) { ThrowTransactionException(httpContext, (OperationOutcome)entryComponentResource); } } else { entryComponent.Resource = entryComponentResource; } } else { if (httpContext.Response.StatusCode == (int)HttpStatusCode.Forbidden) { entryComponent.Response.Outcome = CreateOperationOutcome( OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Forbidden, Api.Resources.Forbidden); } } } else { entryComponent.Response = new Hl7.Fhir.Model.Bundle.ResponseComponent { Status = ((int)HttpStatusCode.NotFound).ToString(), Outcome = CreateOperationOutcome( OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.NotFound, string.Format(Api.Resources.BundleNotFound, $"{request.HttpContext.Request.Path}{request.HttpContext.Request.QueryString}")), }; } responseBundle.Entry.Add(entryComponent); } }