in chalice/app.py [0:0]
def _main_rest_api_handler(self, event: Any, context: Any) -> Response:
resource_path = event.get('requestContext', {}).get('resourcePath')
if resource_path is None:
return error_response(error_code='InternalServerError',
message='Unknown request.',
http_status_code=500)
http_method = event['requestContext']['httpMethod']
if http_method not in self.routes[resource_path]:
allowed_methods = ', '.join(self.routes[resource_path].keys())
return error_response(
error_code='MethodNotAllowedError',
message='Unsupported method: %s' % http_method,
http_status_code=405,
headers={'Allow': allowed_methods})
route_entry = self.routes[resource_path][http_method]
view_function = route_entry.view_function
function_args = {name: event['pathParameters'][name]
for name in route_entry.view_args}
self.lambda_context = context
# We're getting the CORS headers before validation to be able to
# output desired headers with
cors_headers = None
if self._cors_enabled_for_route(route_entry):
cors_headers = self._get_cors_headers(route_entry.cors)
# We're doing the header validation after creating the request
# so can leverage the case insensitive dict that the Request class
# uses for headers.
if self.current_request and route_entry.content_types:
content_type = self.current_request.headers.get(
'content-type', 'application/json')
if not _matches_content_type(content_type,
route_entry.content_types):
return error_response(
error_code='UnsupportedMediaType',
message='Unsupported media type: %s' % content_type,
http_status_code=415,
headers=cors_headers
)
response = self._get_view_function_response(view_function,
function_args)
if cors_headers is not None:
self._add_cors_headers(response, cors_headers)
response_headers = CaseInsensitiveMapping(response.headers)
if self.current_request and not self._validate_binary_response(
self.current_request.headers, response_headers):
content_type = response_headers.get('content-type', '')
return error_response(
error_code='BadRequest',
message=('Request did not specify an Accept header with %s, '
'The response has a Content-Type of %s. If a '
'response has a binary Content-Type then the request '
'must specify an Accept header that matches.'
% (content_type, content_type)),
http_status_code=400,
headers=cors_headers
)
return response