This is an automated email from the ASF dual-hosted git repository.

colegreer pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/master by this push:
     new 6d11275ebe Change server response to 400 for malformed queries (#2983)
6d11275ebe is described below

commit 6d11275ebe762f871e42b10f53f733a53aa67c29
Author: Cole Greer <[email protected]>
AuthorDate: Thu Jan 16 17:39:54 2025 -0800

    Change server response to 400 for malformed queries (#2983)
    
    Alters the servers response to bad queries from 500 Internal Server Error 
to 400 Bad Request. Note that malformed groovy scripts may still produce 500 
Internal Server Error as groovy is unable to statically verify correct gremlin 
syntax.
---
 .../server/handler/HttpGremlinEndpointHandler.java        |  4 ++++
 .../tinkerpop/gremlin/server/util/GremlinError.java       |  5 +++++
 .../gremlin/server/GremlinServerIntegrateTest.java        | 15 +++++++++++++++
 3 files changed, 24 insertions(+)

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 de314d12ed..81388de4ed 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
@@ -35,6 +35,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor;
 import 
org.apache.tinkerpop.gremlin.groovy.jsr223.TimedInterruptTimeoutException;
 import org.apache.tinkerpop.gremlin.jsr223.GremlinScriptEngine;
+import org.apache.tinkerpop.gremlin.language.grammar.GremlinParserException;
 import org.apache.tinkerpop.gremlin.process.traversal.Failure;
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.Order;
@@ -295,6 +296,9 @@ public class HttpGremlinEndpointHandler extends 
SimpleChannelInboundHandler<Requ
             logger.warn(error.getMessage());
             return error;
         }
+        if (t instanceof GremlinParserException) {
+            return GremlinError.parsing((GremlinParserException) t);
+        }
 
         logger.warn(String.format("Exception processing request [%s].", 
requestMessage));
         return GremlinError.general(t);
diff --git 
a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java
 
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java
index 3a8051dc64..1616c25e16 100644
--- 
a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java
+++ 
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.server.util;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
+import org.apache.tinkerpop.gremlin.language.grammar.GremlinParserException;
 import org.apache.tinkerpop.gremlin.process.traversal.Failure;
 import org.apache.tinkerpop.gremlin.util.ExceptionHelper;
 import org.apache.tinkerpop.gremlin.util.Tokens;
@@ -86,6 +87,10 @@ public class GremlinError {
         return new GremlinError(HttpResponseStatus.BAD_REQUEST, message, 
"InvalidRequestException");
     }
 
+    public static GremlinError parsing(final GremlinParserException error) {
+        return new GremlinError(HttpResponseStatus.BAD_REQUEST, 
error.getMessage(), "MalformedQueryException");
+    }
+
     // execution errors
     public static GremlinError timeout(final RequestMessage requestMessage ) {
         final String message = String.format("A timeout occurred during 
traversal evaluation of [%s] - consider increasing the limit given to 
evaluationTimeout",
diff --git 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
index ab366e5a8d..7c9a342340 100644
--- 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
+++ 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
@@ -869,6 +869,21 @@ public class GremlinServerIntegrateTest extends 
AbstractGremlinServerIntegration
         }
     }
 
+    @Test
+    public void shouldFailWithMalformedQuery() throws Exception {
+        try (SimpleClient client = TestClientFactory.createSimpleHttpClient()) 
{
+            final RequestMessage request = RequestMessage
+                    .build("g.inject(1, 2, g.V())")
+                    .create();
+            final List<ResponseMessage> responses = client.submit(request);
+            assertEquals(HttpResponseStatus.BAD_REQUEST, 
responses.get(0).getStatus().getCode());
+            assertEquals("MalformedQueryException", 
responses.get(0).getStatus().getException());
+            for (ResponseMessage resp : responses.subList(1, 
responses.size())) {
+                assertEquals(0, resp.getResult().getData().size());
+            }
+        }
+    }
+
     @Test
     @Ignore("Lambda is not supported")
     public void shouldSupportLambdasUsingWithRemote() throws Exception {

Reply via email to