More refactoring.
This commit is contained in:
parent
4dd2b66b04
commit
5de95b026a
@ -58,7 +58,7 @@ class DomainDispatcherApplication(object):
|
|||||||
if re.match(url_base, 'http://%s' % host):
|
if re.match(url_base, 'http://%s' % host):
|
||||||
return backend_name
|
return backend_name
|
||||||
|
|
||||||
def infer_service_region(self, environ):
|
def infer_service_region_host(self, environ):
|
||||||
auth = environ.get('HTTP_AUTHORIZATION')
|
auth = environ.get('HTTP_AUTHORIZATION')
|
||||||
if auth:
|
if auth:
|
||||||
# Signed request
|
# Signed request
|
||||||
@ -68,21 +68,34 @@ class DomainDispatcherApplication(object):
|
|||||||
try:
|
try:
|
||||||
credential_scope = auth.split(",")[0].split()[1]
|
credential_scope = auth.split(",")[0].split()[1]
|
||||||
_, _, region, service, _ = credential_scope.split("/")
|
_, _, region, service, _ = credential_scope.split("/")
|
||||||
return service, region
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
# Signature format does not match, this is exceptional and we can't
|
# Signature format does not match, this is exceptional and we can't
|
||||||
# infer a service-region. A reduced set of services still use
|
# infer a service-region. A reduced set of services still use
|
||||||
# the deprecated SigV2, ergo prefer S3 as most likely default.
|
# the deprecated SigV2, ergo prefer S3 as most likely default.
|
||||||
# https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html
|
# https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html
|
||||||
return DEFAULT_SERVICE_REGION
|
service, region = DEFAULT_SERVICE_REGION
|
||||||
else:
|
else:
|
||||||
# Unsigned request
|
# Unsigned request
|
||||||
target = environ.get('HTTP_X_AMZ_TARGET')
|
target = environ.get('HTTP_X_AMZ_TARGET')
|
||||||
if target:
|
if target:
|
||||||
service, _ = target.split('.', 1)
|
service, _ = target.split('.', 1)
|
||||||
return UNSIGNED_REQUESTS.get(service, DEFAULT_SERVICE_REGION)
|
service, region = UNSIGNED_REQUESTS.get(service, DEFAULT_SERVICE_REGION)
|
||||||
# S3 is the last resort when the target is also unknown
|
# S3 is the last resort when the target is also unknown
|
||||||
return DEFAULT_SERVICE_REGION
|
service, region = DEFAULT_SERVICE_REGION
|
||||||
|
|
||||||
|
if service == 'dynamodb':
|
||||||
|
if environ['HTTP_X_AMZ_TARGET'].startswith('DynamoDBStreams'):
|
||||||
|
host = 'dynamodbstreams'
|
||||||
|
else:
|
||||||
|
dynamo_api_version = environ['HTTP_X_AMZ_TARGET'].split("_")[1].split(".")[0]
|
||||||
|
# If Newer API version, use dynamodb2
|
||||||
|
if dynamo_api_version > "20111205":
|
||||||
|
host = "dynamodb2"
|
||||||
|
else:
|
||||||
|
host = "{service}.{region}.amazonaws.com".format(
|
||||||
|
service=service, region=region)
|
||||||
|
|
||||||
|
return host
|
||||||
|
|
||||||
def get_application(self, environ):
|
def get_application(self, environ):
|
||||||
path_info = environ.get('PATH_INFO', '')
|
path_info = environ.get('PATH_INFO', '')
|
||||||
@ -103,21 +116,9 @@ class DomainDispatcherApplication(object):
|
|||||||
with self.lock:
|
with self.lock:
|
||||||
backend = self.get_backend_for_host(host)
|
backend = self.get_backend_for_host(host)
|
||||||
if not backend:
|
if not backend:
|
||||||
service, region = self.infer_service_region(environ)
|
# No regular backend found; try parsing other headers
|
||||||
if service == 'dynamodb':
|
host = self.infer_service_region_host(environ)
|
||||||
if environ['HTTP_X_AMZ_TARGET'].startswith('DynamoDBStreams'):
|
|
||||||
host = 'dynamodbstreams'
|
|
||||||
else:
|
|
||||||
dynamo_api_version = environ['HTTP_X_AMZ_TARGET'].split("_")[1].split(".")[0]
|
|
||||||
# If Newer API version, use dynamodb2
|
|
||||||
if dynamo_api_version > "20111205":
|
|
||||||
host = "dynamodb2"
|
|
||||||
else:
|
|
||||||
host = "{service}.{region}.amazonaws.com".format(
|
|
||||||
service=service, region=region)
|
|
||||||
backend = self.get_backend_for_host(host)
|
backend = self.get_backend_for_host(host)
|
||||||
if not backend:
|
|
||||||
raise RuntimeError('Invalid host: "%s"' % host)
|
|
||||||
|
|
||||||
app = self.app_instances.get(backend, None)
|
app = self.app_instances.get(backend, None)
|
||||||
if app is None:
|
if app is None:
|
||||||
|
Loading…
Reference in New Issue
Block a user