importjsonfromtypingimportAny,Dict,Unionfromurllib.parseimportparse_qsfrompyechonext.configimportSettingsfrompyechonext.loggingimportloggerdef_build_get_params_dict(raw_params:str)->dict:"""Build GET params dictionary Args: raw_params (str): raw params string Returns: dict: GET params """returnparse_qs(raw_params)def_build_post_params_dict(raw_params:bytes)->dict:"""Build POST params dictionary Args: raw_params (bytes): raw parameters Returns: dict: POST params """try:raw_params=json.loads(raw_params)exceptjson.decoder.JSONDecodeError:raw_params=raw_params.decode()else:returnraw_paramsreturnparse_qs(raw_params)
[docs]classRequest:""" This class describes a request. """__slots__=("environ","settings","method","path","GET","POST","user_agent","extra",)
[docs]def__init__(self,environ:dict={},settings:Settings=None):"""Constructs a new request Args: environ (dict, optional): environ info. Defaults to {}. settings (Settings, optional): settings of app. Defaults to None. """self.environ:Dict[str,Any]=environself.settings:Settings=settingsself.method:str=self.environ.get("REQUEST_METHOD")self.path:str=self.environ.get("PATH_INFO")self.GET:Dict[Any,Any]=_build_get_params_dict(self.environ.get("QUERY_STRING"))self.POST:Dict[Any,Any]=_build_post_params_dict(self.environ.get("wsgi.input").read())self.user_agent:str=self.environ.get("HTTP_USER_AGENT")self.extra:Dict[Any,Any]={}logger.debug(f"New request created: {self.method}{self.path}")
def__getattr__(self,item:Any)->Union[Any,None]:"""Magic method for get attrs (from extra) Args: item (Any): item key Returns: Union[Any, None]: value """returnself.extra.get(item,None)