2023-02-26 07:50:35 +08:00
|
|
|
from urllib import parse
|
|
|
|
|
|
|
|
class DivaRequestParseException(Exception):
|
|
|
|
"""
|
|
|
|
Exception raised when there is a fault in parsing a diva request,
|
|
|
|
either due to a malformed request, or missing required items
|
|
|
|
"""
|
|
|
|
def __init__(self, message: str) -> None:
|
|
|
|
self.message = message
|
|
|
|
super().__init__(self.message)
|
|
|
|
|
|
|
|
class BaseRequest:
|
|
|
|
def __init__(self, raw: str) -> None:
|
|
|
|
self.raw = dict(parse.parse_qsl(raw))
|
|
|
|
|
|
|
|
if 'cmd' not in self.raw:
|
|
|
|
raise DivaRequestParseException(f"cmd not in request data {self.raw}")
|
|
|
|
self.cmd = raw['cmd']
|
|
|
|
|
|
|
|
if 'req_id' not in self.raw:
|
|
|
|
raise DivaRequestParseException(f"req_id not in request data {self.raw}")
|
|
|
|
self.req_id = raw['req_id']
|
|
|
|
|
|
|
|
class BaseResponse:
|
|
|
|
def __init__(self, cmd_id: str, req_id: int) -> None:
|
|
|
|
self.cmd = cmd_id
|
|
|
|
self.req_id = req_id
|
|
|
|
self.stat = "ok"
|
|
|
|
|
|
|
|
def make(self) -> str:
|
|
|
|
all_vars = vars(self)
|
|
|
|
all_vars.pop('cmd')
|
|
|
|
all_vars.pop('req_id')
|
|
|
|
|
|
|
|
ret = f"cmd={self.cmd}&req_id={self.req_id}"
|
2023-02-26 08:12:48 +08:00
|
|
|
ret += parse.urlencode(all_vars, doseq=True, quote_via=parse.quote, safe=",")
|
2023-02-26 07:50:35 +08:00
|
|
|
|
|
|
|
return ret
|