diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLMultipartInvocationInputParser.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLMultipartInvocationInputParser.java index ea59eea1..ae43df26 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLMultipartInvocationInputParser.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLMultipartInvocationInputParser.java @@ -87,9 +87,10 @@ private GraphQLInvocationInput getGraphQLInvocationInput( } }); - String query = read(inputStream); + String query = read(inputStream, request.getCharacterEncoding()); if ("query".equals(key) && isSingleQuery(query)) { - GraphQLRequest graphqlRequest = buildRequestFromQuery(query, graphQLObjectMapper, parts); + GraphQLRequest graphqlRequest = + buildRequestFromQuery(query, graphQLObjectMapper, parts, request.getCharacterEncoding()); variablesMap.ifPresent(m -> mapMultipartVariables(graphqlRequest, m, parts)); return invocationInputFactory.create(graphqlRequest, request, response); } else if (isSingleQuery(query)) { @@ -109,6 +110,7 @@ private Optional findPart(Map> parts) { .filter(parts::containsKey) .map(key -> getPart(parts, key)) .findFirst() + .filter(Optional::isPresent) .map(Optional::get); } @@ -141,33 +143,38 @@ private void mapMultipartVariables( } private GraphQLRequest buildRequestFromQuery( - String query, GraphQLObjectMapper graphQLObjectMapper, Map> parts) + String query, + GraphQLObjectMapper graphQLObjectMapper, + Map> parts, + String charset) throws IOException { Map variables = null; final Optional variablesItem = getPart(parts, "variables"); if (variablesItem.isPresent()) { variables = - graphQLObjectMapper.deserializeVariables(read(variablesItem.get().getInputStream())); + graphQLObjectMapper.deserializeVariables( + read(variablesItem.get().getInputStream(), charset)); } Map extensions = null; final Optional extensionsItem = getPart(parts, "extensions"); if (extensionsItem.isPresent()) { extensions = - graphQLObjectMapper.deserializeExtensions(read(extensionsItem.get().getInputStream())); + graphQLObjectMapper.deserializeExtensions( + read(extensionsItem.get().getInputStream(), charset)); } String operationName = null; final Optional operationNameItem = getPart(parts, "operationName"); if (operationNameItem.isPresent()) { - operationName = read(operationNameItem.get().getInputStream()).trim(); + operationName = read(operationNameItem.get().getInputStream(), charset).trim(); } return new GraphQLRequest(query, variables, extensions, operationName); } - private String read(InputStream inputStream) throws IOException { - try (InputStreamReader streamReader = new InputStreamReader(inputStream); + private String read(InputStream inputStream, String charset) throws IOException { + try (InputStreamReader streamReader = new InputStreamReader(inputStream, charset); BufferedReader reader = new BufferedReader(streamReader)) { return reader.lines().collect(joining()); } diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java index 5b114c42..55cfb467 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java @@ -10,7 +10,6 @@ import graphql.kickstart.servlet.input.GraphQLInvocationInputFactory; import java.io.IOException; import java.util.List; -import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestHandlerImpl.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestHandlerImpl.java index 229c934a..aa71eaf4 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestHandlerImpl.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestHandlerImpl.java @@ -4,6 +4,7 @@ import graphql.GraphQLException; import graphql.kickstart.execution.input.GraphQLInvocationInput; import java.io.IOException; +import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -32,6 +33,9 @@ public HttpRequestHandlerImpl( @Override public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException { try { + if (request.getCharacterEncoding() == null) { + request.setCharacterEncoding(StandardCharsets.UTF_8.name()); + } GraphQLInvocationInputParser invocationInputParser = GraphQLInvocationInputParser.create( request, @@ -39,7 +43,7 @@ public void handle(HttpServletRequest request, HttpServletResponse response) thr configuration.getObjectMapper(), configuration.getContextSetting()); GraphQLInvocationInput invocationInput = - invocationInputParser.getGraphQLInvocationInput(request, response); + invocationInputParser. getGraphQLInvocationInput(request, response); requestInvoker.execute(invocationInput, request, response); } catch (GraphQLException | JsonProcessingException e) { response.setStatus(STATUS_BAD_REQUEST);