|  | 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()
 |