diff --git a/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java b/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java index 9bba5a8..43adfef 100644 --- a/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java +++ b/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java @@ -21,6 +21,8 @@ package org.apache.sling.graphql.core.servlet; import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; import java.util.Arrays; import java.util.Map; import java.util.regex.Matcher; @@ -314,10 +316,10 @@ private void execute(Resource resource, SlingHttpServletRequest request, SlingHt response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing request parameter:" + P_QUERY); return; } - - try (JsonWriter writer = Json.createWriter(response.getWriter())) { + // The Response Writer cannot be flushed or closed here to avoid issues with Redirects etc + try (JsonWriter writer = Json.createWriter(new NoCloseWriterWrapper(response.getWriter()))) { Map executionResult = queryExecutor.execute(query, result.getVariables(), resource, - request.getRequestPathInfo().getSelectors()); + request.getRequestPathInfo().getSelectors()); writer.write(Json.createObjectBuilder(executionResult).build().asJsonObject()); } catch(Exception ex) { throw new IOException(ex); @@ -327,7 +329,8 @@ private void execute(Resource resource, SlingHttpServletRequest request, SlingHt private void execute(@NotNull String persistedQuery, SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); - try (JsonWriter writer = Json.createWriter(response.getWriter())) { + // The Response Writer cannot be flushed or closed here to avoid issues with Redirects etc + try (JsonWriter writer = Json.createWriter(new NoCloseWriterWrapper(response.getWriter()))) { final QueryParser.Result result = QueryParser.fromJSON(persistedQuery); Map executionResult = queryExecutor.execute(result.getQuery(), result.getVariables(), request.getResource(), request.getRequestPathInfo().getSelectors()); @@ -353,4 +356,12 @@ private String getLocationHeaderValue(@NotNull SlingHttpServletRequest request, } + private class NoCloseWriterWrapper extends PrintWriter { + public NoCloseWriterWrapper(@NotNull Writer out) { + super(out); + } + + @Override + public void close() {} + } } diff --git a/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java b/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java index 1fe9d84..ae276cd 100644 --- a/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java +++ b/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java @@ -54,6 +54,8 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -183,6 +185,7 @@ private void assertPostWithBody(String contentType, int expectedStatus) throws I MockSlingHttpServletResponse response = context.response(); MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(context.bundleContext()); + java.io.PrintWriter writer = spy(response.getWriter()); request.setMethod("POST"); request.setContent(TEST_QUERY.getBytes(StandardCharsets.UTF_8)); @@ -195,6 +198,7 @@ private void assertPostWithBody(String contentType, int expectedStatus) throws I servlet.doPost(request, response); assertEquals(expectedStatus, response.getStatus()); + verify(writer, never()).close(); } @Test