Merge pull request #844 from meejah/newapi-transport-options
Newapi transport options
This commit is contained in:
@@ -143,23 +143,44 @@ def _create_transport_serializers(transport):
|
||||
return serializers
|
||||
|
||||
|
||||
def _camel_case_from_snake_case(snake):
|
||||
parts = snake.split('_')
|
||||
return parts[0] + ''.join([s.capitalize() for s in parts[1:]])
|
||||
|
||||
|
||||
def _create_transport_factory(reactor, transport, session_factory):
|
||||
"""
|
||||
Create a WAMP-over-XXX transport factory.
|
||||
"""
|
||||
if transport.type == 'websocket':
|
||||
# FIXME: forward WebSocket options
|
||||
serializers = _create_transport_serializers(transport)
|
||||
return WampWebSocketClientFactory(session_factory, url=transport.url, serializers=serializers)
|
||||
factory = WampWebSocketClientFactory(session_factory, url=transport.url, serializers=serializers)
|
||||
|
||||
elif transport.type == 'rawsocket':
|
||||
# FIXME: forward RawSocket options
|
||||
serializer = _create_transport_serializer(transport.serializers[0])
|
||||
return WampRawSocketClientFactory(session_factory, serializer=serializer)
|
||||
factory = WampRawSocketClientFactory(session_factory, serializer=serializer)
|
||||
|
||||
else:
|
||||
assert(False), 'should not arrive here'
|
||||
|
||||
# set the options one at a time so we can give user better feedback
|
||||
for k, v in transport.options.items():
|
||||
try:
|
||||
factory.setProtocolOptions(**{k: v})
|
||||
except (TypeError, KeyError):
|
||||
# this allows us to document options as snake_case
|
||||
# until everything internally is upgraded from
|
||||
# camelCase
|
||||
try:
|
||||
factory.setProtocolOptions(
|
||||
**{_camel_case_from_snake_case(k): v}
|
||||
)
|
||||
except (TypeError, KeyError):
|
||||
raise ValueError(
|
||||
"Unknown {} transport option: {}={}".format(transport.type, k, v)
|
||||
)
|
||||
return factory
|
||||
|
||||
|
||||
def _create_transport_endpoint(reactor, endpoint_config):
|
||||
"""
|
||||
|
||||
@@ -116,7 +116,7 @@ def _create_transport(index, transport, check_native_endpoint=None):
|
||||
if type(transport) != dict:
|
||||
raise ValueError('invalid type {} for transport configuration - must be a dict'.format(type(transport)))
|
||||
|
||||
valid_transport_keys = ['type', 'url', 'endpoint', 'serializer', 'serializers']
|
||||
valid_transport_keys = ['type', 'url', 'endpoint', 'serializer', 'serializers', 'options']
|
||||
for k in transport.keys():
|
||||
if k not in valid_transport_keys:
|
||||
raise ValueError(
|
||||
@@ -131,6 +131,14 @@ def _create_transport(index, transport, check_native_endpoint=None):
|
||||
else:
|
||||
transport['type'] = 'websocket'
|
||||
|
||||
options = dict()
|
||||
if 'options' in transport:
|
||||
options = transport['options']
|
||||
if not isinstance(options, dict):
|
||||
raise ValueError(
|
||||
'options must be a dict, not {}'.format(type(options))
|
||||
)
|
||||
|
||||
if kind == 'websocket':
|
||||
for key in ['url']:
|
||||
if key not in transport:
|
||||
@@ -200,6 +208,7 @@ def _create_transport(index, transport, check_native_endpoint=None):
|
||||
url=transport['url'],
|
||||
endpoint=endpoint_config,
|
||||
serializers=serializer_config,
|
||||
options=options,
|
||||
**kw
|
||||
)
|
||||
|
||||
@@ -214,7 +223,8 @@ class _Transport(object):
|
||||
max_retry_delay=300,
|
||||
initial_retry_delay=1.5,
|
||||
retry_delay_growth=1.5,
|
||||
retry_delay_jitter=0.1):
|
||||
retry_delay_jitter=0.1,
|
||||
options=dict()):
|
||||
"""
|
||||
"""
|
||||
self.idx = idx
|
||||
@@ -222,6 +232,7 @@ class _Transport(object):
|
||||
self.type = kind
|
||||
self.url = url
|
||||
self.endpoint = endpoint
|
||||
self.options = options
|
||||
|
||||
self.serializers = serializers
|
||||
if self.type == 'rawsocket' and len(serializers) != 1:
|
||||
|
||||
Reference in New Issue
Block a user