You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ke...@apache.org on 2026/06/10 03:41:30 UTC
(tinkerpop) 02/05: Add an Allow: POST response header for non-POST requests CTR
This is an automated email from the ASF dual-hosted git repository.
kenhuuu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit e6551edafc94d60f8f01361b8fadb861ebf5ec76
Author: Ken Hu <10...@users.noreply.github.com>
AuthorDate: Mon Jun 8 21:31:05 2026 -0700
Add an Allow: POST response header for non-POST requests CTR
Assisted-by: Claude Code:claude-opus-4-6
---
.../apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java | 7 ++++++-
.../gremlin/server/handler/HttpRequestMessageDecoder.java | 2 +-
.../tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java | 1 +
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java
index 4fa5ba84ec..1e5f9a0a7c 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java
@@ -72,8 +72,10 @@ public class HttpHandlerUtil {
* @param ctx The netty channel context.
* @param status The HTTP error status code.
* @param message The error message to contain the body.
+ * @param headers Optional alternating header name/value pairs to set on the response.
*/
- public static void sendError(final ChannelHandlerContext ctx, final HttpResponseStatus status, final String message) {
+ public static void sendError(final ChannelHandlerContext ctx, final HttpResponseStatus status, final String message,
+ final CharSequence... headers) {
logger.warn(String.format("Invalid request - responding with %s and %s", status, message));
errorMeter.mark();
@@ -83,6 +85,9 @@ public class HttpHandlerUtil {
final FullHttpResponse response = new DefaultFullHttpResponse(
HTTP_1_1, status, Unpooled.copiedBuffer(node.toString(), CharsetUtil.UTF_8));
response.headers().set(CONTENT_TYPE, "application/json");
+ for (int i = 0; i < headers.length; i += 2) {
+ response.headers().set(headers[i], headers[i + 1]);
+ }
HttpUtil.setContentLength(response, response.content().readableBytes());
ctx.writeAndFlush(response);
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java
index dc5dfabad8..99007d7115 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java
@@ -82,7 +82,7 @@ public class HttpRequestMessageDecoder extends MessageToMessageDecoder<FullHttpR
final Pair<String, MessageSerializer<?>> serializer = chooseSerializer(acceptMime);
if (req.method() != POST) {
- sendError(ctx, METHOD_NOT_ALLOWED, METHOD_NOT_ALLOWED.toString());
+ sendError(ctx, METHOD_NOT_ALLOWED, METHOD_NOT_ALLOWED.toString(), HttpHeaderNames.ALLOW, POST.name());
return;
}
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
index de5dea5a66..ee881d9b8c 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
@@ -209,6 +209,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
assertEquals(405, response.getStatusLine().getStatusCode());
assertTrue(response.containsHeader(REQUEST_ID_HEADER_NAME));
+ assertEquals("POST", response.getFirstHeader("Allow").getValue());
}
}