Skip to content

Commit 838c6b4

Browse files
authored
Merge pull request #82 from ashu-walmart/support-graphql-contenttype
Add support for application/graphql content-type
2 parents 07b87a8 + c91ffb7 commit 838c6b4

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/main/java/graphql/servlet/GraphQLServlet.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.databind.*;
77
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
88
import com.google.common.io.ByteStreams;
9+
import com.google.common.io.CharStreams;
910
import graphql.ExecutionInput;
1011
import graphql.ExecutionResult;
1112
import graphql.GraphQL;
@@ -43,6 +44,7 @@ public abstract class GraphQLServlet extends HttpServlet implements Servlet, Gra
4344
public static final Logger log = LoggerFactory.getLogger(GraphQLServlet.class);
4445

4546
public static final String APPLICATION_JSON_UTF8 = "application/json;charset=UTF-8";
47+
public static final String APPLICATION_GRAPHQL = "application/graphql";
4648
public static final int STATUS_OK = 200;
4749
public static final int STATUS_BAD_REQUEST = 400;
4850

@@ -114,12 +116,16 @@ public GraphQLServlet(ObjectMapperConfigurer objectMapperConfigurer, List<GraphQ
114116
final Object rootObject = createRootObject(Optional.of(request), Optional.of(response));
115117

116118
try {
117-
if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data") && !request.getParts().isEmpty()) {
119+
if (APPLICATION_GRAPHQL.equals(request.getContentType())) {
120+
String query = CharStreams.toString(request.getReader());
121+
doQuery(query, null, null, getSchemaProvider().getSchema(request), context, rootObject, request, response);
122+
} else if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data") && !request.getParts().isEmpty()) {
118123
final Map<String, List<Part>> fileItems = request.getParts().stream()
119124
.collect(Collectors.toMap(
120125
Part::getName,
121126
Collections::singletonList,
122127
(l1, l2) -> Stream.concat(l1.stream(), l2.stream()).collect(Collectors.toList())));
128+
123129
context.setFiles(Optional.of(fileItems));
124130

125131
if (fileItems.containsKey("graphql")) {

src/test/groovy/graphql/servlet/GraphQLServletSpec.groovy

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,20 @@ class GraphQLServletSpec extends Specification {
317317
getResponseContent().data.echo == "test"
318318
}
319319

320+
def "query over HTTP POST body with graphql contentType returns data"() {
321+
setup:
322+
request.addHeader("Content-Type", "application/graphql")
323+
request.setContent('query { echo(arg:"test") }'.getBytes("UTF-8"))
324+
325+
when:
326+
servlet.doPost(request, response)
327+
328+
then:
329+
response.getStatus() == STATUS_OK
330+
response.getContentType() == CONTENT_TYPE_JSON_UTF8
331+
getResponseContent().data.echo == "test"
332+
}
333+
320334
def "query over HTTP POST body with variables returns data"() {
321335
setup:
322336
request.setContent(mapper.writeValueAsBytes([

0 commit comments

Comments
 (0)