Created
October 10, 2019 05:40
-
-
Save tranductam2802/7854a84b127e9805d23683d8a376c349 to your computer and use it in GitHub Desktop.
Python proxy server for forwarding request.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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