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) 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..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,9 +252,12 @@ 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)); + 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; }); @@ -454,6 +457,10 @@ 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");