Skip to content

Commit acea889

Browse files
🚑 Avoid Django "ALLOWED_HOSTS" check
1 parent bca4826 commit acea889

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware/otel_middleware.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ def process_request(self, request):
194194
# Read more about request.META here:
195195
# https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpRequest.META
196196

197-
if self._excluded_urls.url_disabled(request.build_absolute_uri("?")):
197+
if self._url_is_disabled(request):
198198
return
199199

200200
is_asgi_request = _is_asgi_request(request)
@@ -305,7 +305,7 @@ def process_request(self, request):
305305
def process_view(self, request, view_func, *args, **kwargs):
306306
# Process view is executed before the view function, here we get the
307307
# route template from request.resolver_match. It is not set yet in process_request
308-
if self._excluded_urls.url_disabled(request.build_absolute_uri("?")):
308+
if self._url_is_disabled(request):
309309
return
310310

311311
if (
@@ -330,7 +330,7 @@ def process_view(self, request, view_func, *args, **kwargs):
330330
duration_attrs[HTTP_ROUTE] = route
331331

332332
def process_exception(self, request, exception):
333-
if self._excluded_urls.url_disabled(request.build_absolute_uri("?")):
333+
if self._url_is_disabled(request):
334334
return
335335

336336
if self._environ_activation_key in request.META.keys():
@@ -340,7 +340,7 @@ def process_exception(self, request, exception):
340340
# pylint: disable=too-many-locals
341341
# pylint: disable=too-many-statements
342342
def process_response(self, request, response):
343-
if self._excluded_urls.url_disabled(request.build_absolute_uri("?")):
343+
if self._url_is_disabled(request):
344344
return response
345345

346346
is_asgi_request = _is_asgi_request(request)
@@ -453,6 +453,15 @@ def process_response(self, request, response):
453453

454454
return response
455455

456+
def _url_is_disabled(self, request):
457+
"""
458+
Avoid `request.get_host` to bypass Django's ALLOWED_HOST check
459+
"""
460+
url = "{}://{}{}?".format(
461+
request.scheme, request._get_raw_host(), request.path
462+
)
463+
return self._excluded_urls.url_disabled(url)
464+
456465

457466
def _parse_duration_attrs(
458467
req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT

instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ def setUpClass(cls):
116116
def setUp(self):
117117
super().setUp()
118118
setup_test_environment()
119+
conf.settings.ALLOWED_HOSTS = [
120+
# Django adds "testserver" within "setup_test_environment" so this check doesn't break during tests.
121+
"unknown"
122+
]
119123
test_name = ""
120124
if hasattr(self, "_testMethodName"):
121125
test_name = self._testMethodName

0 commit comments

Comments
 (0)