diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/SingleQueryResponseWriter.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/SingleQueryResponseWriter.java index 671ebdf7..417cad69 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/SingleQueryResponseWriter.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/SingleQueryResponseWriter.java @@ -2,11 +2,12 @@ import graphql.ExecutionResult; import graphql.kickstart.execution.GraphQLObjectMapper; +import lombok.RequiredArgsConstructor; + import java.io.IOException; import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; @RequiredArgsConstructor class SingleQueryResponseWriter implements QueryResponseWriter { @@ -18,6 +19,7 @@ class SingleQueryResponseWriter implements QueryResponseWriter { public void write(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType(HttpRequestHandler.APPLICATION_JSON_UTF8); response.setStatus(HttpRequestHandler.STATUS_OK); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); String responseContent = graphQLObjectMapper.serializeResultAsJson(result); response.setContentLength(responseContent.getBytes(StandardCharsets.UTF_8).length); response.getWriter().write(responseContent); diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/SingleQueryResponseWriterTest.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/SingleQueryResponseWriterTest.groovy new file mode 100644 index 00000000..4c7a6ca9 --- /dev/null +++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/SingleQueryResponseWriterTest.groovy @@ -0,0 +1,40 @@ +package graphql.kickstart.servlet + +import com.fasterxml.jackson.databind.ObjectMapper +import graphql.ExecutionResultImpl +import graphql.kickstart.execution.GraphQLObjectMapper +import org.codehaus.groovy.runtime.StringBufferWriter +import spock.lang.Specification +import spock.lang.Unroll + +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +class SingleQueryResponseWriterTest extends Specification { + + @Unroll + def "should write utf8 results into the response with content #result"() { + given: + def graphQLObjectMapperMock = GraphQLObjectMapper.newBuilder().withObjectMapperProvider({ new ObjectMapper() }).build() + graphQLObjectMapperMock.getJacksonMapper() >> new ObjectMapper() + + def requestMock = Mock(HttpServletRequest) + def responseMock = Mock(HttpServletResponse) + + def responseContentBuffer = new StringBuffer() + responseMock.getWriter() >> new PrintWriter(new StringBufferWriter(responseContentBuffer)) + 1 * responseMock.setContentLength(expectedContentLenght) + 1 * responseMock.setCharacterEncoding("UTF-8") + + expect: + def writer = new SingleQueryResponseWriter(new ExecutionResultImpl(result, []), graphQLObjectMapperMock) + writer.write(requestMock, responseMock) + + responseContentBuffer.toString() == expectedResponseContent + + where: + result || expectedContentLenght | expectedResponseContent + [testValue: "abcde"] || 30 | """{"data":{"testValue":"abcde"}}""" + [testValue: "äöüüöß"] || 37 | """{"data":{"testValue":"äöüüöß"}}""" + } +}