This commit is contained in:
yumoqing 2025-08-05 18:39:25 +08:00
parent ddbb6071a6
commit db46411c80

View File

@ -32,6 +32,7 @@ async def sync_users(request, upappid, userid):
class UAPI: class UAPI:
def __init__(self, request, env=DictObject()): def __init__(self, request, env=DictObject()):
self.request = request
self.te = MyTemplateEngine([], env=env) self.te = MyTemplateEngine([], env=env)
self.env = env self.env = env
self.env.request.request = request self.env.request.request = request
@ -92,41 +93,44 @@ class UAPI:
return return
if auth_uapi: if auth_uapi:
await self.do_auth(auth_uapi) await self.do_auth(auth_uapi)
async for line in self.stream_gen(uapi): async for chunk in self.stream_resp(uapi):
yield line yield chunk
async def request(self, upappid, upapiid, callerid, params={}): async def request(self, upappid, apiname, callerid, params={}):
auth_uapi, uapi = await self.get_uapis(upapiid, apiname, b = b''
callerid, params=params) async for chunk in self(upapiid, apiname, callerid, params=params):
if auth_uapi: b += chunk
await self.do_auth(auth_uapi) return b
return await self.do_call(uapi)
async def do_auth(self, auth_uapi): async def do_auth(self, auth_uapi):
b = await self.do_call(auth_uapi) b = b''
async for chunk in self.stream_resp(auth_uapi):
b+= chunk
d = json.loads(b.encode('utf-8')) d = json.loads(b.encode('utf-8'))
self.env.update(d) self.env.update(d)
return return
async def do_call(self, api, params={}): async def stream_resp(self, api, params={}):
url = self.env.get('baseurl') + api.path url = self.env.get('baseurl') + api.path
method = api.httpmethod method = api.httpmethod
header = await self.rendertmpl(api.headers) headers = await self.rendertmpl(api.headers)
header = json.loads(headers) headers = json.loads(headers)
body = await self.rendertmpl(api.body) body = await self.rendertmpl(api.data)
if body:
bdy = json.loads(body)
bdy['stream'] = True
body = json.dumps(bdy, ensure_ascii=False)
_params = await self.rendertmpl(api.params) _params = await self.rendertmpl(api.params)
if _params: if _params:
_params = json.loads(_params) _params = json.loads(_params)
debug(f'{headers=}, {body=}. {method=}, {url=}')
shc = StreamHttpClient() shc = StreamHttpClient()
b = await shc.request(method, url, gen = shc(method, url,
headers=headers, headers=headers,
data=body, data=body,
params=_params) params=_params)
async for chunk in gen:
d = json.loads(b.encode('utf-8')) yield chunk
if api.response:
return await self.rendertmpl(api.response, params=d)
return d
async def stream_gen(self, api, params={}): async def stream_gen(self, api, params={}):
url = self.env.get('baseurl') + api.path url = self.env.get('baseurl') + api.path