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