Skip to content

Commit 5ba8c6f

Browse files
committed
Reinstated HttpServletResponse for custom context (fix #108)
1 parent adf89c6 commit 5ba8c6f

File tree

7 files changed

+40
-30
lines changed

7 files changed

+40
-30
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
version = 6.1.5-SNAPSHOT
1+
version = 6.2.0-SNAPSHOT
22
group = com.graphql-java-kickstart

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,13 @@ public AbstractGraphQLHttpServlet(List<GraphQLServletListener> listeners, boolea
8181
path = request.getServletPath();
8282
}
8383
if (path.contentEquals("/schema.json")) {
84-
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(INTROSPECTION_REQUEST, request), response);
84+
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(INTROSPECTION_REQUEST, request, response), response);
8585
} else {
8686
String query = request.getParameter("query");
8787
if (query != null) {
8888

8989
if (isBatchedQuery(query)) {
90-
queryBatched(queryInvoker, graphQLObjectMapper, invocationInputFactory.createReadOnly(graphQLObjectMapper.readBatchedGraphQLRequest(query), request), response);
90+
queryBatched(queryInvoker, graphQLObjectMapper, invocationInputFactory.createReadOnly(graphQLObjectMapper.readBatchedGraphQLRequest(query), request, response), response);
9191
} else {
9292
final Map<String, Object> variables = new HashMap<>();
9393
if (request.getParameter("variables") != null) {
@@ -96,7 +96,7 @@ public AbstractGraphQLHttpServlet(List<GraphQLServletListener> listeners, boolea
9696

9797
String operationName = request.getParameter("operationName");
9898

99-
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.createReadOnly(new GraphQLRequest(query, variables, operationName), request), response);
99+
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.createReadOnly(new GraphQLRequest(query, variables, operationName), request, response), response);
100100
}
101101
} else {
102102
response.setStatus(STATUS_BAD_REQUEST);
@@ -141,7 +141,7 @@ public AbstractGraphQLHttpServlet(List<GraphQLServletListener> listeners, boolea
141141
graphQLObjectMapper.readBatchedGraphQLRequest(inputStream);
142142
variablesMap.ifPresent(map -> graphQLRequests.forEach(r -> mapMultipartVariables(r, map, fileItems)));
143143
GraphQLBatchedInvocationInput invocationInput =
144-
invocationInputFactory.create(graphQLRequests, request);
144+
invocationInputFactory.create(graphQLRequests, request, response);
145145
invocationInput.getContext().setFiles(fileItems);
146146
queryBatched(queryInvoker, graphQLObjectMapper, invocationInput, response);
147147
return;
@@ -155,7 +155,7 @@ public AbstractGraphQLHttpServlet(List<GraphQLServletListener> listeners, boolea
155155

156156
variablesMap.ifPresent(m -> mapMultipartVariables(graphQLRequest, m, fileItems));
157157
GraphQLSingleInvocationInput invocationInput =
158-
invocationInputFactory.create(graphQLRequest, request);
158+
invocationInputFactory.create(graphQLRequest, request, response);
159159
invocationInput.getContext().setFiles(fileItems);
160160
query(queryInvoker, graphQLObjectMapper, invocationInput, response);
161161
return;
@@ -169,9 +169,9 @@ public AbstractGraphQLHttpServlet(List<GraphQLServletListener> listeners, boolea
169169
InputStream inputStream = asMarkableInputStream(request.getInputStream());
170170

171171
if (isBatchedQuery(inputStream)) {
172-
queryBatched(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(graphQLObjectMapper.readBatchedGraphQLRequest(inputStream), request), response);
172+
queryBatched(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(graphQLObjectMapper.readBatchedGraphQLRequest(inputStream), request, response), response);
173173
} else {
174-
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(graphQLObjectMapper.readGraphQLRequest(inputStream), request), response);
174+
query(queryInvoker, graphQLObjectMapper, invocationInputFactory.create(graphQLObjectMapper.readGraphQLRequest(inputStream), request, response), response);
175175
}
176176
}
177177
} catch (Exception e) {

src/main/java/graphql/servlet/DefaultGraphQLContextBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package graphql.servlet;
22

33
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
45
import javax.websocket.server.HandshakeRequest;
56

67
public class DefaultGraphQLContextBuilder implements GraphQLContextBuilder {
78

89
@Override
9-
public GraphQLContext build(HttpServletRequest httpServletRequest) {
10-
return new GraphQLContext(httpServletRequest);
10+
public GraphQLContext build(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
11+
return new GraphQLContext(httpServletRequest, httpServletResponse);
1112
}
1213

1314
@Override

src/main/java/graphql/servlet/GraphQLContext.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import javax.security.auth.Subject;
66
import javax.servlet.http.HttpServletRequest;
7+
import javax.servlet.http.HttpServletResponse;
78
import javax.servlet.http.Part;
89
import javax.websocket.server.HandshakeRequest;
910
import java.util.List;
@@ -12,35 +13,43 @@
1213

1314
public class GraphQLContext {
1415
private HttpServletRequest httpServletRequest;
16+
private HttpServletResponse httpServletResponse;
1517
private HandshakeRequest handshakeRequest;
1618

1719
private Subject subject;
1820
private Map<String, List<Part>> files;
1921

2022
private DataLoaderRegistry dataLoaderRegistry;
2123

22-
public GraphQLContext(HttpServletRequest httpServletRequest, HandshakeRequest handshakeRequest, Subject subject) {
24+
public GraphQLContext(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, HandshakeRequest handshakeRequest, Subject subject) {
2325
this.httpServletRequest = httpServletRequest;
26+
this.httpServletResponse = httpServletResponse;
2427
this.handshakeRequest = handshakeRequest;
2528
this.subject = subject;
2629
}
2730

2831
public GraphQLContext(HttpServletRequest httpServletRequest) {
29-
this(httpServletRequest, null, null);
32+
this(httpServletRequest, null);
33+
}
34+
35+
public GraphQLContext(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
36+
this(httpServletRequest, httpServletResponse, null, null);
3037
}
3138

3239
public GraphQLContext(HandshakeRequest handshakeRequest) {
33-
this(null, handshakeRequest, null);
40+
this(null, null, handshakeRequest, null);
3441
}
3542

3643
public GraphQLContext() {
37-
this(null, null, null);
44+
this(null, null, null, null);
3845
}
3946

4047
public Optional<HttpServletRequest> getHttpServletRequest() {
4148
return Optional.ofNullable(httpServletRequest);
4249
}
4350

51+
public Optional<HttpServletResponse> getHttpServletResponse() { return Optional.ofNullable(httpServletResponse); }
52+
4453
public Optional<Subject> getSubject() {
4554
return Optional.ofNullable(subject);
4655
}

src/main/java/graphql/servlet/GraphQLContextBuilder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
import javax.servlet.http.HttpServletRequest;
44
import javax.servlet.http.HttpServletResponse;
55
import javax.websocket.server.HandshakeRequest;
6-
import java.util.Optional;
76

87
public interface GraphQLContextBuilder {
9-
GraphQLContext build(HttpServletRequest httpServletRequest);
8+
GraphQLContext build(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse);
109
GraphQLContext build(HandshakeRequest handshakeRequest);
1110

1211
/**

src/main/java/graphql/servlet/GraphQLInvocationInputFactory.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import graphql.servlet.internal.GraphQLRequest;
55

66
import javax.servlet.http.HttpServletRequest;
7+
import javax.servlet.http.HttpServletResponse;
78
import javax.websocket.server.HandshakeRequest;
89
import java.util.List;
910
import java.util.function.Supplier;
@@ -26,20 +27,20 @@ public GraphQLSchemaProvider getSchemaProvider() {
2627
return schemaProviderSupplier.get();
2728
}
2829

29-
public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, HttpServletRequest request) {
30-
return create(graphQLRequest, request, false);
30+
public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, HttpServletRequest request, HttpServletResponse response) {
31+
return create(graphQLRequest, request, response, false);
3132
}
3233

33-
public GraphQLBatchedInvocationInput create(List<GraphQLRequest> graphQLRequests, HttpServletRequest request) {
34-
return create(graphQLRequests, request, false);
34+
public GraphQLBatchedInvocationInput create(List<GraphQLRequest> graphQLRequests, HttpServletRequest request, HttpServletResponse response) {
35+
return create(graphQLRequests, request, response, false);
3536
}
3637

37-
public GraphQLSingleInvocationInput createReadOnly(GraphQLRequest graphQLRequest, HttpServletRequest request) {
38-
return create(graphQLRequest, request, true);
38+
public GraphQLSingleInvocationInput createReadOnly(GraphQLRequest graphQLRequest, HttpServletRequest request, HttpServletResponse response) {
39+
return create(graphQLRequest, request, response, true);
3940
}
4041

41-
public GraphQLBatchedInvocationInput createReadOnly(List<GraphQLRequest> graphQLRequests, HttpServletRequest request) {
42-
return create(graphQLRequests, request, true);
42+
public GraphQLBatchedInvocationInput createReadOnly(List<GraphQLRequest> graphQLRequests, HttpServletRequest request, HttpServletResponse response) {
43+
return create(graphQLRequests, request, response, true);
4344
}
4445

4546
public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest) {
@@ -51,20 +52,20 @@ public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest) {
5152
);
5253
}
5354

54-
private GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, HttpServletRequest request, boolean readOnly) {
55+
private GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, HttpServletRequest request, HttpServletResponse response, boolean readOnly) {
5556
return new GraphQLSingleInvocationInput(
5657
graphQLRequest,
5758
readOnly ? schemaProviderSupplier.get().getReadOnlySchema(request) : schemaProviderSupplier.get().getSchema(request),
58-
contextBuilderSupplier.get().build(request),
59+
contextBuilderSupplier.get().build(request, response),
5960
rootObjectBuilderSupplier.get().build(request)
6061
);
6162
}
6263

63-
private GraphQLBatchedInvocationInput create(List<GraphQLRequest> graphQLRequests, HttpServletRequest request, boolean readOnly) {
64+
private GraphQLBatchedInvocationInput create(List<GraphQLRequest> graphQLRequests, HttpServletRequest request, HttpServletResponse response, boolean readOnly) {
6465
return new GraphQLBatchedInvocationInput(
6566
graphQLRequests,
6667
readOnly ? schemaProviderSupplier.get().getReadOnlySchema(request) : schemaProviderSupplier.get().getSchema(request),
67-
contextBuilderSupplier.get().build(request),
68+
contextBuilderSupplier.get().build(request, response),
6869
rootObjectBuilderSupplier.get().build(request)
6970
);
7071
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
10211021

10221022
setup:
10231023
Instrumentation expectedInstrumentation = Mock()
1024-
GraphQLContext context = new GraphQLContext(request, null, null)
1024+
GraphQLContext context = new GraphQLContext(request, response, null, null)
10251025
SimpleGraphQLHttpServlet simpleGraphQLServlet = SimpleGraphQLHttpServlet
10261026
.newBuilder(TestUtils.createGraphQlSchema())
10271027
.withQueryInvoker(GraphQLQueryInvoker.newBuilder().withInstrumentation(expectedInstrumentation).build())
@@ -1037,7 +1037,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
10371037
def "getInstrumentation returns the ChainedInstrumentation if DataLoader provided in context"() {
10381038
setup:
10391039
Instrumentation servletInstrumentation = Mock()
1040-
GraphQLContext context = new GraphQLContext(request, null, null)
1040+
GraphQLContext context = new GraphQLContext(request, response, null, null)
10411041
DataLoaderRegistry dlr = Mock()
10421042
context.setDataLoaderRegistry(dlr)
10431043
SimpleGraphQLHttpServlet simpleGraphQLServlet = SimpleGraphQLHttpServlet

0 commit comments

Comments
 (0)