From 3779bb571ea860b7ff2498fd7bf48b18540dceed Mon Sep 17 00:00:00 2001 From: Douglas Coburn Date: Mon, 24 Mar 2025 13:35:17 -0700 Subject: [PATCH 1/2] Fixed error handling for raising exceptions --- socketdev/__init__.py | 6 ++---- socketdev/core/api.py | 36 ++++++++++++++++++++++++------------ socketdev/log.py | 4 ++++ 3 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 socketdev/log.py diff --git a/socketdev/__init__.py b/socketdev/__init__.py index 4cc3455..d5d9c80 100644 --- a/socketdev/__init__.py +++ b/socketdev/__init__.py @@ -1,5 +1,3 @@ -import logging - from socketdev.core.api import API from socketdev.dependencies import Dependencies from socketdev.export import Export @@ -18,6 +16,7 @@ from socketdev.triage import Triage from socketdev.utils import Utils, IntegrationType, INTEGRATION_TYPES from socketdev.version import __version__ +from socketdev.log import log __author__ = "socket.dev" @@ -30,8 +29,7 @@ api_url = "https://api.socket.dev/v0" request_timeout = 1200 -log = logging.getLogger("socketdev") -log.addHandler(logging.NullHandler()) + # TODO: Add debug flag to constructor to enable verbose error logging for API response parsing. diff --git a/socketdev/core/api.py b/socketdev/core/api.py index 082066d..4f2faa3 100644 --- a/socketdev/core/api.py +++ b/socketdev/core/api.py @@ -1,4 +1,6 @@ import base64 +from socketdev.log import log + import requests from socketdev.core.classes import Response from socketdev.exceptions import ( @@ -68,17 +70,21 @@ def format_headers(headers_dict): try: error_message = response.json().get("error", {}).get("message", "") if "Insufficient permissions for API method" in error_message: - raise APIInsufficientPermissions(f"{error_message}{path_str}{headers_str}") + log.error(f"{error_message}{path_str}{headers_str}") + raise APIInsufficientPermissions() elif "Organization not allowed" in error_message: - raise APIOrganizationNotAllowed(f"{error_message}{path_str}{headers_str}") + log.error(f"{error_message}{path_str}{headers_str}") + raise APIOrganizationNotAllowed() elif "Insufficient max quota" in error_message: - raise APIInsufficientQuota(f"{error_message}{path_str}{headers_str}") + log.error(f"{error_message}{path_str}{headers_str}") + raise APIInsufficientQuota() else: raise APIAccessDenied(f"{error_message or 'Access denied'}{path_str}{headers_str}") except ValueError: raise APIAccessDenied(f"Access denied{path_str}{headers_str}") if response.status_code == 404: - raise APIResourceNotFound(f"Path not found {path}{path_str}{headers_str}") + log.error(f"Path not found {path}{path_str}{headers_str}") + raise APIResourceNotFound() if response.status_code == 429: retry_after = response.headers.get("retry-after") if retry_after: @@ -91,23 +97,28 @@ def format_headers(headers_dict): time_msg = f" Retry after: {retry_after}" else: time_msg = "" - raise APIInsufficientQuota(f"Insufficient quota for API route.{time_msg}{path_str}{headers_str}") + log.error(f"Insufficient quota for API route.{time_msg}{path_str}{headers_str}") + raise APIInsufficientQuota() if response.status_code == 502: - raise APIBadGateway(f"Upstream server error{path_str}{headers_str}") + log.error(f"Upstream server error{path_str}{headers_str}") + raise APIBadGateway() if response.status_code >= 400: - raise APIFailure( - f"Bad Request: HTTP original_status_code:{response.status_code}{path_str}{headers_str}", - status_code=500, + error = ( + f"Bad Request: HTTP original_status_code:{response.status_code}{path_str}{headers_str}" ) + log.error(error) + raise APIFailure() return response except Timeout: request_duration = time.time() - start_time - raise APITimeout(f"Request timed out after {request_duration:.2f} seconds") + log.error(f"Request timed out after {request_duration:.2f} seconds") + raise APITimeout() except ConnectionError as error: request_duration = time.time() - start_time - raise APIConnectionError(f"Connection error after {request_duration:.2f} seconds: {error}") + log.error(f"Connection error after {request_duration:.2f} seconds: {error}") + raise APIConnectionError() except ( APIAccessDenied, APIInsufficientQuota, @@ -123,4 +134,5 @@ def format_headers(headers_dict): raise except Exception as error: # Only truly unexpected errors get wrapped in a generic APIFailure - raise APIFailure(f"Unexpected error: {error}", status_code=500) + log.error(f"Unexpected error: {error}") + raise APIFailure() diff --git a/socketdev/log.py b/socketdev/log.py new file mode 100644 index 0000000..4eb155d --- /dev/null +++ b/socketdev/log.py @@ -0,0 +1,4 @@ +import logging + +log = logging.getLogger("socketdev") +log.addHandler(logging.NullHandler()) \ No newline at end of file From 473ff9913ec727b80a1960b44749050d04490532 Mon Sep 17 00:00:00 2001 From: Douglas Coburn Date: Mon, 24 Mar 2025 13:35:41 -0700 Subject: [PATCH 2/2] Update version for deploy --- socketdev/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/socketdev/version.py b/socketdev/version.py index 0610187..2ae4933 100644 --- a/socketdev/version.py +++ b/socketdev/version.py @@ -1 +1 @@ -__version__ = "2.0.13" +__version__ = "2.0.14"