diff --git a/src/lumigo_tracer/wrappers/http/http_parser.py b/src/lumigo_tracer/wrappers/http/http_parser.py index 77ea3d61..819cfea4 100644 --- a/src/lumigo_tracer/wrappers/http/http_parser.py +++ b/src/lumigo_tracer/wrappers/http/http_parser.py @@ -247,8 +247,11 @@ def _extract_message_id(response_body: bytes) -> Optional[str]: class S3Parser(Parser): def parse_request(self, parse_params: HttpRequest) -> dict: + resource_name = safe_split_get(parse_params.host, ".", 0) + if resource_name == "s3": + resource_name = safe_split_get(parse_params.uri, "/", 1) return recursive_json_join( - {"info": {"resourceName": safe_split_get(parse_params.host, ".", 0)}}, + {"info": {"resourceName": resource_name}}, super().parse_request(parse_params), ) @@ -318,7 +321,7 @@ def get_parser(url: str, headers: Optional[dict] = None) -> Type[Parser]: return KinesisParser elif service == "events": return EventBridgeParser - elif safe_split_get(url, ".", 1) == "s3": + elif safe_split_get(url, ".", 1) == "s3" or safe_split_get(url, ".", 0) == "s3": return S3Parser # SQS Legacy Endpoints: https://docs.aws.amazon.com/general/latest/gr/rande.html elif service in ("sqs", "sqs-fips") or "queue.amazonaws.com" in url: diff --git a/src/test/unit/wrappers/http/test_http_parser.py b/src/test/unit/wrappers/http/test_http_parser.py index 1f7da202..3097df56 100644 --- a/src/test/unit/wrappers/http/test_http_parser.py +++ b/src/test/unit/wrappers/http/test_http_parser.py @@ -12,6 +12,7 @@ DynamoParser, EventBridgeParser, LambdaParser, + S3Parser, ) @@ -31,6 +32,12 @@ def test_get_parser_check_headers(): assert get_parser(url, headers) == ServerlessAWSParser +def test_get_parser_s3(): + url = "s3.eu-west-1.amazonaws.com" + headers = {"key": "value"} + assert get_parser(url, headers) == S3Parser + + def test_get_parser_apigw(): url = "https://ne3kjv28fh.execute-api.us-west-2.amazonaws.com/doriaviram" assert get_parser(url, {}) == ApiGatewayV2Parser @@ -250,6 +257,34 @@ def test_event_bridge_parser_request_sad_flow(): assert response["info"]["resourceNames"] is None +@pytest.mark.parametrize( + "uri, resource_name, host", + [ + ( + "s3.eu-west-1.amazonaws.com/my.s3-bucket1.com/documents/2021/3/31/file.pdf", + "my.s3-bucket1.com", + "s3.eu-west-1.amazonaws.com", + ), + ( + "my-s3-bucket.s3.us-west-2.amazonaws.com/documents/2021/3/31/file.pdf", + "my-s3-bucket", + "my-s3-bucket.s3.us-west-2.amazonaws.com", + ), + ], +) +def test_s3_parser_resource_name(uri, resource_name, host): + parser = S3Parser() + params = HttpRequest( + host=host, + method="PUT", + uri=uri, + headers={}, + body="", + ) + response = parser.parse_request(params) + assert response["info"]["resourceName"] == resource_name + + def test_event_bridge_parser_response_happy_flow(): parser = EventBridgeParser() response = parser.parse_response(