Merge pull request #432 from agoose77/cleanups
Bugfix & simplfication for host based routing
This commit is contained in:
commit
fe72fadedd
|
@ -1,5 +1,6 @@
|
||||||
import re
|
import re
|
||||||
from collections import defaultdict, namedtuple
|
from collections import defaultdict, namedtuple
|
||||||
|
from collections.abc import Iterable
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
|
|
||||||
from sanic.exceptions import NotFound, InvalidUsage
|
from sanic.exceptions import NotFound, InvalidUsage
|
||||||
|
@ -68,14 +69,14 @@ class Router:
|
||||||
self.routes_static = {}
|
self.routes_static = {}
|
||||||
self.routes_dynamic = defaultdict(list)
|
self.routes_dynamic = defaultdict(list)
|
||||||
self.routes_always_check = []
|
self.routes_always_check = []
|
||||||
self.hosts = None
|
self.hosts = set()
|
||||||
|
|
||||||
def parse_parameter_string(self, parameter_string):
|
def parse_parameter_string(self, parameter_string):
|
||||||
"""Parse a parameter string into its constituent name, type, and
|
"""Parse a parameter string into its constituent name, type, and
|
||||||
pattern
|
pattern
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
`parse_parameter_string('<param_one:[A-z]')` ->
|
`parse_parameter_string('<param_one:[A-z]>')` ->
|
||||||
('param_one', str, '[A-z]')
|
('param_one', str, '[A-z]')
|
||||||
|
|
||||||
:param parameter_string: String to parse
|
:param parameter_string: String to parse
|
||||||
|
@ -106,20 +107,17 @@ class Router:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if host is not None:
|
if host is not None:
|
||||||
# we want to track if there are any
|
|
||||||
# vhosts on the Router instance so that we can
|
|
||||||
# default to the behavior without vhosts
|
|
||||||
if self.hosts is None:
|
|
||||||
self.hosts = set(host)
|
|
||||||
else:
|
|
||||||
if isinstance(host, list):
|
|
||||||
host = set(host)
|
|
||||||
self.hosts.add(host)
|
|
||||||
if isinstance(host, str):
|
if isinstance(host, str):
|
||||||
uri = host + uri
|
uri = host + uri
|
||||||
|
self.hosts.add(host)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
for h in host:
|
if not isinstance(host, Iterable):
|
||||||
self.add(uri, methods, handler, h)
|
raise ValueError("Expected either string or Iterable of "
|
||||||
|
"host strings, not {!r}".format(host))
|
||||||
|
|
||||||
|
for host_ in host:
|
||||||
|
self.add(uri, methods, handler, host_)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Dict for faster lookups of if method allowed
|
# Dict for faster lookups of if method allowed
|
||||||
|
@ -260,7 +258,12 @@ class Router:
|
||||||
:param request: Request object
|
:param request: Request object
|
||||||
:return: handler, arguments, keyword arguments
|
:return: handler, arguments, keyword arguments
|
||||||
"""
|
"""
|
||||||
if self.hosts is None:
|
# Note - this means that if _any_ routes specify host, non-host routes
|
||||||
|
# will typically fail as they are looked up by host
|
||||||
|
# fix - check if host is in host-based routing table (perhaps) or
|
||||||
|
# better, get candidate of routes and then dispatch by host.
|
||||||
|
# This may have perf issues.
|
||||||
|
if not self.hosts:
|
||||||
return self._get(request.url, request.method, '')
|
return self._get(request.url, request.method, '')
|
||||||
else:
|
else:
|
||||||
return self._get(request.url, request.method,
|
return self._get(request.url, request.method,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user