1
1
package graphql .kickstart .servlet ;
2
2
3
- import static graphql .kickstart .servlet .HttpRequestHandler .STATUS_BAD_REQUEST ;
4
-
3
+ import graphql .ExecutionResult ;
5
4
import graphql .ExecutionResultImpl ;
5
+ import graphql .GraphQLException ;
6
6
import graphql .kickstart .execution .GraphQLInvoker ;
7
7
import graphql .kickstart .execution .GraphQLQueryResult ;
8
8
import graphql .kickstart .execution .error .GenericGraphQLError ;
15
15
import java .io .UncheckedIOException ;
16
16
import java .util .Optional ;
17
17
import java .util .concurrent .CompletableFuture ;
18
+ import java .util .concurrent .CompletionException ;
18
19
import java .util .concurrent .atomic .AtomicReference ;
19
20
import javax .servlet .AsyncContext ;
20
21
import javax .servlet .http .HttpServletRequest ;
@@ -82,7 +83,8 @@ private CompletableFuture<Void> invokeAndHandle(
82
83
return invoke (invocationInput , request , response )
83
84
.thenAccept (it -> writeResultResponse (invocationInput , it , request , response ))
84
85
.thenAccept (it -> listenerHandler .onSuccess ())
85
- .exceptionally (t -> writeBadRequestError (t , response , listenerHandler ))
86
+ .exceptionally (
87
+ t -> writeErrorResponse (invocationInput , request , response , listenerHandler , t ))
86
88
.thenAccept (it -> listenerHandler .onFinally ());
87
89
}
88
90
@@ -99,18 +101,18 @@ private void writeResultResponse(
99
101
}
100
102
}
101
103
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 ) {
109
110
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 );
114
116
listenerHandler .onError (t );
115
117
} else {
116
118
log .warn (
@@ -119,6 +121,19 @@ private Void writeBadRequestError(
119
121
return null ;
120
122
}
121
123
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
+
122
137
private CompletableFuture <GraphQLQueryResult > invoke (
123
138
GraphQLInvocationInput invocationInput ,
124
139
HttpServletRequest request ,
0 commit comments