in elasticapm/contrib/serverless/aws.py [0:0]
def get_url_dict(event: dict) -> dict:
"""
Reconstruct URL from API Gateway
"""
headers = event.get("headers") or {}
protocol = headers.get("X-Forwarded-Proto", headers.get("x-forwarded-proto", "https"))
host = headers.get("Host", headers.get("host", ""))
stage = nested_key(event, "requestContext", "stage") or ""
raw_path = event.get("rawPath", "")
if stage:
stage = "/" + stage
raw_path = raw_path.split(stage)[-1]
path = event.get("path", raw_path)
port = headers.get("X-Forwarded-Port", headers.get("x-forwarded-port"))
query = ""
if "rawQueryString" in event:
query = event["rawQueryString"]
elif event.get("queryStringParameters"):
if stage: # api requires parameters encoding to build correct url
query = "?" + urlencode(event["queryStringParameters"])
else: # for elb we do not have the stage
query = "?" + "&".join(["{}={}".format(k, v) for k, v in event["queryStringParameters"].items()])
url = protocol + "://" + host + stage + path + query
url_dict = {
"full": encoding.keyword_field(url),
"protocol": protocol,
"hostname": encoding.keyword_field(host),
"pathname": encoding.keyword_field(stage + path),
}
if port:
url_dict["port"] = port
if query:
url_dict["search"] = encoding.keyword_field(query)
return url_dict