diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/BaseResourceReturningMethodBinding.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/BaseResourceReturningMethodBinding.java index 0042aadcbdd9..b7df1fac2302 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/BaseResourceReturningMethodBinding.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/BaseResourceReturningMethodBinding.java @@ -277,16 +277,27 @@ public Object invokeServer(IRestfulServer theServer, RequestDetails theReques When we write directly to an HttpServletResponse, the invocation returns null. However, we still want to invoke the SERVER_OUTGOING_RESPONSE pointcut. */ + + // if the response status code is set by the method, respect it. Otherwise, use the default 200. + int responseCode = Constants.STATUS_HTTP_200_OK; + if (theRequest instanceof ServletRequestDetails) { + HttpServletResponse servletResponse = ((ServletRequestDetails) theRequest).getServletResponse(); + if (servletResponse != null && servletResponse.getStatus() > 0) { + responseCode = servletResponse.getStatus(); + } + } + if (response == null) { ResponseDetails responseDetails = new ResponseDetails(); - responseDetails.setResponseCode(Constants.STATUS_HTTP_200_OK); + responseDetails.setResponseCode(responseCode); callOutgoingResponseHook(theRequest, responseDetails); return null; } else { Set summaryMode = RestfulServerUtils.determineSummaryMode(theRequest); ResponseDetails responseDetails = new ResponseDetails(); responseDetails.setResponseResource(response); - responseDetails.setResponseCode(Constants.STATUS_HTTP_200_OK); + responseDetails.setResponseCode(responseCode); + if (!callOutgoingResponseHook(theRequest, responseDetails)) { return null; }