"""ApiContext: per-scenario HTTP state for the API module."""from__future__importannotationsfromdataclassesimportdataclass,fieldfromtypingimportAnyfromsteplib.modules.api.clientimportHTTPClient,Request,Response,UrllibHTTPClient
[docs]@dataclassclassApiContext:"""Holds all HTTP state for a scenario. Lives at ``context.steplib.api`` and is reset between scenarios. Attributes: client: The HTTP client implementation (defaults to ``UrllibHTTPClient``). base_url: The base URL for resolving relative URLs. default_headers: Headers sent with every request. query_params: Default query parameters sent with every request. auth: Optional ``(username, password)`` tuple for basic auth. cookies: Cookies sent with every request. timeout: Request timeout in seconds (``None`` = no timeout). allow_redirects: Whether to follow redirects (default ``True``). ssl_verify: Whether to verify SSL certificates (default ``True``). proxies: Proxy mappings (e.g. ``{"http": "http://proxy:8080"}``). last_request: The most recent ``Request`` sent. last_response: The most recent ``Response`` received. variables: User-defined variables stored by steps. backend: The backend name (e.g. ``"stdlib"``, ``"httpx"``). """client:HTTPClient|None=Nonebase_url:str=""default_headers:dict[str,str]=field(default_factory=dict)query_params:dict[str,str]=field(default_factory=dict)auth:tuple[str,str]|None=Nonecookies:dict[str,str]=field(default_factory=dict)timeout:float|None=Noneallow_redirects:bool=Truessl_verify:bool=Trueproxies:dict[str,str]=field(default_factory=dict)last_request:Request|None=Nonelast_response:Response|None=Nonevariables:dict[str,Any]=field(default_factory=dict)backend:str="stdlib"def__post_init__(self)->None:"""Initialize a default client if none was provided."""ifself.clientisNone:self.client=UrllibHTTPClient()
[docs]defreset(self)->None:"""Reset per-scenario state, keeping the client and configuration."""self.default_headers={}self.query_params={}self.auth=Noneself.cookies={}self.timeout=Noneself.allow_redirects=Trueself.ssl_verify=Trueself.proxies={}self.last_request=Noneself.last_response=Noneself.variables={}
[docs]defcleanup(self)->None:"""Close any resources held by the client."""ifself.clientisnotNoneandhasattr(self.client,"close"):close=getattr(self.client,"close",None)ifcallable(close):close()