From 99e3ffd4e2a63bd3e04d1bc48be3af6048d9b760 Mon Sep 17 00:00:00 2001 From: Alexander Percivall Date: Sun, 13 Sep 2026 17:50:46 +0200 Subject: [PATCH] fix(sentry): handle empty/non-JSON error responses in validate_scopes (#6813) --- .../sentry_provider/sentry_provider.py | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/keep/providers/sentry_provider/sentry_provider.py b/keep/providers/sentry_provider/sentry_provider.py index 9643a362fe..ac90694fc3 100644 --- a/keep/providers/sentry_provider/sentry_provider.py +++ b/keep/providers/sentry_provider/sentry_provider.py @@ -155,6 +155,16 @@ def get_template(self): def get_parameters(self): return {} + @staticmethod + def _extract_error_detail(response: requests.Response) -> str: + try: + response_json = response.json() + if isinstance(response_json, dict): + return response_json.get("detail") or str(response_json) + except Exception: + pass + return f"HTTP {response.status_code}" + def validate_scopes(self) -> dict[str, bool | str]: validated_scopes = {} project_slug = None @@ -166,8 +176,7 @@ def validate_scopes(self) -> dict[str, bool | str]: headers=self.__headers, ) if not response.ok: - response_json = response.json() - validated_scopes[scope.name] = response_json.get("detail") + validated_scopes[scope.name] = self._extract_error_detail(response) continue else: projects_response = requests.get( @@ -175,18 +184,22 @@ def validate_scopes(self) -> dict[str, bool | str]: headers=self.__headers, ) if not projects_response.ok: - response_json = projects_response.json() - validated_scopes[scope.name] = response_json.get("detail") + validated_scopes[scope.name] = self._extract_error_detail(projects_response) + continue + try: + projects = projects_response.json() + project_slug = projects[0].get("slug") if projects else None + except Exception: + project_slug = None + if not project_slug: + validated_scopes[scope.name] = "No projects found" continue - projects = projects_response.json() - project_slug = projects[0].get("slug") response = requests.get( f"{self.sentry_api}/projects/{self.sentry_org_slug}/{project_slug}/issues/", headers=self.__headers, ) if not response.ok: - response_json = response.json() - validated_scopes[scope.name] = response_json.get("detail") + validated_scopes[scope.name] = self._extract_error_detail(response) continue validated_scopes[scope.name] = True elif scope.name == "project:read": @@ -195,8 +208,7 @@ def validate_scopes(self) -> dict[str, bool | str]: headers=self.__headers, ) if not response.ok: - response_json = response.json() - validated_scopes[scope.name] = response_json.get("detail") + validated_scopes[scope.name] = self._extract_error_detail(response) continue validated_scopes[scope.name] = True elif scope.name == "project:write": @@ -205,8 +217,7 @@ def validate_scopes(self) -> dict[str, bool | str]: headers=self.__headers, ) if not response.ok: - response_json = response.json() - validated_scopes[scope.name] = response_json.get("detail") + validated_scopes[scope.name] = self._extract_error_detail(response) continue validated_scopes[scope.name] = True return validated_scopes