Source code for flytrap.app

import datetime
import os
import uuid
from typing import Optional

from flask import Flask, Response, render_template, request
from rich import print

from .sessions import SessionBD


[docs]def gen_session_id() -> str: return str(uuid.uuid4()).replace("-", "")
[docs]def get_request_data(): return { "method": request.method, "remote_addr": request.remote_addr, "path": request.path, "headers": dict(request.headers), "cookies": dict(request.cookies), "datetime": datetime.datetime.now().isoformat() }
[docs]def init_webhooks(base_url: str): # Update inbound traffic via APIs to use the public-facing ngrok URL pass
[docs]def init_routes(app: Flask): @app.route("/") def base_view(): context = {} session_id = gen_session_id() print("New session_id = ", session_id) db = SessionBD(session_id) db.update(get_request_data()) context["url"] = app.config["TARGET_URL"] context["session_id"] = session_id context["speed_test"] = app.config["SPEED_TEST"] return render_template("redirect.html", context=context) @app.route("/update", methods=["PATCH"]) def update_view(): session_id = request.args.get("id") if session_id is None: return Response(status=400) data = request.get_json() print("Update data for session_id =", session_id) # print("session_id = ", data) # print("data = ", data) db = SessionBD(session_id) db.update(data) return Response(status=200)
[docs]def create_app( target_url: Optional[str] = None, port=8080, ngrok_token: Optional[str] = None, use_ngrok=False, speed_test=True, template_folder="./templates", static_folder="./static", ): app = Flask(__name__, template_folder=template_folder, static_folder=static_folder) app.config["TARGET_URL"] = target_url or os.environ.get("TARGET_URL") app.config["BASE_URL"] = f"http://localhost:{port}" app.config["USE_NGROK"] = use_ngrok app.config["SPEED_TEST"] = speed_test print(" * Speed test: ", "on" if speed_test else "off") print(" * Ngrok mode: ", "on" if use_ngrok else "off") if use_ngrok: from pyngrok import ngrok if ngrok_token: ngrok.set_auth_token(ngrok_token) public_url = ngrok.connect(port).public_url print(f" * ngrok tunnel \"{public_url}\" -> \"{app.config['BASE_URL']}\"") # Update any base URLs or webhooks to use the public ngrok URL app.config["BASE_URL"] = public_url init_webhooks(public_url) init_routes(app) return app