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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user