diff --git a/appPublic/httpclient.py b/appPublic/httpclient.py index 8b2acc0..6f9e985 100755 --- a/appPublic/httpclient.py +++ b/appPublic/httpclient.py @@ -8,6 +8,17 @@ RESPONSE_JSON = 2 RESPONSE_FILE = 3 RESPONSE_STREAM = 4 +class HttpError(Exception): + def __init__(self, code, msg, *args, **kw): + super().__init__(*msg, **kw) + self.code = code + self.msg = msg + def __str__(self): + return f"Error Code:{self.code}, {self.msg}" + + def __expr__(self): + return str(self) + class HttpClient: def __init__(self,coding='utf-8'): self.coding = coding @@ -83,7 +94,8 @@ class HttpClient: headers=headers, **kw) if resp.status==200: return await self.handleResp(url, resp, response_type, stream_func=stream_func) - raise Exception(f'http error({resp.status}, {url=},{params=}, {data=}, {jd=}, {headers=}, {kw=})') + msg = f'http error({resp.status}, {url=},{params=}, {data=}, {jd=}, {headers=}, {kw=})' + raise HttpError(resp.status, msg) async def get(self,url,**kw): return self.request(url, 'GET', **kw) diff --git a/appPublic/oauth_client.py b/appPublic/oauth_client.py index 931c76d..10273ac 100644 --- a/appPublic/oauth_client.py +++ b/appPublic/oauth_client.py @@ -1,6 +1,7 @@ import json -from appPublic.httpclient import HttpClient, RESPONSE_TEXT, RESPONSE_JSON, RESPONSE_BIN,RESPONSE_FILE, RESPONSE_STREAM +from appPublic.httpclient import HttpClient, RESPONSE_TEXT, RESPONSE_JSON, RESPONSE_BIN,RESPONSE_FILE, RESPONSE_STREAM, HttpError from appPublic.argsConvert import ArgsConvert +from appPublic.dictObject import DictObject class OAuthClient: """ @@ -51,16 +52,18 @@ class OAuthClient: self.converters = converters self.ac = ArgsConvert('${', '}') - def setup_req_datas(self, data=[], ns={}): + def setup_req_data(self, data=[], ns={}): d = {} - for h in headers: - d1 = self.setup_req_data(h, ns) + if data is None: + return None + for h in data: + d1 = self.setup_req_kv(h, ns) d.update(d1) if d == {}: return None return d - def setup_req_data(d, ns): + def setup_req_kv(self, d, ns): rd = { d.name:d.value } @@ -71,7 +74,7 @@ class OAuthClient: nd[d.name] = f(nd.get(d.name)) return nd - async def __call__(self, mapi, params): + async def __call__(self, host, mapi, params): if not self.desc.get(mapi): raise Exception(f'{mapi} not defined') self.api = self.desc[mapi] @@ -81,23 +84,34 @@ class OAuthClient: "code":'9999', "message":f"{mapi} not defined" } - assert d.get('url') - method = d.get('method', 'GET') + path = self.datalize(self.api.path, params) + url = host + path + method = self.api.get('method', 'GET') myheaders = self.setup_req_data(self.api.headers, params) myparams = self.setup_req_data(self.api.params, params) mydata = self.setup_req_data(self.api.data, params) - url = self.api.get('url') response_type = RESPONSE_JSON hc = HttpClient() print(f'{url=}, {method=}, {myparams=}, {mydata=}, {myheaders=}') - resp_data = await hc.request(url, method, response_type=response_type, + resp_data = None + try: + resp_data = await hc.request(url, method, response_type=response_type, params=None if myparams is None else myparams, data=None if mydata is None else json.dumps(mydata), headers=myheaders) + resp_data = DictObject(**resp_data) + print(resp_data) + except HttpError as e: + return { + "status":"error", + "code":e.code, + "message":e.msg + } + if resp_data is None: return { "status":"error", - "code":None + "code":None, "message":"https error" } err = self.check_if_error(resp_data) @@ -112,7 +126,7 @@ class OAuthClient: return s1 def get_resp_data(self, resp, keys, converter=None): - d = resp.get_dic_data_by_keys(desc.keys) + d = resp.get_data_by_keys(keys) if converter: f = self.converters.get(converter) if f: @@ -121,20 +135,26 @@ class OAuthClient: def setup_return_data(self, resp): data = {} + if not self.api.resp: + return { + 'status':'ok', + 'data':{} + } + for desc in self.api.resp: k = desc.name - v = self.get_resp_data(resp, desc.keys, desc.converter) + v = self.get_resp_data(resp, desc.resp_keys, desc.converter) data[k] = v return { "status":"ok", "data":data } - def check_if_error(self, resp, error_field): + def check_if_error(self, resp): if not self.api.error_if: return None ei = self.api.error_if - v = resp.get_dic_data_by_keys(ei.keys) + v = resp.get_data_by_keys(ei.error_keys) v1 = ei.value if ei.converter: f = self.converters.get(ei.converter) @@ -142,18 +162,21 @@ class OAuthClient: v = f(v) if not ei.op: ei.op = '==' - if ei.op in ['==', '='] and v == v1 or ei.op == '!=' and v != v1: + print(f'{ei.keys=},{v=}, {v1=}, {ei.op=}{v==v1}, {resp.base_resp.status_code=}') + if (ei.op == '==' and v == v1) or (ei.op == '!=' and v != v1): + print(f'{v=}, {v1=}, {ei.op=}{v==v1}') code = None message = None if ei.code_keys: - code = resp.get_dic_data_by_keys(ei.code_keys) + code = resp.get_data_by_keys(ei.code_keys) if ei.msg_keys: - message = resp.get_dic_data_by_keys(ei.msg_keys) + message = resp.get_data_by_keys(ei.msg_keys) return { "status":"error", - "code:code, + "code":code, "message":message } + print(f'check_if_error ok:{v=}, {v1=}, {ei.op=}{v==v1}') return None def set_data(self, resp_data, data_desc): diff --git a/appPublic/sshx.py b/appPublic/sshx.py index b336894..65bcbd2 100644 --- a/appPublic/sshx.py +++ b/appPublic/sshx.py @@ -74,6 +74,7 @@ class SSHNode: else: self.conn = await asyncssh.connect(host, username=username, + password=password, port=port) def close(self):