Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions howfast_apm/flask.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from flask import Flask, request

from .core import CoreAPM
from .utils import is_in_blacklist
from .utils import is_in_blacklist, compile_endpoints

logger = logging.getLogger('howfast_apm')

Expand Down Expand Up @@ -42,7 +42,7 @@ def __init__(
app.wsgi_app = self

if endpoints_blacklist:
self.endpoints_blacklist = endpoints_blacklist
self.endpoints_blacklist = compile_endpoints(*endpoints_blacklist)
else:
self.endpoints_blacklist = []

Expand Down
14 changes: 10 additions & 4 deletions howfast_apm/utils.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
import fnmatch
import re

from typing import List


def compile_endpoints(*blacklist):
"""Compiles a list endpoints to a list of regexes"""
return [re.compile(fnmatch.translate(x)) for x in blacklist]


def is_in_blacklist(uri: str, blacklist: List[str]) -> bool:
"""
Return True if the URI is blacklisted.

>>> is_in_blacklist('/some-real-uri/', ['/exact-uri/'])
>>> is_in_blacklist('/some-real-uri/', compile_endpoints('/exact-uri/'))
False
>>> is_in_blacklist('/exact-uri/', ['/exact-uri/'])
>>> is_in_blacklist('/exact-uri/', compile_endpoints('/exact-uri/'))
True
>>> is_in_blacklist('/job/42/retry', ['/job/*'])
>>> is_in_blacklist('/job/42/retry', compile_endpoints('/job/*'))
True

"""
for pattern in blacklist:
if fnmatch.fnmatch(uri, pattern):
if pattern.match(uri):
return True
return False

Expand Down
30 changes: 16 additions & 14 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
from howfast_apm import utils
from howfast_apm.utils import compile_endpoints, is_in_blacklist


def test_is_blacklist_exact():
""" The blacklist util should support exact strings matching """
assert utils.is_in_blacklist('/some-real-uri/', ['/exact-uri/']) is False
assert utils.is_in_blacklist('/exact-uri/', ['/exact-uri/']) is True
assert utils.is_in_blacklist('/exact-uri/with-subpath', ['/exact-uri/']) is False
blacklist = compile_endpoints('/exact-uri/')
assert is_in_blacklist('/some-real-uri/', blacklist) is False
assert is_in_blacklist('/exact-uri/', blacklist) is True
assert is_in_blacklist('/exact-uri/with-subpath', blacklist) is False

# With multiple patterns
assert utils.is_in_blacklist('/exact-uri-1/', ['/exact-uri-1/', '/exact-uri-2/']) is True
assert utils.is_in_blacklist('/exact-uri-2/', ['/exact-uri-1/', '/exact-uri-2/']) is True
assert utils.is_in_blacklist('/exact-uri-3/', ['/exact-uri-1/', '/exact-uri-2/']) is False
multiple_blacklist = compile_endpoints('/exact-uri-1/', '/exact-uri-2/')
assert is_in_blacklist('/exact-uri-1/', multiple_blacklist) is True
assert is_in_blacklist('/exact-uri-2/', multiple_blacklist) is True
assert is_in_blacklist('/exact-uri-3/', multiple_blacklist) is False


def test_is_blacklist_glob():
""" The blacklist util should support shell-like matching """
blacklist = ['/jobs/*/results', '/support/*']
assert utils.is_in_blacklist('/jobs/42/results', blacklist) is True
assert utils.is_in_blacklist('/jobs/42/', blacklist) is False
blacklist = compile_endpoints('/jobs/*/results', '/support/*')
assert is_in_blacklist('/jobs/42/results', blacklist) is True
assert is_in_blacklist('/jobs/42/', blacklist) is False

assert utils.is_in_blacklist('/support/', blacklist) is True
assert utils.is_in_blacklist('/support/tickets/23', blacklist) is True
assert utils.is_in_blacklist('/support/admin', blacklist) is True
assert utils.is_in_blacklist('/support', blacklist) is False
assert is_in_blacklist('/support/', blacklist) is True
assert is_in_blacklist('/support/tickets/23', blacklist) is True
assert is_in_blacklist('/support/admin', blacklist) is True
assert is_in_blacklist('/support', blacklist) is False