Source code for runtimepy.net.http.header
"""
A module implementing interfaces for HTTP headers.
"""
# built-in
import http
from io import StringIO
import logging
# third-party
from vcorelib.logging import LoggerType
# internal
from runtimepy.net.http.common import (
HEADER_LINESEP,
HeadersMixin,
HTTPMethodlike,
normalize_method,
)
from runtimepy.net.http.request_target import RequestTarget
from runtimepy.net.http.version import (
DEFAULT_MAJOR,
DEFAULT_MINOR,
HttpVersion,
)
[docs]
class RequestHeader(HeadersMixin):
"""A class implementing an HTTP-request header."""
def __init__(
self,
method: HTTPMethodlike = http.HTTPMethod.GET,
target: str = "/",
major: int = DEFAULT_MAJOR,
minor: int = DEFAULT_MINOR,
) -> None:
"""Initialize this instance."""
self.method = normalize_method(method)
self.target = RequestTarget(self.method, target)
self.version = HttpVersion.create(major, minor)
HeadersMixin.__init__(self)
[docs]
def from_lines(self, lines: list[str]) -> None:
"""Update this request from line data."""
assert lines
method_raw, request_target_raw, version_raw = lines[0].split(" ")
self.method = normalize_method(method_raw)
self.target = RequestTarget(self.method, request_target_raw)
self.version = HttpVersion(version_raw)
HeadersMixin.__init__(self, lines[1:])
[docs]
def log(
self,
logger: LoggerType,
out: bool,
level: int = logging.DEBUG,
**_,
) -> None:
"""Log information about this request header."""
logger.log(
level,
"(%s request) %s - %s",
"outgoing" if out else "incoming",
self.request_line,
self.headers,
)
@property
def request_line(self) -> str:
"""Get this response's status line."""
return " ".join([self.method, str(self.target.raw), str(self.version)])
def __str__(self) -> str:
"""Get this request as a string."""
with StringIO() as stream:
stream.write(self.request_line)
stream.write(HEADER_LINESEP)
self.write_field_lines(stream)
stream.write(HEADER_LINESEP)
return stream.getvalue()