Skip to content

Commit ad778b7

Browse files
authored
Merge pull request #142 from jmccaull/master
Abstract servlet does not maintain http request data for application/graphql
2 parents 7e2c538 + 4d41541 commit ad778b7

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

src/main/java/graphql/servlet/AbstractGraphQLHttpServlet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public void init(ServletConfig servletConfig) {
148148
try {
149149
if (APPLICATION_GRAPHQL.equals(request.getContentType())) {
150150
String query = CharStreams.toString(request.getReader());
151-
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(new GraphQLRequest(query, null, null)), response);
151+
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(new GraphQLRequest(query, null, null), request, response), response);
152152
} else if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data") && !request.getParts().isEmpty()) {
153153
final Map<String, List<Part>> fileItems = request.getParts()
154154
.stream()

src/test/groovy/graphql/servlet/AbstractGraphQLHttpServletSpec.groovy

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,21 @@ class AbstractGraphQLHttpServletSpec extends Specification {
300300
getResponseContent().data.echo == "test"
301301
}
302302

303+
def "query over HTTP POST body with graphql contentType maintains request object"() {
304+
setup:
305+
request.addHeader("Content-Type", "application/graphql")
306+
request.addHeader("requestHeaderTest", "test")
307+
request.setContent('query { echo(arg:"test") }'.getBytes("UTF-8"))
308+
309+
when:
310+
servlet.doPost(request, response)
311+
312+
then:
313+
response.getStatus() == STATUS_OK
314+
response.getContentType() == CONTENT_TYPE_JSON_UTF8
315+
getResponseContent().extensions.requestHeaderTest == "true"
316+
}
317+
303318
def "query over HTTP POST body with variables returns data"() {
304319
setup:
305320
request.setContent(mapper.writeValueAsBytes([
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package graphql.servlet;
2+
3+
import graphql.ExecutionResult;
4+
import graphql.ExecutionResultImpl;
5+
import graphql.execution.instrumentation.SimpleInstrumentation;
6+
import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters;
7+
8+
import java.util.concurrent.CompletableFuture;
9+
10+
public class TestInstrumentation extends SimpleInstrumentation {
11+
@Override
12+
public CompletableFuture<ExecutionResult> instrumentExecutionResult(ExecutionResult executionResult, InstrumentationExecutionParameters parameters) {
13+
ExecutionResultImpl.Builder builder = ExecutionResultImpl.newExecutionResult().from((ExecutionResultImpl) executionResult);
14+
GraphQLContext context = parameters.getContext();
15+
if (context.getHttpServletRequest().map(req -> req.getHeader("requestHeaderTest")).isPresent()) {
16+
builder.addExtension("requestHeaderTest", "true");
17+
}
18+
return CompletableFuture.completedFuture(builder.build());
19+
}
20+
21+
}

src/test/groovy/graphql/servlet/TestUtils.groovy

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,25 @@ package graphql.servlet
22

33
import com.google.common.io.ByteStreams
44
import graphql.Scalars
5+
import graphql.execution.instrumentation.Instrumentation
56
import graphql.schema.*
67

78
class TestUtils {
89

910
static def createServlet(DataFetcher queryDataFetcher = { env -> env.arguments.arg },
1011
DataFetcher mutationDataFetcher = { env -> env.arguments.arg }) {
11-
GraphQLHttpServlet servlet = GraphQLHttpServlet.with(createGraphQlSchema(queryDataFetcher, mutationDataFetcher))
12+
GraphQLHttpServlet servlet = GraphQLHttpServlet.with(GraphQLConfiguration
13+
.with(createGraphQlSchema(queryDataFetcher, mutationDataFetcher))
14+
.with(createInstrumentedQueryInvoker()).build())
1215
servlet.init(null)
1316
return servlet
1417
}
1518

19+
static def createInstrumentedQueryInvoker() {
20+
Instrumentation instrumentation = new TestInstrumentation()
21+
GraphQLQueryInvoker.newBuilder().with([instrumentation]).build()
22+
}
23+
1624
static def createGraphQlSchema(DataFetcher queryDataFetcher = { env -> env.arguments.arg },
1725
DataFetcher mutationDataFetcher = { env -> env.arguments.arg }) {
1826
GraphQLObjectType query = GraphQLObjectType.newObject()

0 commit comments

Comments
 (0)