mini-syndicate-py/syndicate/mini/url.py

34 lines
789 B
Python

# URLs denoting Syndicate servers.
class InvalidSyndicateUrl(ValueError): pass
schemas = {}
def schema(schema_name):
def k(factory_class):
schemas[schema_name] = factory_class
return factory_class
return k
def _bad_url(u):
raise InvalidSyndicateUrl('Invalid Syndicate server URL', u)
def connection_from_url(u):
pieces = u.split(':', 1)
if len(pieces) != 2: _bad_url(u)
schema_name, _rest = pieces
if schema_name not in schemas: _bad_url(u)
conn = schemas[schema_name].from_url(u)
if not conn: _bad_url(u)
return conn
def _hostport(s, default_port):
try:
i = s.rindex(':')
except ValueError:
i = None
if i is not None:
return (s[:i], int(s[i+1:]))
else:
return (s, default_port)