From 1d876ef4caa9cff6f43e492c6e3456ee9d16e814 Mon Sep 17 00:00:00 2001 From: oliemansm Date: Sun, 23 Jan 2022 19:01:22 +0100 Subject: [PATCH] fix: handle exception in async mode fixes #403 --- .../servlet/HttpRequestInvokerImpl.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) 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 829bf091..1b58c8ba 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 @@ -1,7 +1,11 @@ package graphql.kickstart.servlet; +import static graphql.kickstart.servlet.HttpRequestHandler.STATUS_BAD_REQUEST; +import static graphql.kickstart.servlet.HttpRequestHandler.STATUS_INTERNAL_SERVER_ERROR; + import graphql.ExecutionResult; import graphql.ExecutionResultImpl; +import graphql.GraphQLException; import graphql.kickstart.execution.FutureExecutionResult; import graphql.kickstart.execution.GraphQLInvoker; import graphql.kickstart.execution.GraphQLQueryResult; @@ -76,10 +80,22 @@ private void invokeAndHandleAsync( .getAsyncExecutor() .execute( () -> { - FutureExecutionResult futureResult = invoke(invocationInput, request, response); - futureHolder.set(futureResult); - handle(futureResult, request, response, listenerHandler) - .thenAccept(it -> asyncContext.complete()); + try { + FutureExecutionResult futureResult = invoke(invocationInput, request, response); + futureHolder.set(futureResult); + handle(futureResult, request, response, listenerHandler) + .thenAccept(it -> asyncContext.complete()); + } catch (GraphQLException e) { + response.setStatus(STATUS_BAD_REQUEST); + log.info("Bad request: cannot handle http request", e); + listenerHandler.onError(e); + asyncContext.complete(); + } catch (Exception e) { + response.setStatus(STATUS_INTERNAL_SERVER_ERROR); + log.error("Cannot handle http request", e); + listenerHandler.onError(e); + asyncContext.complete(); + } }); }