diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java index 1b58c8ba..64768fa1 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java @@ -45,7 +45,7 @@ public void execute( if (request.isAsyncSupported()) { invokeAndHandleAsync(invocationInput, request, response, listenerHandler); } else { - handle(invoke(invocationInput, request, response), request, response, listenerHandler).join(); + handle(invocationInput, request, response, listenerHandler); } } @@ -83,7 +83,7 @@ private void invokeAndHandleAsync( try { FutureExecutionResult futureResult = invoke(invocationInput, request, response); futureHolder.set(futureResult); - handle(futureResult, request, response, listenerHandler) + handleInternal(futureResult, request, response, listenerHandler) .thenAccept(it -> asyncContext.complete()); } catch (GraphQLException e) { response.setStatus(STATUS_BAD_REQUEST); @@ -99,7 +99,26 @@ private void invokeAndHandleAsync( }); } - private CompletableFuture handle( + private void handle( + GraphQLInvocationInput invocationInput, + HttpServletRequest request, + HttpServletResponse response, + ListenerHandler listenerHandler) { + try { + FutureExecutionResult futureResult = invoke(invocationInput, request, response); + handleInternal(futureResult, request, response, listenerHandler); + } catch (GraphQLException e) { + response.setStatus(STATUS_BAD_REQUEST); + log.info("Bad request: cannot handle http request", e); + listenerHandler.onError(e); + } catch (Exception e) { + response.setStatus(STATUS_INTERNAL_SERVER_ERROR); + log.error("Cannot handle http request", e); + listenerHandler.onError(e); + } + } + + private CompletableFuture handleInternal( FutureExecutionResult futureResult, HttpServletRequest request, HttpServletResponse response,