def get_header(self, name, required=False, default=None, _name_cache={}): """Retrieve the raw string value for the given header. Args: name (str): Header name, case-insensitive (e.g., 'Content-Type') Keyword Args: required (bool): Set to ``True`` to raise ``HTTPBadRequest`` instead of returning gracefully when the header is not found (default ``False``). default (any): Value to return if the header is not found (default ``None``). Returns: str: The value of the specified header if it exists, or the default value if the header is not found and is not required. Raises: HTTPBadRequest: The header was not found in the request, but it was required. """ try: asgi_name = _name_cache[name] except KeyError: asgi_name = name.lower().encode('latin1') if len(_name_cache ) < 64: # Somewhat arbitrary ceiling to mitigate abuse _name_cache[name] = asgi_name # Use try..except to optimize for the header existing in most cases try: # Don't take the time to cache beforehand, using HTTP naming. # This will be faster, assuming that most headers are looked # up only once, and not all headers will be requested. return self._asgi_headers[asgi_name].decode('latin1') except KeyError: if not required: return default raise errors.HTTPMissingHeader(name)
def get_header(self, name, required=False): """Retrieve the raw string value for the given header. Args: name (str): Header name, case-insensitive (e.g., 'Content-Type') required (bool, optional): Set to ``True`` to raise ``HTTPBadRequest`` instead of returning gracefully when the header is not found (default ``False``). Returns: str: The value of the specified header if it exists, or ``None`` if the header is not found and is not required. Raises: HTTPBadRequest: The header was not found in the request, but it was required. """ wsgi_name = name.upper().replace('-', '_') # Use try..except to optimize for the header existing in most cases try: # Don't take the time to cache beforehand, using HTTP naming. # This will be faster, assuming that most headers are looked # up only once, and not all headers will be requested. return self.env['HTTP_' + wsgi_name] except KeyError: # NOTE(kgriffs): There are a couple headers that do not # use the HTTP prefix in the env, so try those. We expect # people to usually just use the relevant helper properties # to access these instead of .get_header. if wsgi_name in WSGI_CONTENT_HEADERS: try: return self.env[wsgi_name] except KeyError: pass if not required: return None raise errors.HTTPMissingHeader(name)