teoat commited on
Commit
cabd3bf
·
verified ·
1 Parent(s): 71af2e7

Upload core/error_enforcement.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. core/error_enforcement.py +68 -16
core/error_enforcement.py CHANGED
@@ -71,7 +71,9 @@ class ErrorResponseMiddleware(BaseHTTPMiddleware):
71
  except (json.JSONDecodeError, AttributeError, KeyError):
72
  return False
73
 
74
- def _handle_http_exception(self, request: Request, exc: HTTPException) -> JSONResponse:
 
 
75
  """Handle HTTPException with standardized response"""
76
  # Determine error type based on status code
77
  error_type = self._get_error_type_from_status(exc.status_code)
@@ -97,9 +99,15 @@ class ErrorResponseMiddleware(BaseHTTPMiddleware):
97
  request=request,
98
  )
99
 
100
- return JSONResponse(status_code=exc.status_code, content=error_response, headers=self._get_security_headers())
 
 
 
 
101
 
102
- def _handle_starlette_exception(self, request: Request, exc: StarletteHTTPException) -> JSONResponse:
 
 
103
  """Handle Starlette HTTPException with standardized response"""
104
  error_type = self._get_error_type_from_status(exc.status_code)
105
 
@@ -124,9 +132,15 @@ class ErrorResponseMiddleware(BaseHTTPMiddleware):
124
  request=request,
125
  )
126
 
127
- return JSONResponse(status_code=exc.status_code, content=error_response, headers=self._get_security_headers())
 
 
 
 
128
 
129
- def _handle_unexpected_exception(self, request: Request, exc: Exception) -> JSONResponse:
 
 
130
  """Handle unexpected exceptions with standardized response"""
131
  # Log the full error
132
  error_details = {
@@ -166,7 +180,11 @@ class ErrorResponseMiddleware(BaseHTTPMiddleware):
166
  request=request,
167
  )
168
 
169
- return JSONResponse(status_code=500, content=error_response, headers=self._get_security_headers())
 
 
 
 
170
 
171
  def _get_error_type_from_status(self, status_code: int) -> str:
172
  """Map HTTP status codes to error types"""
@@ -221,7 +239,9 @@ class ValidationErrorMiddleware(BaseHTTPMiddleware):
221
 
222
  return isinstance(exc, (ValidationError, RequestValidationError))
223
 
224
- def _handle_validation_error(self, request: Request, exc: Exception) -> JSONResponse:
 
 
225
  """Handle validation errors with detailed response"""
226
  from fastapi.exceptions import RequestValidationError
227
  from pydantic import ValidationError
@@ -275,7 +295,11 @@ class ValidationErrorMiddleware(BaseHTTPMiddleware):
275
  details=validation_details,
276
  )
277
 
278
- return JSONResponse(status_code=422, content=error_response, headers=self._get_security_headers())
 
 
 
 
279
 
280
  def _get_security_headers(self) -> Dict[str, str]:
281
  """Get security headers for validation error responses"""
@@ -298,14 +322,34 @@ class BusinessErrorMiddleware(BaseHTTPMiddleware):
298
  super().__init__(app)
299
  self._business_error_mapping = {
300
  "UserNotFoundError": (404, "user_not_found", "User not found"),
301
- "InvalidCredentialsError": (401, "invalid_credentials", "Invalid credentials"),
 
 
 
 
302
  "AccountLockedError": (423, "account_locked", "Account is locked"),
303
- "InsufficientPermissionsError": (403, "insufficient_permissions", "Insufficient permissions"),
 
 
 
 
304
  "ResourceNotFoundError": (404, "resource_not_found", "Resource not found"),
305
  "ResourceConflictError": (409, "resource_conflict", "Resource conflict"),
306
- "BusinessRuleViolationError": (422, "business_rule_violation", "Business rule violation"),
307
- "RateLimitExceededError": (429, "rate_limit_exceeded", "Rate limit exceeded"),
308
- "ServiceUnavailableError": (503, "service_unavailable", "Service temporarily unavailable"),
 
 
 
 
 
 
 
 
 
 
 
 
309
  }
310
 
311
  async def dispatch(self, request: Request, call_next):
@@ -320,9 +364,13 @@ class BusinessErrorMiddleware(BaseHTTPMiddleware):
320
  # Let other errors be handled by other middleware
321
  raise
322
 
323
- def _handle_business_error(self, request: Request, exc: Exception, error_name: str) -> JSONResponse:
 
 
324
  """Handle known business errors with standardized response"""
325
- status_code, error_type, default_message = self._business_error_mapping[error_name]
 
 
326
 
327
  # Use exception message if available, otherwise use default
328
  detail = str(exc) if str(exc) else default_message
