Minor improvement to http requests that were too large Added a test to validate a 413 is returned if the request payload exceeds the maxContentLength CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/5335f4af Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/5335f4af Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/5335f4af Branch: refs/heads/TINKERPOP-1489 Commit: 5335f4af975ecabe9f5138f9bc5d292966b34feb Parents: 6e86bf5 Author: Stephen Mallette <[email protected]> Authored: Mon Jul 17 06:53:03 2017 -0400 Committer: Stephen Mallette <[email protected]> Committed: Mon Jul 17 06:53:03 2017 -0400 ---------------------------------------------------------------------- .../server/handler/HttpGremlinEndpointHandler.java | 9 ++++++++- .../server/GremlinServerHttpIntegrateTest.java | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5335f4af/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java ---------------------------------------------------------------------- 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 2bbb9f7..75c97a0 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 @@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.server.handler; import com.codahale.metrics.Meter; import com.codahale.metrics.Timer; +import io.netty.handler.codec.TooLongFrameException; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.tinkerpop.gremlin.driver.MessageSerializer; import org.apache.tinkerpop.gremlin.driver.Tokens; @@ -34,6 +35,7 @@ import org.apache.tinkerpop.gremlin.server.Settings; import org.apache.tinkerpop.gremlin.server.util.MetricManager; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.util.function.FunctionUtils; +import org.apache.tinkerpop.gremlin.util.function.ThrowingBiConsumer; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -279,7 +281,12 @@ public class HttpGremlinEndpointHandler extends ChannelInboundHandlerAdapter { @Override public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) { logger.error("Error processing HTTP Request", cause); - sendError(ctx, INTERNAL_SERVER_ERROR, cause.getCause().getMessage()); + final Throwable t = null == cause.getCause() ? cause : cause.getCause(); + if (t instanceof TooLongFrameException) { + sendError(ctx, HttpResponseStatus.REQUEST_ENTITY_TOO_LARGE, t.getMessage() + " - increase the maxContentLength"); + } else { + sendError(ctx, INTERNAL_SERVER_ERROR, t.getMessage()); + } ctx.close(); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5335f4af/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java ---------------------------------------------------------------------- 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 90017a9..baf4c02 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 @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.gremlin.server; +import org.apache.commons.lang3.RandomStringUtils; import org.apache.tinkerpop.gremlin.driver.Tokens; import org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0; import org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator; @@ -66,6 +67,9 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra settings.channelizer = HttpChannelizer.class.getName(); final String nameOfTest = name.getMethodName(); switch (nameOfTest) { + case "should413OnPostWithResultTooLarge": + settings.maxContentLength = 31; + break; case "should200OnGETWithGremlinQueryStringArgumentWithIteratorResult": case "should200OnPOSTWithGremlinJsonEndcodedBodyWithIteratorResult": case "should200OnPOSTWithGremlinJsonEndcodedBodyWithIteratorResultAndAliases": @@ -146,6 +150,19 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra } @Test + public void should413OnPostWithResultTooLarge() throws Exception { + final CloseableHttpClient httpclient = HttpClients.createDefault(); + final HttpPost httppost = new HttpPost(TestClientFactory.createURLString()); + httppost.addHeader("Content-Type", "application/json"); + final String bigPost = RandomStringUtils.random(32); + httppost.setEntity(new StringEntity("{\"gremlin\":\""+ bigPost + "\", \"bindings\":{\"x\":\"10\"}}", Consts.UTF_8)); + + try (final CloseableHttpResponse response = httpclient.execute(httppost)) { + assertEquals(413, response.getStatusLine().getStatusCode()); + } + } + + @Test public void should401OnGETWithNoAuthorizationHeader() throws Exception { final CloseableHttpClient httpclient = HttpClients.createDefault(); final HttpGet httpget = new HttpGet(TestClientFactory.createURLString("?gremlin=1-1"));
