Ass send_get_body_as parameter for situations where GET cannot have a body

This commit is contained in:
Honza Král
2013-12-02 22:57:47 +01:00
parent 69b8023c15
commit cf03f9831a
2 changed files with 34 additions and 1 deletions
+20 -1
View File
@@ -36,7 +36,7 @@ class Transport(object):
connection_pool_class=ConnectionPool, host_info_callback=get_host_info,
sniff_on_start=False, sniffer_timeout=None,
sniff_on_connection_fail=False, serializer=JSONSerializer(),
max_retries=3, **kwargs):
max_retries=3, send_get_body_as='GET', **kwargs):
"""
:arg hosts: list of dictionaries, each containing keyword arguments to
create a `connection_class` instance
@@ -51,6 +51,11 @@ class Transport(object):
:arg sniff_on_connection_fail: flag controlling if connection failure triggers a sniff
:arg serializer: serializer instance
:arg max_retries: maximum number of retries before an exception is propagated
:arg send_get_body_as: for GET requests with body this option allows
you to specify an alternate way of execution for environments that
don't support passing bodies with GET requests. If you set this to
'POST' a POST method will be used instead, if to 'source' then the body
will be serialized and passed as a query parameter `source`.
Any extra keyword arguments will be passed to the `connection_class`
when creating and instance unless overriden by that connection's
@@ -58,6 +63,7 @@ class Transport(object):
"""
self.max_retries = max_retries
self.send_get_body_as = send_get_body_as
# data serializer
self.serializer = serializer
@@ -215,6 +221,19 @@ class Transport(object):
if body is not None:
body = self.serializer.dumps(body)
# some clients or environments don't support sending GET with body
if method == 'GET' and self.send_get_body_as != 'GET':
# send it as post instead
if self.send_get_body_as == 'POST':
method = 'POST'
# or as source parameter
elif self.send_get_body_as == 'source':
if params is None:
params = {}
params['source'] = body
body = None
ignore = ()
if params and 'ignore' in params:
ignore = params.pop('ignore')
+14
View File
@@ -35,6 +35,20 @@ CLUSTER_NODES = '''{
}'''
class TestTransport(TestCase):
def test_send_get_body_as_source(self):
t = Transport([{}], send_get_body_as='source', connection_class=DummyConnection)
t.perform_request('GET', '/', body={})
self.assertEquals(1, len(t.get_connection().calls))
self.assertEquals(('GET', '/', {'source': '{}'}, None), t.get_connection().calls[0][0])
def test_send_get_body_as_post(self):
t = Transport([{}], send_get_body_as='POST', connection_class=DummyConnection)
t.perform_request('GET', '/', body={})
self.assertEquals(1, len(t.get_connection().calls))
self.assertEquals(('POST', '/', None, '{}'), t.get_connection().calls[0][0])
def test_kwargs_passed_on_to_connections(self):
t = Transport([{'host': 'google.com'}], port=123)
self.assertEquals(1, len(t.connection_pool.connections))