diff --git a/uapi/appapi.py b/uapi/appapi.py index 4b662cb..824579b 100644 --- a/uapi/appapi.py +++ b/uapi/appapi.py @@ -32,6 +32,7 @@ async def sync_users(request, upappid, userid): class UAPI: def __init__(self, request, env=DictObject()): + self.request = request self.te = MyTemplateEngine([], env=env) self.env = env self.env.request.request = request @@ -92,41 +93,44 @@ class UAPI: return if auth_uapi: await self.do_auth(auth_uapi) - async for line in self.stream_gen(uapi): - yield line + async for chunk in self.stream_resp(uapi): + yield chunk - async def request(self, upappid, upapiid, callerid, params={}): - auth_uapi, uapi = await self.get_uapis(upapiid, apiname, - callerid, params=params) - if auth_uapi: - await self.do_auth(auth_uapi) - return await self.do_call(uapi) + async def request(self, upappid, apiname, callerid, params={}): + b = b'' + async for chunk in self(upapiid, apiname, callerid, params=params): + b += chunk + return b 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')) self.env.update(d) return - async def do_call(self, api, params={}): + async def stream_resp(self, api, params={}): url = self.env.get('baseurl') + api.path method = api.httpmethod - header = await self.rendertmpl(api.headers) - header = json.loads(headers) - body = await self.rendertmpl(api.body) + headers = await self.rendertmpl(api.headers) + headers = json.loads(headers) + 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) if _params: _params = json.loads(_params) + debug(f'{headers=}, {body=}. {method=}, {url=}') shc = StreamHttpClient() - b = await shc.request(method, url, - headers=headers, - data=body, - params=_params) - - d = json.loads(b.encode('utf-8')) - if api.response: - return await self.rendertmpl(api.response, params=d) - return d + gen = shc(method, url, + headers=headers, + data=body, + params=_params) + async for chunk in gen: + yield chunk async def stream_gen(self, api, params={}): url = self.env.get('baseurl') + api.path