Spaces:
Running
Running
File size: 1,590 Bytes
bdc2878 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | """Reverse pipeline result classifier.
Maps upstream HTTP status codes and response bodies to a ResultCategory.
"""
from typing import Any
from app.dataplane.reverse.protocol.xai_usage import is_invalid_credentials_body
from .types import ResultCategory
def classify_result(
status_code: int,
body: str = "",
*,
payload: Any = None,
) -> ResultCategory:
"""Classify an upstream response into a ResultCategory.
``body`` is the raw response body (or first ~400 chars for error responses).
``payload`` is the parsed JSON, if available.
"""
if status_code == 200:
return ResultCategory.SUCCESS
if status_code == 429:
return ResultCategory.RATE_LIMITED
if status_code == 401:
return ResultCategory.AUTH_FAILURE
if status_code == 400 and is_invalid_credentials_body(body):
return ResultCategory.AUTH_FAILURE
if status_code == 403:
# Known blocked/invalid account markers take precedence.
if is_invalid_credentials_body(body):
return ResultCategory.AUTH_FAILURE
# Check if the body indicates a Cloudflare challenge.
if body and ("cf-challenge" in body.lower() or "cloudflare" in body.lower()):
return ResultCategory.FORBIDDEN
# Generic 403 (suspension, WAF, etc.) — not a credential issue.
return ResultCategory.FORBIDDEN
if status_code == 404:
return ResultCategory.NOT_FOUND
if status_code >= 500:
return ResultCategory.UPSTREAM_5XX
return ResultCategory.UNKNOWN
__all__ = ["classify_result"]
|