mirror of
https://github.com/BerriAI/litellm.git
synced 2026-11-11 08:38:24 +00:00
fix(proxy): case-insensitive User-Agent header lookup in _get_user_agent_tags
Header names are not case-sensitive, so a client sending "User-Agent" was untagged while "user-agent" was tagged. Look the header up case-insensitively and early-return on non-dict headers instead of nesting the whole body. Test moved to tests/unit/litellm_core_utils/ after #43199.
This commit is contained in:
parent
29edcee9eb
commit
4d5924dbaf
2 changed files with 35 additions and 15 deletions
|
|
@ -7062,21 +7062,23 @@ class StandardLoggingPayloadSetup:
|
|||
return None
|
||||
user_agent_tags: list[str] | None = None
|
||||
headers: Final = proxy_server_request.get("headers", {})
|
||||
if headers is not None and isinstance(headers, dict):
|
||||
request_headers: Final = cast( # cast-ok: request headers are untyped framework data
|
||||
dict[str, str | None], headers
|
||||
)
|
||||
if "user-agent" in request_headers:
|
||||
user_agent: Final = request_headers["user-agent"]
|
||||
if user_agent is not None:
|
||||
if user_agent_tags is None:
|
||||
user_agent_tags = []
|
||||
user_agent_part: str | None = None
|
||||
if "/" in user_agent:
|
||||
user_agent_part = user_agent.split("/")[0]
|
||||
if user_agent_part is not None:
|
||||
user_agent_tags.append("User-Agent: " + user_agent_part)
|
||||
user_agent_tags.append("User-Agent: " + user_agent)
|
||||
if not isinstance(headers, dict):
|
||||
return None
|
||||
# Header names are case-insensitive: a client that sends "User-Agent"
|
||||
# or "USER-AGENT" must still be tagged (#40979).
|
||||
user_agent: Final = next(
|
||||
(v for k, v in headers.items() if str(k).lower() == "user-agent"),
|
||||
None,
|
||||
)
|
||||
if user_agent is not None:
|
||||
if user_agent_tags is None:
|
||||
user_agent_tags = []
|
||||
user_agent_part: str | None = None
|
||||
if "/" in user_agent:
|
||||
user_agent_part = user_agent.split("/")[0]
|
||||
if user_agent_part is not None:
|
||||
user_agent_tags.append("User-Agent: " + user_agent_part)
|
||||
user_agent_tags.append("User-Agent: " + user_agent)
|
||||
return user_agent_tags
|
||||
|
||||
@staticmethod
|
||||
|
|
|
|||
|
|
@ -3386,6 +3386,24 @@ def test_get_user_agent_tags():
|
|||
assert "User-Agent: litellm" in tags
|
||||
assert "User-Agent: litellm/0.1.0" in tags
|
||||
|
||||
# Header names are case-insensitive ("User-Agent" vs "user-agent").
|
||||
tags_capitalized = StandardLoggingPayloadSetup._get_user_agent_tags(
|
||||
proxy_server_request={
|
||||
"headers": {
|
||||
"User-Agent": "curl/7.68.0",
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
assert tags_capitalized is not None
|
||||
assert "User-Agent: curl" in tags_capitalized
|
||||
assert "User-Agent: curl/7.68.0" in tags_capitalized
|
||||
|
||||
# Non-dict headers must not raise; the function early-returns.
|
||||
assert StandardLoggingPayloadSetup._get_user_agent_tags(
|
||||
proxy_server_request={"headers": None}
|
||||
) is None
|
||||
|
||||
|
||||
def test_get_request_tags():
|
||||
from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue