Skip to content

Instantly share code, notes, and snippets.

@x-magic
Last active May 31, 2026 10:59
Show Gist options
  • Select an option

  • Save x-magic/990568de4cd72890e663aeb687c4dfe9 to your computer and use it in GitHub Desktop.

Select an option

Save x-magic/990568de4cd72890e663aeb687c4dfe9 to your computer and use it in GitHub Desktop.
FlareSolverr XML Bridge - Transparently proxy RSS request through FlareSolverr
import os
from flask import Flask, request, Response
import requests
import logging
# Force all requests to be IPv4
requests.packages.urllib3.util.connection.HAS_IPV6 = False
app = Flask(__name__)
FS_URL = os.getenv("FS_URL", "http://foobar.local:8191/v1")
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('waitress')
logger.setLevel(logging.INFO)
@app.route('/get')
def proxy():
# Use: http://bridge-domain:5191/get?mime=text/html&url=https://site.com
# target URL better to be url-encoded to ensure querystring are properly parsed
target_url = request.args.get('url')
if not target_url:
return "Missing url parameter", 400
expected_mime = request.args.get('mime')
if not expected_mime:
expected_mime = 'text/html'
payload = {
"cmd": "request.get",
"url": target_url,
"session": "bridge-session",
"maxTimeout": 60000
}
try:
fs_handle = requests.post(FS_URL, json=payload)
fs_response = fs_handle.json()
logging.info("FS request.get: " + fs_handle.text[:350])
except Exception as e:
return str(e), 500
if expected_mime != "application/xml":
return Response(
fs_response['solution']['response'],
status=fs_response['solution']['status'],
mimetype=expected_mime
)
else:
# re-request XML directly from original website as FS returns false XML output
xml_response = request_true_xml(fs_response)
return Response(
xml_response.text,
status=xml_response.status_code,
mimetype=expected_mime
)
def create_fs_session():
# Create a session for future use
payload = {
"cmd": "sessions.create",
"session": "bridge-session"
}
try:
request = requests.post(FS_URL, json=payload)
logging.info("FS sessions.create: " + request.text)
except Exception as e:
logging.error(e)
def request_true_xml(fs_response):
logging.info("Request is XML, re-retrieve raw data")
url = fs_response['solution']['url']
headers = {
"User-Agent": fs_response['solution']['userAgent'],
"Accept": "application/xml"
}
cookies = {}
for cookie in fs_response['solution']['cookies']:
cookies[cookie["name"]] = cookie['value']
response = requests.get(url, headers=headers, cookies=cookies)
return response
if __name__ == '__main__':
# create or refresh FS session to ensure it's usable later
create_fs_session()
# and start server
from waitress import serve
serve(app, host='0.0.0.0', port=5191)
#!/bin/sh
docker run -d \
--name flaresolverr-xml-bridge \
-p 5191:5191 \
-e FS_URL="http://<your-fs-address:port>/v1" \
--restart unless-stopped \
python:3-slim \
sh -c "apt-get update && apt-get install -y curl && \
mkdir /app && cd /app && \
curl -sSL https://gist.github.com/x-magic/990568de4cd72890e663aeb687c4dfe9/raw/requirements.txt -o requirements.txt && \
curl -sSL https://gist.github.com/x-magic/990568de4cd72890e663aeb687c4dfe9/raw/app.py -o app.py && \
pip install --no-cache-dir -r requirements.txt && \
python app.py"
flask
requests
waitress
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment