| @@ -0,0 +1,77 @@ | |||||
| import aiohttp | |||||
| from aiohttp import web | |||||
| from argparse import ArgumentParser | |||||
| import ssl | |||||
| import json | |||||
| def options_fetch_blocks(request): | |||||
| return web.Response(headers={ 'Access-Control-Allow-Origin': '*' }) | |||||
| async def post_fetch_blocks(request): | |||||
| body = await request.read() | |||||
| body = json.loads(body) | |||||
| proxy_host = body['keepProxyHost'] | |||||
| arv_token = body['arvToken'] | |||||
| segments = body['segments'] | |||||
| use_ssl = body['useSsl'] \ | |||||
| if 'useSsl' in body \ | |||||
| else True | |||||
| protocol = 'https://' \ | |||||
| if use_ssl \ | |||||
| else 'http://' | |||||
| name = body['name'] \ | |||||
| if 'name' in body \ | |||||
| else None | |||||
| content_type = body['contentType'] \ | |||||
| if 'contentType' in body \ | |||||
| else 'application/octet-stream' | |||||
| res = web.StreamResponse() | |||||
| res.content_type = content_type | |||||
| if name: | |||||
| res.headers['Content-Disposition'] = 'attachment; filename*=UTF-8\'\'"' + name + '"' | |||||
| else: | |||||
| res.headers['Content-Disposition'] = 'inline' | |||||
| res.headers['Access-Control-Allow-Origin'] = '*' | |||||
| await res.prepare(request) | |||||
| async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=False)) as session: | |||||
| for seg in segments: | |||||
| url = protocol + proxy_host + '/' + seg[0] | |||||
| async with session.get(url, headers={ 'Authorization': 'OAuth2 ' + arv_token }) as response: | |||||
| block = await response.read() | |||||
| block = block[seg[1]:seg[2]] | |||||
| await res.write(block) | |||||
| return res | |||||
| def get_index(request): | |||||
| return web.Response(text='Use /fetch-blocks to stream files from Keep') | |||||
| def create_parser(): | |||||
| parser = ArgumentParser() | |||||
| parser.add_argument('--port', type=int, default=50080) | |||||
| parser.add_argument('--ssl-cert', type=str, default=None) | |||||
| return parser | |||||
| def main(): | |||||
| parser = create_parser() | |||||
| args = parser.parse_args() | |||||
| app = web.Application() | |||||
| app.add_routes([ | |||||
| web.get('/', get_index), | |||||
| web.post('/fetch-blocks', post_fetch_blocks), | |||||
| web.options('/fetch-blocks', options_fetch_blocks) | |||||
| ]) | |||||
| if args.ssl_cert: | |||||
| ssl_context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) | |||||
| ssl_context.load_cert_chain(args.ssl_cert) | |||||
| else: | |||||
| ssl_context = None | |||||
| web.run_app(app, port=args.port, ssl_context=ssl_context) | |||||
| if __name__ == '__main__': | |||||
| main() | |||||