diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlighterInterceptor.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlighterInterceptor.java index fcecbb5e94d..ea10c3f73e8 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlighterInterceptor.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlighterInterceptor.java @@ -430,6 +430,10 @@ public class ResponseHighlighterInterceptor { private boolean handleOutgoingResponse(RequestDetails theRequestDetails, ResponseDetails theResponseObject, HttpServletRequest theServletRequest, HttpServletResponse theServletResponse, String theGraphqlResponse, IBaseResource theResourceResponse) { + if (theResourceResponse == null && theGraphqlResponse == null) { + // this will happen during, for example, a bulk export polling request + return true; + } /* * Request for _raw */ diff --git a/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlightingInterceptorTest.java b/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlightingInterceptorTest.java index 2bdf4c62322..6dbde322bc4 100644 --- a/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlightingInterceptorTest.java +++ b/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/interceptor/ResponseHighlightingInterceptorTest.java @@ -15,8 +15,10 @@ import ca.uhn.fhir.rest.annotation.Search; import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.rest.api.EncodingEnum; import ca.uhn.fhir.rest.api.RequestTypeEnum; +import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.api.server.ResponseDetails; import ca.uhn.fhir.rest.server.IResourceProvider; +import ca.uhn.fhir.rest.server.IRestfulServerDefaults; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; @@ -57,6 +59,7 @@ import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -868,6 +871,30 @@ public class ResponseHighlightingInterceptorTest { assertThat(responseContent, (containsStringIgnoringCase("Content-Type"))); } + @Test + public void testNullResponseResource() { + ourInterceptor.setShowResponseHeaders(true); + + final RequestDetails requestDetails = mock(RequestDetails.class); + when(requestDetails.getRequestType()).thenReturn(RequestTypeEnum.GET); + final IRestfulServerDefaults server = mock(IRestfulServerDefaults.class); + when(server.getDefaultResponseEncoding()).thenReturn(EncodingEnum.JSON); + when(server.getFhirContext()).thenReturn(ourCtx); + when(requestDetails.getServer()).thenReturn(server); + + final ResponseDetails responseObject = mock(ResponseDetails.class); + + final HttpServletRequest servletRequest = mock(HttpServletRequest.class); + final Enumeration headers = mock(Enumeration.class); + when(headers.hasMoreElements()).thenReturn(true).thenReturn(false); + when(headers.nextElement()).thenReturn("text/html"); + when(servletRequest.getHeaders(Constants.HEADER_ACCEPT)).thenReturn(headers); + + final HttpServletResponse servletResponse = mock(HttpServletResponse.class); + + assertTrue(ourInterceptor.outgoingResponse(requestDetails, responseObject, servletRequest, servletResponse)); + } + @AfterAll public static void afterClassClearContext() throws Exception { JettyUtil.closeServer(ourServer);