Skip to content

Instantly share code, notes, and snippets.

@tranductam2802
Created October 10, 2019 05:40
Show Gist options
  • Save tranductam2802/7854a84b127e9805d23683d8a376c349 to your computer and use it in GitHub Desktop.
Save tranductam2802/7854a84b127e9805d23683d8a376c349 to your computer and use it in GitHub Desktop.
Python proxy server for forwarding request.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Usage:
- Windows OS:
$ set FORWARD_HOST=http://example.com[:port]
$ python server.py
- Unix based OS (Ubuntu, MacOS .etc):
$ export FORWARD_HOST=http://example.com[:port]
$ python server.py"""
import os
import requests
from flask import Flask, abort, request, Response
FORWARD_HOST_KEY = 'FORWARD_HOST'
FORWARD_EXCLUDED_HEADER_KEYS = ['Host']
RESPONSE_EXCLUDED_HEADER_KEYS = [
'content-encoding', 'content-length', 'transfer-encoding', 'connection']
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
return doForward(request)
def getForwardHost():
if FORWARD_HOST_KEY in os.environ:
return os.environ[FORWARD_HOST_KEY]
else:
return None
def setForwardHost(host_url):
os.environ[FORWARD_HOST_KEY] = host_url
def doForward(request):
forward_host = getForwardHost()
if forward_host is None:
# Build forward host not found
abort(404)
else:
# Build forward request
forward_url = request.url.replace(request.host_url, forward_host)
forward_headers = {key: value for (key, value) in
request.headers if key.lower() not in FORWARD_EXCLUDED_HEADER_KEYS}
receive = requests.request(method=request.method, url=forward_url, data=request.get_data(),
headers=forward_headers, cookies=request.cookies, allow_redirects=False)
# Build forwarded response
response_headers = [(key, value) for (key, value) in
receive.raw.headers.items() if key.lower() not in RESPONSE_EXCLUDED_HEADER_KEYS]
return Response(receive.content, receive.status_code, response_headers)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9119)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment