nobsdelivr/app.py

51 lines
1.3 KiB
Python
Raw Normal View History

from flask import Flask, render_template, request, Response, abort
from werkzeug.exceptions import InternalServerError
from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.parse import unquote
app = Flask(__name__)
@app.route("/")
def home():
domain = request.url_root
return render_template("index.html", domain=domain)
@app.route("/<path:url>")
def proxy(url):
jsdelivr_url = f"https://cdn.jsdelivr.net/{url}"
def generate():
# Subfunction to allow streaming the data instead of
# downloading all of it at once
try:
with urlopen(unquote(jsdelivr_url)) as data:
while True:
chunk = data.read(1024 * 1024)
if not chunk:
break
yield chunk
except HTTPError as e:
abort(e.code)
try:
with urlopen(unquote(jsdelivr_url)) as data:
content_type = data.headers["content-type"]
except HTTPError as e:
abort(e.code)
except KeyError:
raise InternalServerError()
headers = dict()
filename = url.split("/")[-1]
headers["Content-Disposition"] = f'attachment; filename="{filename}"'
return Response(generate(), content_type=content_type, headers=headers)
if __name__ == "__main__":
app.run()