You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2021/04/02 18:26:08 UTC

[tinkerpop] 01/01: TINKERPOP-2457 Added max_content_length as Python driver config

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

spmallette pushed a commit to branch TINKERPOP-2457
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 972562fe9b6b58ff6b47f601191eed42c0e453d8
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Fri Apr 2 14:24:40 2021 -0400

    TINKERPOP-2457 Added max_content_length as Python driver config
---
 CHANGELOG.asciidoc                                            |  1 +
 .../src/main/jython/gremlin_python/driver/client.py           |  7 +++++--
 .../jython/gremlin_python/driver/driver_remote_connection.py  |  5 +++--
 .../main/jython/gremlin_python/driver/tornado/transport.py    |  8 ++++++--
 gremlin-python/src/main/jython/tests/driver/test_client.py    | 11 +++++++++++
 5 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 409743c..ab83865 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -33,6 +33,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 * Fixed `toString()` representation of `P` when string values are present in Javascript.
 * Exposed barrier size with getter for `NoOpBarrierStep`.
 * Bumped to Netty 4.1.59.
+* Added `max_content_length` as a Python driver setting.
 * Ensured that `barrier()` additions by strategies were controlled solely by `LazyBarrierStrategy`.
 * Fixed `NullPointerException` in `ResponseMessage` deserialization for GraphSON.
 * Enabled the Gremlin.Net driver to repair its connection pool after the server was temporarily unavailable.
diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/client.py b/gremlin-python/src/main/jython/gremlin_python/driver/client.py
index 2885e32..f1cb451 100644
--- a/gremlin-python/src/main/jython/gremlin_python/driver/client.py
+++ b/gremlin-python/src/main/jython/gremlin_python/driver/client.py
@@ -39,10 +39,12 @@ class Client:
     def __init__(self, url, traversal_source, protocol_factory=None,
                  transport_factory=None, pool_size=None, max_workers=None,
                  message_serializer=None, username="", password="",
-                 headers=None, session=""):
+                 headers=None, session="", max_content_length=None):
         self._url = url
         self._headers = headers
         self._traversal_source = traversal_source
+        if max_content_length is None:
+            max_content_length = 10 * 1024 * 1024
         if message_serializer is None:
             message_serializer = serializer.GraphSONSerializersV3d0()
         self._message_serializer = message_serializer
@@ -58,7 +60,8 @@ class Client:
                 raise Exception("Please install Tornado or pass"
                                 "custom transport factory")
             else:
-                transport_factory = lambda: TornadoTransport()
+                transport_factory = lambda: TornadoTransport(
+                    max_content_length=max_content_length)
         self._transport_factory = transport_factory
         if protocol_factory is None:
             protocol_factory = lambda: protocol.GremlinServerWSProtocol(
diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py
index 067f65b..bc7b57b 100644
--- a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py
+++ b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py
@@ -32,7 +32,7 @@ class DriverRemoteConnection(RemoteConnection):
                  transport_factory=None, pool_size=None, max_workers=None,
                  username="", password="", message_serializer=None,
                  graphson_reader=None, graphson_writer=None,
-                 headers=None):
+                 headers=None, max_content_length=None):
         if message_serializer is None:
             message_serializer = serializer.GraphSONMessageSerializer(
                 reader=graphson_reader,
@@ -45,7 +45,8 @@ class DriverRemoteConnection(RemoteConnection):
                                      message_serializer=message_serializer,
                                      username=username,
                                      password=password,
-                                     headers=headers)
+                                     headers=headers,
+                                     max_content_length=max_content_length)
         self._url = self._client._url
         self._traversal_source = self._client._traversal_source
 
diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/tornado/transport.py b/gremlin-python/src/main/jython/gremlin_python/driver/tornado/transport.py
index f14c518..cd0b4bf 100644
--- a/gremlin-python/src/main/jython/gremlin_python/driver/tornado/transport.py
+++ b/gremlin-python/src/main/jython/gremlin_python/driver/tornado/transport.py
@@ -26,21 +26,25 @@ __author__ = 'David M. Brown (davebshow@gmail.com)'
 
 class TornadoTransport(AbstractBaseTransport):
 
+    _default_max_content_length = 10 * 1024 * 1024
+
     def __init__(self, read_timeout=None, write_timeout=None,
                  compression_options={'compression_level': 5, 'mem_level': 5},
-                 ssl_options=None):
+                 ssl_options=None, max_content_length=_default_max_content_length):
         self._loop = ioloop.IOLoop(make_current=False)
         self._ws = None
         self._read_timeout = read_timeout
         self._write_timeout = write_timeout
         self._compression_options = compression_options
         self._ssl_options = ssl_options
+        self._max_content_length = max_content_length
 
     def connect(self, url, headers=None):
         if headers or self._ssl_options:
             url = httpclient.HTTPRequest(url, headers=headers, ssl_options=self._ssl_options)
         self._ws = self._loop.run_sync(
-            lambda: websocket.websocket_connect(url, compression_options=self._compression_options))
+            lambda: websocket.websocket_connect(url, compression_options=self._compression_options,
+                                                max_message_size=self._max_content_length))
 
     def write(self, message):
         self._loop.run_sync(
diff --git a/gremlin-python/src/main/jython/tests/driver/test_client.py b/gremlin-python/src/main/jython/tests/driver/test_client.py
index 214336f..bf85986 100644
--- a/gremlin-python/src/main/jython/tests/driver/test_client.py
+++ b/gremlin-python/src/main/jython/tests/driver/test_client.py
@@ -44,6 +44,17 @@ def test_connection(connection):
     assert 'host' in results_set.status_attributes
 
 
+def test_client_message_too_big(client):
+    try:
+        client = Client("http://localhost", 'g', max_content_length=1024)
+        client.submit("1+1").all().result()
+        assert False
+    except Exception:
+        assert True
+    finally:
+        client.close()
+
+
 def test_client_simple_eval(client):
     assert client.submit('1 + 1').all().result()[0] == 2