Kumi
7df5eafe5b
Switched the variable from `url` to `jsdelivr_url` in the proxy function to ensure it references the correct URL. This corrects an oversight that could have resulted in incorrect data being fetched or an error due to an invalid URL. No other functionality is affected.
50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
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()
|