From fa85e2c6cf30e892edb8dfce4682719d35f1ea03 Mon Sep 17 00:00:00 2001 From: Felipe Taboada Date: Tue, 18 Feb 2020 17:13:25 -0300 Subject: [PATCH] fix content length on batched queries --- .../servlet/BatchedQueryResponseWriter.java | 3 +- .../AbstractGraphQLHttpServletSpec.groovy | 32 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/BatchedQueryResponseWriter.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/BatchedQueryResponseWriter.java index e7d7b5dd..bfa669a4 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/BatchedQueryResponseWriter.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/BatchedQueryResponseWriter.java @@ -3,6 +3,7 @@ import graphql.ExecutionResult; import graphql.kickstart.execution.GraphQLObjectMapper; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; @@ -32,7 +33,7 @@ public void write(HttpServletRequest request, HttpServletResponse response) thro responseBuilder.append(']'); String responseContent = responseBuilder.toString(); - response.setContentLength(responseContent.length()); + response.setContentLength(responseContent.getBytes(StandardCharsets.UTF_8).length); response.getWriter().write(responseContent); } diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy index 65925d2e..deb610ab 100644 --- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy +++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy @@ -13,6 +13,7 @@ import org.springframework.mock.web.MockHttpServletResponse import spock.lang.Shared import spock.lang.Specification +import java.nio.charset.StandardCharsets import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicReference @@ -108,10 +109,24 @@ class AbstractGraphQLHttpServletSpec extends Specification { then: response.getStatus() == STATUS_OK response.getContentType() == CONTENT_TYPE_JSON_UTF8 - response.getContentLength() == mapper.writeValueAsString(["data": ["echo": "test"]]).length() + response.getContentLength() == mapper.writeValueAsString(["data": ["echo": "test"]]).getBytes(StandardCharsets.UTF_8).length getResponseContent().data.echo == "test" } + def "query over HTTP GET returns data with correct contentLength"() { + setup: + request.addParameter('query', 'query { echo(arg:"special char á") }') + + when: + servlet.doGet(request, response) + + then: + response.getStatus() == STATUS_OK + response.getContentType() == CONTENT_TYPE_JSON_UTF8 + response.getContentLength() == mapper.writeValueAsString(["data": ["echo": "special char á"]]).getBytes(StandardCharsets.UTF_8).length + getResponseContent().data.echo == "special char á" + } + def "async query over HTTP GET starts async request"() { setup: servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env -> @@ -213,6 +228,21 @@ class AbstractGraphQLHttpServletSpec extends Specification { getBatchedResponseContent()[1].data.echo == "test" } + def "batched query over HTTP GET returns data with correct contentLength"() { + setup: + request.addParameter('query', '[{ "query": "query { echo(arg:\\"special char á\\") }" }, { "query": "query { echo(arg:\\"test\\") }" }]') + + when: + servlet.doGet(request, response) + + then: + response.getStatus() == STATUS_OK + response.getContentType() == CONTENT_TYPE_JSON_UTF8 + response.getContentLength() == mapper.writeValueAsString([["data": ["echo": "special char á"]], ["data": ["echo": "test"]]]).getBytes(StandardCharsets.UTF_8).length + getBatchedResponseContent()[0].data.echo == "special char á" + getBatchedResponseContent()[1].data.echo == "test" + } + def "batched query over HTTP GET with variables returns data"() { setup: request.addParameter('query', '[{ "query": "query { echo(arg:\\"test\\") }", "variables": { "arg": "test" } }, { "query": "query { echo(arg:\\"test\\") }", "variables": { "arg": "test" } }]')