From de9bbda5e44d5f4a8a7c024894027d1dccd6e2c5 Mon Sep 17 00:00:00 2001 From: Vivek Krishnan Date: Tue, 27 Sep 2016 23:21:42 -0700 Subject: [PATCH 1/4] TINKERPOP-1044: When using Gremlin-Server Client over REST endpoint and the gremlin query results in a groovy script Exception/Error, will output the Throwable class name as well as the Throwable Message in the message body of the HTTP Response --- .../handler/HttpGremlinEndpointHandler.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java index 7d2222f40b4..a30c30edc0d 100644 --- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java +++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java @@ -253,8 +253,19 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { })); evalFuture.exceptionally(t -> { - sendError(ctx, INTERNAL_SERVER_ERROR, - String.format("Error encountered evaluating script: %s", requestArguments.getValue0()), Optional.of(t)); + + if (t.getMessage() != null) { + sendError(ctx, INTERNAL_SERVER_ERROR, + String.format("Error encountered evaluating script: %s\nExecution Interrupted by %s\nMessage: %s", + requestArguments.getValue0(), t.getClass().getName(), t.getMessage()), + Optional.of(t)); + } else { + sendError(ctx, INTERNAL_SERVER_ERROR, + String.format("Error encountered evaluating script: %s\nExecution Interrupted by %s", + requestArguments.getValue0(), t.getClass().getName()), + Optional.of(t)); + } + promise.setFailure(t); return null; }); From 3202db1b14f80d09f95bbb692844e9f91f66b925 Mon Sep 17 00:00:00 2001 From: Vivek Krishnan Date: Wed, 28 Sep 2016 11:06:14 -0700 Subject: [PATCH 2/4] TINKERPOP-1044: Standardized Message Format and Added Extra HTTP Header for the exception class instead of making a message with multiple lines --- .../handler/HttpGremlinEndpointHandler.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java index a30c30edc0d..96861bbcaf7 100644 --- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java +++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java @@ -254,18 +254,9 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { evalFuture.exceptionally(t -> { - if (t.getMessage() != null) { - sendError(ctx, INTERNAL_SERVER_ERROR, - String.format("Error encountered evaluating script: %s\nExecution Interrupted by %s\nMessage: %s", - requestArguments.getValue0(), t.getClass().getName(), t.getMessage()), - Optional.of(t)); - } else { - sendError(ctx, INTERNAL_SERVER_ERROR, - String.format("Error encountered evaluating script: %s\nExecution Interrupted by %s", - requestArguments.getValue0(), t.getClass().getName()), - Optional.of(t)); - } - + String errorMessage = (t.getMessage() != null) ? t.getMessage() : + String.format("Error encountered evaluating script: %s", requestArguments.getValue0()); + sendError(ctx, INTERNAL_SERVER_ERROR, errorMessage, Optional.of(t)); promise.setFailure(t); return null; }); @@ -465,6 +456,11 @@ private static void sendError(final ChannelHandlerContext ctx, final HttpRespons errorMeter.mark(); final ObjectNode node = mapper.createObjectNode(); node.put("message", message); + if (t.isPresent()){ + node.put("Exception-Class", t.get().getClass().getName()); + } + + final FullHttpResponse response = new DefaultFullHttpResponse( HTTP_1_1, status, Unpooled.copiedBuffer(node.toString(), CharsetUtil.UTF_8)); response.headers().set(CONTENT_TYPE, "application/json"); From f364a37f94e568bca368282ad0a3fd2784864139 Mon Sep 17 00:00:00 2001 From: Vivek Krishnan Date: Wed, 28 Sep 2016 15:35:34 -0700 Subject: [PATCH 3/4] Expanded ternary operator on Line 260 into if then else --- .../server/handler/HttpGremlinEndpointHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java index 96861bbcaf7..899d488cc60 100644 --- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java +++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java @@ -252,11 +252,12 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { } })); - evalFuture.exceptionally(t -> { - - String errorMessage = (t.getMessage() != null) ? t.getMessage() : - String.format("Error encountered evaluating script: %s", requestArguments.getValue0()); - sendError(ctx, INTERNAL_SERVER_ERROR, errorMessage, Optional.of(t)); + evalFuture.exceptionally(t -> { + if (t.getMessage() != null) + sendError(ctx, INTERNAL_SERVER_ERROR, t.getMessage(), Optional.of(t)); + else + sendError(ctx, INTERNAL_SERVER_ERROR, String.format("Error encountered evaluating script: %s", requestArguments.getValue0()) + , Optional.of(t)); promise.setFailure(t); return null; }); @@ -460,7 +461,6 @@ private static void sendError(final ChannelHandlerContext ctx, final HttpRespons node.put("Exception-Class", t.get().getClass().getName()); } - final FullHttpResponse response = new DefaultFullHttpResponse( HTTP_1_1, status, Unpooled.copiedBuffer(node.toString(), CharsetUtil.UTF_8)); response.headers().set(CONTENT_TYPE, "application/json"); From c1920d06f9a73c9312400bf8fda08bc953b6339a Mon Sep 17 00:00:00 2001 From: Vivek Krishnan Date: Mon, 3 Oct 2016 17:57:35 -0700 Subject: [PATCH 4/4] Update CHANGELOG.asciidoc --- CHANGELOG.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index ff730f79fb5..12a4ae0937f 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -57,6 +57,7 @@ TinkerPop 3.2.3 (Release Date: NOT OFFICIALLY RELEASED YET) * VertexPrograms can now declare traverser requirements, e.g. to have access to the path when used with `.program()`. * New build options for `gremlin-python` where `-DglvPython` is no longer required. * Added missing `InetAddress` to GraphSON extension module. +* Added functionality to Gremlin-Server REST endpoint to forward Exception Messages and Class in HTTP Response [[release-3-2-2]] TinkerPop 3.2.2 (Release Date: September 6, 2016)