def handle_http(self, event: dict, context: dict) -> dict: server, client = get_server_and_client(event) headers = event.get("headers", {}) headers_key_value_pairs = [[k.lower().encode(), v.encode()] for k, v in headers.items()] multi_value_query_string_params = event[ "multiValueQueryStringParameters"] query_string = (urllib.parse.urlencode(multi_value_query_string_params, doseq=True).encode() if multi_value_query_string_params else b"") scope = { "type": "http", "http_version": "1.1", "method": event["httpMethod"], "headers": headers_key_value_pairs, "path": urllib.parse.unquote(event["path"]), "raw_path": None, "root_path": "", "scheme": headers.get("X-Forwarded-Proto", "https"), "query_string": query_string, "server": server, "client": client, "asgi": { "version": "3.0" }, "aws": { "event": event, "context": context }, } is_binary = event.get("isBase64Encoded", False) body = event["body"] or b"" if is_binary: body = base64.b64decode(body) elif not isinstance(body, bytes): body = body.encode() asgi_cycle = ASGIHTTPCycle(scope, is_binary=is_binary, logger=self.logger) asgi_cycle.put_message({ "type": "http.request", "body": body, "more_body": False }) response = asgi_cycle(self.app) return response
def handle_http(self, event: dict, context: dict, *, is_http_api: bool) -> dict: if is_http_api: source_ip = event["requestContext"]["http"]["sourceIp"] query_string = event.get("rawQueryString") path = event["requestContext"]["http"]["path"] http_method = event["requestContext"]["http"]["method"] else: source_ip = event["requestContext"].get("identity", {}).get("sourceIp") multi_value_query_string_params = event["multiValueQueryStringParameters"] query_string = ( urllib.parse.urlencode( multi_value_query_string_params, doseq=True ).encode() if multi_value_query_string_params else b"" ) path = event["path"] http_method = event["httpMethod"] headers = ( {k.lower(): v for k, v in event.get("headers").items()} # type: ignore if event.get("headers") else {} ) server = get_server(headers) client = (source_ip, 0) scope = { "type": "http", "http_version": "1.1", "method": http_method, "headers": [[k.encode(), v.encode()] for k, v in headers.items()], "path": self.strip_base_path(path), "raw_path": None, "root_path": "", "scheme": headers.get("x-forwarded-proto", "https"), "query_string": query_string, "server": server, "client": client, "asgi": {"version": "3.0"}, "aws.event": event, "aws.context": context, } is_binary = event.get("isBase64Encoded", False) body = event.get("body") or b"" if is_binary: body = base64.b64decode(body) elif not isinstance(body, bytes): body = body.encode() if self.text_mime_types: text_mime_types = self.text_mime_types + DEFAULT_TEXT_MIME_TYPES else: text_mime_types = DEFAULT_TEXT_MIME_TYPES asgi_cycle = ASGIHTTPCycle( scope, text_mime_types=text_mime_types, logger=self.logger ) asgi_cycle.put_message( {"type": "http.request", "body": body, "more_body": False} ) response = asgi_cycle(self.app) return response