public static FhirResult SetETagHeader(this FhirResult fhirResult) { var resource = fhirResult.Resource; if (resource != null && resource.Meta != null) { return(fhirResult.SetETagHeader(WeakETag.FromVersionId(resource.Meta.VersionId))); } return(fhirResult); }
public override void OnActionExecuted(ActionExecutedContext context) { EnsureArg.IsNotNull(context, nameof(context)); if (context?.Exception is FhirException fhirException) { FhirResult fhirResult = FhirResult.Create( new OperationOutcome { Id = _fhirRequestContextAccessor.FhirRequestContext.CorrelationId, Issue = fhirException.Issues.ToList(), }, HttpStatusCode.BadRequest); switch (fhirException) { case ResourceGoneException resourceGoneException: fhirResult.StatusCode = HttpStatusCode.Gone; if (!string.IsNullOrEmpty(resourceGoneException.DeletedResource?.VersionId)) { fhirResult.SetETagHeader(WeakETag.FromVersionId(resourceGoneException.DeletedResource.VersionId)); } break; case ResourceNotFoundException _: fhirResult.StatusCode = HttpStatusCode.NotFound; break; case MethodNotAllowedException _: fhirResult.StatusCode = HttpStatusCode.MethodNotAllowed; break; case ServiceUnavailableException _: case OpenIdConfigurationException _: fhirResult.StatusCode = HttpStatusCode.ServiceUnavailable; break; case ResourceNotValidException _: case BadRequestException _: fhirResult.StatusCode = HttpStatusCode.BadRequest; break; case ResourceConflictException _: fhirResult.StatusCode = HttpStatusCode.Conflict; break; case UnsupportedMediaTypeException _: fhirResult.StatusCode = HttpStatusCode.UnsupportedMediaType; break; case PreconditionFailedException _: fhirResult.StatusCode = HttpStatusCode.PreconditionFailed; break; case InvalidSearchOperationException _: case SearchOperationNotSupportedException _: fhirResult.StatusCode = HttpStatusCode.Forbidden; break; case UnsupportedConfigurationException _: fhirResult.StatusCode = HttpStatusCode.InternalServerError; break; case RequestRateExceededException ex: fhirResult.StatusCode = HttpStatusCode.TooManyRequests; if (ex.RetryAfter != null) { fhirResult.Headers.Add( RetryAfterHeaderName, ex.RetryAfter.Value.TotalMilliseconds.ToString(CultureInfo.InvariantCulture)); } break; } context.Result = fhirResult; context.ExceptionHandled = true; } }