On this page
Internal ASGI scope helpers that read request headers and cookies with a single case-insensitive linear scan, shared across middleware.
#src.fastware._scope
#src.fastware._scope
Scope-level header and cookie access shared across the ASGI layer.
ASGI headers arrive on the scope as a list of (name, value) byte tuples, with names lowercased per the ASGI spec. These helpers read them with a single linear scan -- never allocating a dict of all headers just to read one -- and are the single implementation used by the request wrapper (:mod:fastware.request), the auth/CSRF middleware (:mod:fastware.auth), and the pure-ASGI middleware (:mod:fastware.middleware).
Matching is case-insensitive: callers pass a lowercase name, and scope keys are case-folded before comparison so a non-compliant server that emits mixed-case header names still matches.
#_first_header
def _first_header(scope: Scope, name: bytes) -> bytes | NoneReturn the first raw value for header name, or None if absent.
Distinguishing "absent" from "present but empty" is why this returns None rather than b"" -- :func:header_str needs it to honor a caller-supplied default only when the header is truly missing.
#header_bytes
def header_bytes(scope: Scope, name: bytes) -> bytesReturn the first value of header name (lowercase bytes), or b"".
#header_str
def header_str(scope: Scope, name: str, default: str | None=None) -> str | NoneReturn header name decoded as latin-1, or default if absent.
ASGI header values are opaque bytes; latin-1 is the lossless byte<->str mapping used throughout the HTTP layer.
#cookies
def cookies(scope: Scope) -> dict[str, str]Parse the Cookie header into a name->value dict ({} if none).
#cookie
def cookie(scope: Scope, name: str, default: str='') -> strReturn a single cookie value by name, or default if absent.