# aimp_proxy_final.py
from flask import Flask, request, Response
import requests
import time
app = Flask(__name__)
UPSTREAM_BASE = "https://www.aimp.ru"
LISTEN_ADDR = "127.0.0.1"
PORT = 8080
TIMEOUT = 10
# IMPORTANT: do not use system proxy settings for upstream requests
sess = requests.Session()
sess.trust_env = False # <- критично, чтобы не зациклить себя через системный proxy
def log(*args):
print(time.strftime("%Y-%m-%d %H:%M:%S"), *args, flush=True)
@app.route("/", defaults={"path": ""}, methods=["GET","HEAD"])
@app.route("/<path:path>", methods=["GET","HEAD"])
def proxy(path):
host = request.headers.get("Host", "")
qs = request.query_string.decode()
# Build incoming summary for logs
incoming = f"{request.method} http://{host}/{path}"
if qs:
incoming += "?" + qs
log("INCOMING:", incoming)
# If client requested update.aimp.ru -> map to upstream /update
if host and host.lower().startswith("update.aimp.ru"):
upstream = UPSTREAM_BASE + "/update"
else:
# normal forward to requested host/path
upstream = f"http://{host}/{path}" if host else f"http://{path}"
if qs:
upstream = upstream + ("?" + qs)
log(" -> Fetching upstream:", upstream)
try:
# Forward minimal headers; allow upstream to set its Host header
headers = {"User-Agent": request.headers.get("User-Agent", "AIMP-Proxy")}
resp = sess.get(upstream, headers=headers, timeout=TIMEOUT, stream=True)
log(" <- Upstream returned", resp.status_code, resp.headers.get("Content-Type"))
# Return upstream content to client
content = resp.content # small XML / files OK
return Response(content, status=resp.status_code, content_type=resp.headers.get("Content-Type", "application/octet-stream"))
except requests.RequestException as e:
log(" !!! Fetch error:", repr(e))
return Response(f"Proxy fetch error: {e}", status=502)
if __name__ == "__main__":
log(f"Starting proxy on {LISTEN_ADDR}:{PORT} (trust_env=False)")
app.run(host=LISTEN_ADDR, port=PORT)