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