代理至本地

8 阅读1分钟

此函数是一个通过 8080 端口接收外部请求的 HTTP 服务

from flask import Flask, request, Response
import requests

app = Flask(__name__)

# 目标服务器地址
TARGET_URL = 'http://10.240.230.64:8000'

@app.route('/', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])
def proxy():
    global TARGET_URL
    url = f"{TARGET_URL}"
    headers = {
        # 从原始请求中转发这些头部信息
        'Host': request.host,
        'X-Real-IP': request.remote_addr,
        'X-Forwarded-For': request.headers.get('X-Forwarded-For', request.remote_addr),
        'X-Forwarded-Proto': request.scheme,
        'Content-Type': request.headers.get('Content-Type', ''),
    }

    # 如果原始请求是WebSocket升级请求,则设置相应的头部
    if 'Upgrade' in request.headers and request.headers['Upgrade'].lower() == 'websocket':
        headers.update({
            'Connection': 'Upgrade',
            'Upgrade': request.headers['Upgrade']
        })

    # 根据原始请求的方法,发送相应的请求到目标服务器
    resp = requests.request(
        method=request.method,
        url=url,
        headers=headers,
        data=request.get_data(),
        cookies=request.cookies,
        allow_redirects=False)

    # 构建响应,将目标服务器的响应内容转发回客户端
    excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
    headers = [(name, value) for (name, value) in resp.raw.headers.items()
               if name.lower() not in excluded_headers]

    response = Response(resp.content, resp.status_code, headers)
    return response

if __name__ == '__main__':
    app.run(debug=False, port=8080)

做一个通用服务,实现同样的代理功能