34 lines
789 B
Python
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)
|