mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 18:54:30 +00:00
(proxy perf) - only read request body 1 time per request (#7728)
* req body * fix linting
This commit is contained in:
parent
feee37e37f
commit
36c2883f6e
1 changed files with 37 additions and 6 deletions
|
@ -21,26 +21,35 @@ async def _read_request_body(request: Optional[Request]) -> Dict:
|
||||||
try:
|
try:
|
||||||
if request is None:
|
if request is None:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
# Check if we already read and parsed the body
|
||||||
|
_cached_request_body: Optional[dict] = _safe_get_request_parsed_body(
|
||||||
|
request=request
|
||||||
|
)
|
||||||
|
if _cached_request_body is not None:
|
||||||
|
return _cached_request_body
|
||||||
|
|
||||||
_request_headers: dict = _safe_get_request_headers(request=request)
|
_request_headers: dict = _safe_get_request_headers(request=request)
|
||||||
content_type = _request_headers.get("content-type", "")
|
content_type = _request_headers.get("content-type", "")
|
||||||
|
|
||||||
if "form" in content_type:
|
if "form" in content_type:
|
||||||
return dict(await request.form())
|
parsed_body = dict(await request.form())
|
||||||
else:
|
else:
|
||||||
# Read the request body
|
# Read the request body
|
||||||
body = await request.body()
|
body = await request.body()
|
||||||
|
|
||||||
# Return empty dict if body is empty or None
|
# Return empty dict if body is empty or None
|
||||||
if not body:
|
if not body:
|
||||||
return {}
|
parsed_body = {}
|
||||||
|
parsed_body = orjson.loads(body)
|
||||||
|
|
||||||
# Attempt JSON parsing (safe for untrusted input)
|
# Cache the parsed result
|
||||||
return orjson.loads(body)
|
_safe_set_request_parsed_body(request=request, parsed_body=parsed_body)
|
||||||
|
return parsed_body
|
||||||
|
|
||||||
except (json.JSONDecodeError, orjson.JSONDecodeError):
|
except (json.JSONDecodeError, orjson.JSONDecodeError):
|
||||||
# Log detailed information for debugging
|
|
||||||
verbose_proxy_logger.exception("Invalid JSON payload received.")
|
verbose_proxy_logger.exception("Invalid JSON payload received.")
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# Catch unexpected errors to avoid crashes
|
# Catch unexpected errors to avoid crashes
|
||||||
verbose_proxy_logger.exception(
|
verbose_proxy_logger.exception(
|
||||||
|
@ -49,6 +58,28 @@ async def _read_request_body(request: Optional[Request]) -> Dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
def _safe_get_request_parsed_body(request: Optional[Request]) -> Optional[dict]:
|
||||||
|
if request is None:
|
||||||
|
return None
|
||||||
|
if hasattr(request, "state") and hasattr(request.state, "parsed_body"):
|
||||||
|
return request.state.parsed_body
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _safe_set_request_parsed_body(
|
||||||
|
request: Optional[Request],
|
||||||
|
parsed_body: dict,
|
||||||
|
) -> None:
|
||||||
|
try:
|
||||||
|
if request is None:
|
||||||
|
return
|
||||||
|
request.state.parsed_body = parsed_body
|
||||||
|
except Exception as e:
|
||||||
|
verbose_proxy_logger.debug(
|
||||||
|
"Unexpected error setting request parsed body - {}".format(e)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _safe_get_request_headers(request: Optional[Request]) -> dict:
|
def _safe_get_request_headers(request: Optional[Request]) -> dict:
|
||||||
"""
|
"""
|
||||||
[Non-Blocking] Safely get the request headers
|
[Non-Blocking] Safely get the request headers
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue