diff --git a/sentry_sdk/integrations/django/transactions.py b/sentry_sdk/integrations/django/transactions.py index 1532c6f25b..91349c4bf9 100644 --- a/sentry_sdk/integrations/django/transactions.py +++ b/sentry_sdk/integrations/django/transactions.py @@ -37,7 +37,7 @@ def get_regex(resolver_or_pattern): class RavenResolver(object): _optional_group_matcher = re.compile(r"\(\?\:([^\)]+)\)") - _named_group_matcher = re.compile(r"\(\?P<(\w+)>.*\)") + _named_group_matcher = re.compile(r"\(\?P<(\w+)>[^\)]+\)+") _non_named_group_matcher = re.compile(r"\([^\)]+\)") # [foo|bar|baz] _either_option_matcher = re.compile(r"\[([^\]]+)\|([^\]]+)\]") diff --git a/tests/integrations/django/test_transactions.py b/tests/integrations/django/test_transactions.py index 160da9223d..4c94a2c955 100644 --- a/tests/integrations/django/test_transactions.py +++ b/tests/integrations/django/test_transactions.py @@ -22,11 +22,12 @@ example_url_conf = ( url(r"^api/(?P[\w_-]+)/store/$", lambda x: ""), url(r"^api/(?P(v1|v2))/author/$", lambda x: ""), + url( + r"^api/(?P[^\/]+)/product/(?P(?:\d+|[A-Fa-f0-9-]{32,36}))/$", + lambda x: "", + ), url(r"^report/", lambda x: ""), url(r"^example/", include(included_url_conf)), - url( - r"^(?P[$\\-_.+!*(),\\w//]+)/$", lambda x: "" - ), # example of complex regex from django-cms ) @@ -56,14 +57,12 @@ def test_legacy_resolver_included_match(): assert result == "/example/foo/bar/{param}" -def test_complex_regex_from_django_cms(): - """ - Reference: https://github.com/getsentry/sentry-python/issues/1527 - """ - +def test_capture_multiple_named_groups(): resolver = RavenResolver() - result = resolver.resolve("/,/", example_url_conf) - assert result == "/{slug}/" + result = resolver.resolve( + "/api/myproject/product/cb4ef1caf3554c34ae134f3c1b3d605f/", example_url_conf + ) + assert result == "/api/{project_id}/product/{pid}/" @pytest.mark.skipif(django.VERSION < (2, 0), reason="Requires Django > 2.0") @@ -74,3 +73,13 @@ def test_legacy_resolver_newstyle_django20_urlconf(): resolver = RavenResolver() result = resolver.resolve("/api/v2/1234/store/", url_conf) assert result == "/api/v2/{project_id}/store/" + + +@pytest.mark.skipif(django.VERSION < (2, 0), reason="Requires Django > 2.0") +def test_legacy_resolver_newstyle_django20_urlconf_multiple_groups(): + from django.urls import path + + url_conf = (path("api/v2//product/", lambda x: ""),) + resolver = RavenResolver() + result = resolver.resolve("/api/v2/1234/product/5689", url_conf) + assert result == "/api/v2/{project_id}/product/{pid}"