Merge pull request #844 from meejah/newapi-transport-options

Newapi transport options
This commit is contained in:
Tobias Oberstein
2017-06-06 12:01:32 +02:00
committed by GitHub
2 changed files with 38 additions and 6 deletions

View File

@@ -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):
"""

View File

@@ -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: