Skip to content

Commit 44cef3f

Browse files
committed
Add content length when writing response
1 parent 5b1047f commit 44cef3f

File tree

3 files changed

+20
-17
lines changed

3 files changed

+20
-17
lines changed

src/main/java/graphql/servlet/BatchedQueryResponseWriter.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import graphql.ExecutionResult;
77
import graphql.servlet.core.GraphQLObjectMapper;
88
import java.io.IOException;
9-
import java.io.Writer;
109
import java.util.Iterator;
1110
import java.util.List;
1211
import javax.servlet.http.HttpServletRequest;
@@ -24,17 +23,20 @@ public void write(HttpServletRequest request, HttpServletResponse response) thro
2423
response.setContentType(APPLICATION_JSON_UTF8);
2524
response.setStatus(STATUS_OK);
2625

27-
Writer writer = response.getWriter();
2826
Iterator<ExecutionResult> executionInputIterator = results.iterator();
29-
writer.write("[");
27+
StringBuilder responseBuilder = new StringBuilder();
28+
responseBuilder.append('[');
3029
while (executionInputIterator.hasNext()) {
31-
String result = graphQLObjectMapper.serializeResultAsJson(executionInputIterator.next());
32-
writer.write(result);
30+
responseBuilder.append(graphQLObjectMapper.serializeResultAsJson(executionInputIterator.next()));
3331
if (executionInputIterator.hasNext()) {
34-
writer.write(",");
32+
responseBuilder.append(',');
3533
}
3634
}
37-
writer.write("]");
35+
responseBuilder.append(']');
36+
37+
String responseContent = responseBuilder.toString();
38+
response.setContentLength(responseContent.length());
39+
response.getWriter().write(responseContent);
3840
}
3941

4042
}

src/main/java/graphql/servlet/SingleQueryResponseWriter.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ class SingleQueryResponseWriter implements QueryResponseWriter {
1919
public void write(HttpServletRequest request, HttpServletResponse response) throws IOException {
2020
response.setContentType(APPLICATION_JSON_UTF8);
2121
response.setStatus(STATUS_OK);
22-
graphQLObjectMapper.serializeResultAsJson(response.getWriter(), result);
22+
String responseContent = graphQLObjectMapper.serializeResultAsJson(result);
23+
response.setContentLength(responseContent.length());
24+
response.getWriter().write(responseContent);
2325
}
2426

2527
}

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

+8-9
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,9 @@ import graphql.schema.GraphQLNonNull
1010
import graphql.servlet.input.GraphQLInvocationInputFactory
1111
import org.springframework.mock.web.MockHttpServletRequest
1212
import org.springframework.mock.web.MockHttpServletResponse
13-
import spock.lang.Ignore
1413
import spock.lang.Shared
1514
import spock.lang.Specification
1615

17-
import javax.servlet.ServletInputStream
18-
import javax.servlet.http.HttpServletRequest
1916
import java.util.concurrent.CountDownLatch
2017
import java.util.concurrent.TimeUnit
2118
import java.util.concurrent.atomic.AtomicReference
@@ -111,12 +108,13 @@ class AbstractGraphQLHttpServletSpec extends Specification {
111108
then:
112109
response.getStatus() == STATUS_OK
113110
response.getContentType() == CONTENT_TYPE_JSON_UTF8
111+
response.getContentLength() == mapper.writeValueAsString(["data": ["echo": "test"]]).length()
114112
getResponseContent().data.echo == "test"
115113
}
116114

117115
def "async query over HTTP GET starts async request"() {
118116
setup:
119-
servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg },{ env -> env.arguments.arg }, { env ->
117+
servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env ->
120118
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>();
121119
publisherRef.set(new SingleSubscriberPublisher<>({ subscription ->
122120
publisherRef.get().offer(env.arguments.arg)
@@ -373,7 +371,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
373371
setup:
374372
request.addParameter('query', 'subscription Subscription($arg: String!) { echo(arg: $arg) }')
375373
request.addParameter('operationName', 'Subscription')
376-
request.addParameter( 'variables', '{"arg": "test"}')
374+
request.addParameter('variables', '{"arg": "test"}')
377375
request.setAsyncSupported(true)
378376

379377
when:
@@ -416,17 +414,17 @@ class AbstractGraphQLHttpServletSpec extends Specification {
416414

417415
def "async query over HTTP POST starts async request"() {
418416
setup:
419-
servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg },{ env -> env.arguments.arg }, { env ->
417+
servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env ->
420418
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>();
421419
publisherRef.set(new SingleSubscriberPublisher<>({ subscription ->
422420
publisherRef.get().offer(env.arguments.arg)
423421
publisherRef.get().noMoreData()
424422
}))
425423
return publisherRef.get()
426424
}, true)
427-
request.setContent(mapper.writeValueAsBytes([
428-
query: 'query { echo(arg:"test") }'
429-
]))
425+
request.setContent(mapper.writeValueAsBytes([
426+
query: 'query { echo(arg:"test") }'
427+
]))
430428

431429
when:
432430
servlet.doPost(request, response)
@@ -738,6 +736,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
738736
then:
739737
response.getStatus() == STATUS_OK
740738
response.getContentType() == CONTENT_TYPE_JSON_UTF8
739+
response.getContentLength() == mapper.writeValueAsString([["data": ["echo": "test"]], ["data": ["echo": "test"]]]).length()
741740
getBatchedResponseContent()[0].data.echo == "test"
742741
getBatchedResponseContent()[1].data.echo == "test"
743742
}

0 commit comments

Comments
 (0)