Просмотр исходного кода

chore(hybrid-cloud): Capture RestrictedIPAddress as ApiHostError (#52684)

Alberto Leal 1 год назад
Родитель
Сommit
d28b481c73

+ 4 - 0
src/sentry/shared_integrations/client/base.py

@@ -9,6 +9,7 @@ from django.core.cache import cache
 from requests import PreparedRequest, Request, Response
 from requests.exceptions import ConnectionError, HTTPError, Timeout
 
+from sentry.exceptions import RestrictedIPAddress
 from sentry.http import build_session
 from sentry.utils import json, metrics
 from sentry.utils.hashlib import md5_text
@@ -174,6 +175,9 @@ class BaseApiClient(TrackResponseMixin):
                     if raw_response:
                         return resp
                     resp.raise_for_status()
+            except RestrictedIPAddress as e:
+                self.track_response_data("restricted_ip_address", span, e)
+                raise ApiHostError.from_exception(e) from e
             except ConnectionError as e:
                 self.track_response_data("connection_error", span, e)
                 raise ApiHostError.from_exception(e) from e

+ 12 - 0
tests/sentry/shared_integrations/client/test_base.py

@@ -1,10 +1,13 @@
 from unittest.mock import patch
 
 import responses
+from pytest import raises
 from requests import PreparedRequest, Request
 
 from sentry.shared_integrations.client.base import BaseApiClient
+from sentry.shared_integrations.exceptions import ApiHostError
 from sentry.testutils import TestCase
+from sentry.testutils.helpers.socket import override_blacklist
 
 
 class BaseApiClientTest(TestCase):
@@ -55,3 +58,12 @@ class BaseApiClientTest(TestCase):
         assert put_response.call_count == 0
         self.client.get("https://example.com/get", prepared_request=prepared_request)
         assert put_response.call_count == 1
+
+    @responses.activate
+    @patch.object(BaseApiClient, "finalize_request", side_effect=lambda req: req)
+    @override_blacklist("172.16.0.0/12")
+    def test_restricted_ip_address(self, mock_finalize_request):
+        assert not mock_finalize_request.called
+        with raises(ApiHostError):
+            self.client.get("https://172.31.255.255")
+        assert mock_finalize_request.called