@@ -348,7 +396,11 @@ class BusinessErrorMiddleware(BaseHTTPMiddleware):
348
  request=request,
349
  )
350
 
351
- return JSONResponse(status_code=status_code, content=error_response, headers=self._get_security_headers())
 
 
 
 
352
 
353
  def _get_security_headers(self) -> Dict[str, str]:
354
  """Get security headers for business error responses"""
 
71
  except (json.JSONDecodeError, AttributeError, KeyError):
72
  return False
73
 
74
+ def _handle_http_exception(
75
+ self, request: Request, exc: HTTPException
76
+ ) -> JSONResponse:
77
  """Handle HTTPException with standardized response"""
78
  # Determine error type based on status code
79
  error_type = self._get_error_type_from_status(exc.status_code)
 
99
  request=request,
100
  )
101
 
102
+ return JSONResponse(
103
+ status_code=exc.status_code,
104
+ content=error_response,
105
+ headers=self._get_security_headers(),
106
+ )
107
 
108
+ def _handle_starlette_exception(
109
+ self, request: Request, exc: StarletteHTTPException
110
+ ) -> JSONResponse:
111
  """Handle Starlette HTTPException with standardized response"""
112
  error_type = self._get_error_type_from_status(exc.status_code)
113
 
 
132
  request=request,
133
  )
134
 
135
+ return JSONResponse(
136
+ status_code=exc.status_code,
137
+ content=error_response,
138
+ headers=self._get_security_headers(),
139
+ )
140
 
141
+ def _handle_unexpected_exception(
142
+ self, request: Request, exc: Exception
143
+ ) -> JSONResponse:
144
  """Handle unexpected exceptions with standardized response"""
145
  # Log the full error
146
  error_details = {
 
180
  request=request,
181
  )
182
 
183
+ return JSONResponse(
184
+ status_code=500,
185
+ content=error_response,
186
+ headers=self._get_security_headers(),
187
+ )
188
 
189
  def _get_error_type_from_status(self, status_code: int) -> str:
190
  """Map HTTP status codes to error types"""
 
239
 
240
  return isinstance(exc, (ValidationError, RequestValidationError))
241
 
242
+ def _handle_validation_error(
243
+ self, request: Request, exc: Exception
244
+ ) -> JSONResponse:
245
  """Handle validation errors with detailed response"""
246
  from fastapi.exceptions import RequestValidationError
247
  from pydantic import ValidationError
 
295
  details=validation_details,
296
  )
297
 
298
+ return JSONResponse(
299
+ status_code=422,
300
+ content=error_response,
301
+ headers=self._get_security_headers(),
302
+ )
303
 
304
  def _get_security_headers(self) -> Dict[str, str]:
305
  """Get security headers for validation error responses"""
 
322
  super().__init__(app)
323
  self._business_error_mapping = {
324
  "UserNotFoundError": (404, "user_not_found", "User not found"),
325
+ "InvalidCredentialsError": (
326
+ 401,
327
+ "invalid_credentials",
328
+ "Invalid credentials",
329
+ ),
330
  "AccountLockedError": (423, "account_locked", "Account is locked"),
331
+ "InsufficientPermissionsError": (
332
+ 403,
333
+ "insufficient_permissions",
334
+ "Insufficient permissions",
335
+ ),
336
  "ResourceNotFoundError": (404, "resource_not_found", "Resource not found"),
337
  "ResourceConflictError": (409, "resource_conflict", "Resource conflict"),
338
+ "BusinessRuleViolationError": (
339
+ 422,
340
+ "business_rule_violation",
341
+ "Business rule violation",
342
+ ),
343
+ "RateLimitExceededError": (
344
+ 429,
345
+ "rate_limit_exceeded",
346
+ "Rate limit exceeded",
347
+ ),
348
+ "ServiceUnavailableError": (
349
+ 503,
350
+ "service_unavailable",
351
+ "Service temporarily unavailable",
352
+ ),
353
  }
354
 
355
  async def dispatch(self, request: Request, call_next):
 
364
  # Let other errors be handled by other middleware
365
  raise
366
 
367
+ def _handle_business_error(
368
+ self, request: Request, exc: Exception, error_name: str
369
+ ) -> JSONResponse:
370
  """Handle known business errors with standardized response"""
371
+ status_code, error_type, default_message = self._business_error_mapping[
372
+ error_name
373
+ ]
374
 
375
  # Use exception message if available, otherwise use default
376
  detail = str(exc) if str(exc) else default_message
 
396
  request=request,
397
  )
398
 
399
+ return JSONResponse(
400
+ status_code=status_code,
401
+ content=error_response,
402
+ headers=self._get_security_headers(),
403
+ )
404
 
405
  def _get_security_headers(self) -> Dict[str, str]:
406
  """Get security headers for business error responses"""