Skip to content

Commit 52ff6c1

Browse files
author
agairol
committed
Add support for application/graphql content-type as mentioned in https://graphql.org/learn/serving-over-http/#post-request
1 parent cacdfb2 commit 52ff6c1

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.fasterxml.jackson.databind.ObjectMapper;
1010
import com.fasterxml.jackson.databind.ObjectReader;
1111
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
12+
import com.google.common.io.CharStreams;
1213
import graphql.ExecutionInput;
1314
import graphql.ExecutionResult;
1415
import graphql.GraphQL;
@@ -60,6 +61,7 @@ public abstract class GraphQLServlet extends HttpServlet implements Servlet, Gra
6061
public static final Logger log = LoggerFactory.getLogger(GraphQLServlet.class);
6162

6263
public static final String APPLICATION_JSON_UTF8 = "application/json;charset=UTF-8";
64+
public static final String APPLICATION_GRAPHQL = "application/graphql";
6365
public static final int STATUS_OK = 200;
6466
public static final int STATUS_BAD_REQUEST = 400;
6567

@@ -128,7 +130,10 @@ public GraphQLServlet(ObjectMapperConfigurer objectMapperConfigurer, List<GraphQ
128130
final Object rootObject = createRootObject(Optional.of(request), Optional.of(response));
129131

130132
try {
131-
if (ServletFileUpload.isMultipartContent(request)) {
133+
if (APPLICATION_GRAPHQL.equals(request.getContentType())) {
134+
String query = CharStreams.toString(request.getReader());
135+
doQuery(query, null, null, getSchemaProvider().getSchema(request), context, rootObject, request, response);
136+
} else if (ServletFileUpload.isMultipartContent(request)) {
132137
final Map<String, List<FileItem>> fileItems = fileUpload.parseParameterMap(request);
133138
context.setFiles(Optional.of(fileItems));
134139

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)