11package graphql .kickstart .servlet ;
22
3- import static graphql .kickstart .servlet .HttpRequestHandler .STATUS_BAD_REQUEST ;
4-
3+ import graphql .ExecutionResult ;
54import graphql .ExecutionResultImpl ;
5+ import graphql .GraphQLException ;
66import graphql .kickstart .execution .GraphQLInvoker ;
77import graphql .kickstart .execution .GraphQLQueryResult ;
88import graphql .kickstart .execution .error .GenericGraphQLError ;
1515import java .io .UncheckedIOException ;
1616import java .util .Optional ;
1717import java .util .concurrent .CompletableFuture ;
18+ import java .util .concurrent .CompletionException ;
1819import java .util .concurrent .atomic .AtomicReference ;
1920import javax .servlet .AsyncContext ;
2021import javax .servlet .http .HttpServletRequest ;
@@ -82,7 +83,8 @@ private CompletableFuture<Void> invokeAndHandle(
8283 return invoke (invocationInput , request , response )
8384 .thenAccept (it -> writeResultResponse (invocationInput , it , request , response ))
8485 .thenAccept (it -> listenerHandler .onSuccess ())
85- .exceptionally (t -> writeBadRequestError (t , response , listenerHandler ))
86+ .exceptionally (
87+ t -> writeErrorResponse (invocationInput , request , response , listenerHandler , t ))
8688 .thenAccept (it -> listenerHandler .onFinally ());
8789 }
8890
@@ -99,18 +101,18 @@ private void writeResultResponse(
99101 }
100102 }
101103
102- protected QueryResponseWriter createWriter (
103- GraphQLInvocationInput invocationInput , GraphQLQueryResult queryResult ) {
104- return queryResponseWriterFactory .createWriter (invocationInput , queryResult , configuration );
105- }
106-
107- private Void writeBadRequestError (
108- Throwable t , HttpServletResponse response , ListenerHandler listenerHandler ) {
104+ private Void writeErrorResponse (
105+ GraphQLInvocationInput invocationInput ,
106+ HttpServletRequest request ,
107+ HttpServletResponse response ,
108+ ListenerHandler listenerHandler ,
109+ Throwable t ) {
109110 if (!response .isCommitted ()) {
110- response .setStatus (STATUS_BAD_REQUEST );
111- log .info (
112- "Bad request: path was not \" /schema.json\" or no query variable named \" query\" given" ,
113- t );
111+ writeResultResponse (
112+ invocationInput ,
113+ GraphQLQueryResult .create (toErrorResult (t )),
114+ request ,
115+ response );
114116 listenerHandler .onError (t );
115117 } else {
116118 log .warn (
@@ -119,6 +121,19 @@ private Void writeBadRequestError(
119121 return null ;
120122 }
121123
124+ private ExecutionResult toErrorResult (Throwable t ) {
125+ String message =
126+ t instanceof CompletionException && t .getCause () != null
127+ ? t .getCause ().getMessage ()
128+ : t .getMessage ();
129+ return new ExecutionResultImpl (new GenericGraphQLError (message ));
130+ }
131+
132+ protected QueryResponseWriter createWriter (
133+ GraphQLInvocationInput invocationInput , GraphQLQueryResult queryResult ) {
134+ return queryResponseWriterFactory .createWriter (invocationInput , queryResult , configuration );
135+ }
136+
122137 private CompletableFuture <GraphQLQueryResult > invoke (
123138 GraphQLInvocationInput invocationInput ,
124139 HttpServletRequest request ,
0 commit comments