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 {