Source code for simple_openid_connect.utils
"""
Internal utilities
"""
from typing import Iterator
from simple_openid_connect.exceptions import ValidationError
[docs]
def is_application_json(content_type: str) -> bool:
"""
Whether the given content type is `application/json`.
This is needed because mime types can contain additional options which are ignored here.
"""
main_type = _parse_header(content_type)
return main_type == "application/json"
[docs]
def validate_that(condition: bool, msg: str) -> None:
"""
Validate that the given condition is true, raising a ValidationError with the given message if it is not.
This is implemented to write concise validating assertions.
:raises ValidationError: if the condition is false
"""
if not condition:
raise ValidationError(msg)
def _parse_header(line: str) -> str:
"""Parse a Content-type like header.
Return the main content-type.
"""
# Adapted from https://github.com/python/cpython/blob/3.12/Lib/cgi.py#L238
# by adding type hints and removing the parsing of additional mime type options.
return _parseparam(";" + line).__next__()
def _parseparam(s: str) -> Iterator[str]:
# Adapted from https://github.com/python/cpython/blob/3.12/Lib/cgi.py#L226
# by adding type hints.
while s[:1] == ";":
s = s[1:]
end = s.find(";")
while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2:
end = s.find(";", end + 1)
if end < 0:
end = len(s)
f = s[:end]
yield f.strip()
s = s[end:]