Skip to content

http_tracker

appimage_updater.instrumentation.http_tracker

HTTP request tracking and analysis for detecting duplicate requests.

HTTPRequestRecord(method, url, timestamp, call_stack=list(), headers=dict(), params=dict(), response_status=None, response_time=None, error=None) dataclass

Record of an HTTP request with call stack information.

call_stack = field(default_factory=list) class-attribute instance-attribute

error = None class-attribute instance-attribute

headers = field(default_factory=dict) class-attribute instance-attribute

method instance-attribute

params = field(default_factory=dict) class-attribute instance-attribute

response_status = None class-attribute instance-attribute

response_time = None class-attribute instance-attribute

timestamp instance-attribute

url instance-attribute

HTTPTracker(stack_depth=3, track_headers=False, logger=None)

Tracks HTTP requests made during application execution.

Parameters:

Name Type Description Default
stack_depth int

Number of stack frames to capture for call stack

3
track_headers bool

Whether to track request headers

False
logger Any

HTTP logger interface (defaults to ConfigurableHTTPLogger)

None
Source code in src/appimage_updater/instrumentation/http_tracker.py
def __init__(self, stack_depth: int = 3, track_headers: bool = False, logger: Any = None):
    """Initialize HTTP request tracker.

    Args:
        stack_depth: Number of stack frames to capture for call stack
        track_headers: Whether to track request headers
        logger: HTTP logger interface (defaults to ConfigurableHTTPLogger)
    """
    self.stack_depth = stack_depth
    self.track_headers = track_headers
    self.requests: list[HTTPRequestRecord] = []
    self._original_request: Any = None
    self._patcher: Any = None

    # Set up logger with dependency injection
    if logger is None:
        self._logger = create_default_http_logger()
    else:
        self._logger = logger

requests = [] instance-attribute

stack_depth = stack_depth instance-attribute

track_headers = track_headers instance-attribute

start_tracking()

Start tracking HTTP requests.

Source code in src/appimage_updater/instrumentation/http_tracker.py
def start_tracking(self) -> None:
    """Start tracking HTTP requests."""
    if self._patcher:
        self._logger.warning("HTTP tracking is already active")
        return

    self._logger.log_tracking_start(f"Starting HTTP request tracking (stack depth: {self.stack_depth})")

    # Store original method and create wrapper
    self._original_request = httpx.AsyncClient.request

    # Create a wrapper that captures the self parameter
    async def request_wrapper(client_self: Any, method: str, url: str, **kwargs: Any) -> Any:
        return await self._tracked_request(client_self, method, url, **kwargs)

    # Patch the method (type: ignore for monkey patching)
    httpx.AsyncClient.request = request_wrapper  # type: ignore[method-assign,assignment]
    self._patcher = True  # Just use as a flag

stop_tracking()

Stop tracking HTTP requests.

Source code in src/appimage_updater/instrumentation/http_tracker.py
def stop_tracking(self) -> None:
    """Stop tracking HTTP requests."""
    if not self._patcher:
        self._logger.warning("HTTP tracking is not active")
        return

    self._logger.log_tracking_stop("Stopping HTTP request tracking")

    # Restore original method
    if self._original_request:
        httpx.AsyncClient.request = self._original_request  # type: ignore[method-assign]
    self._patcher = None
    self._original_request = None