Поддержка сервера CONNECT FlaskPython

Программы на Python
Ответить
Anonymous
 Поддержка сервера CONNECT Flask

Сообщение Anonymous »

Я пытаюсь создать базовый прокси-сервер, доступный из Интернета, для пересылки запросов, а также для их регистрации в базе данных Firebase. Я развернул свой код в Google Cloud Run, создав экземпляр, а затем с помощью ssh добавив свой код Python и файл службы. Я также установил правило брандмауэра, разрешающее запросы на порт 5000, который я использую для доступа к прокси.
Прокси работает нормально почти для всех запросов, за исключением типа CONNECT. Как я могу изменить приведенный ниже код, чтобы он работал и для CONNECT? При попытке подключения я получаю [25/Mar/2025 01:40:07] "CONNECT api.ipify.org:443 HTTP/1.1" 405 -
Прокси-сервер является http-прокси, и я получаю к нему доступ, например, curl -x http://22.22.5.30:5200 http://httpbin.org/ip
from flask import Flask, request, Response
import requests
import socket
import firebase_admin
from firebase_admin import credentials, firestore
from datetime import datetime

# === FIREBASE SETUP ===
cred = credentials.Certificate("service.json")
firebase_admin.initialize_app(cred)
db = firestore.client()
collection_name = "requests"

# === FLASK SETUP ===
app = Flask(__name__)
LOCAL_IP = socket.gethostbyname(socket.gethostname())
PORT = 5100

def log_to_firestore(entry):
try:
db.collection(collection_name).add(entry)
except Exception as e:
print(f"Firestore Error: {e}")

@app.route('/', defaults={'path': ''}, methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'])
@app.route('/', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'])
def proxy(path):
if request.url.startswith('http'):
target_url = request.url
else:
target_url = request.args.get('url')
if not target_url:
if path and '://' in path:
target_url = path
else:
return "Missing target URL", 400

try:
request_data = request.get_data()
headers = {k: v for k, v in request.headers.items() if k.lower() != 'host'}

# Forward the request
response = requests.request(
method=request.method,
url=target_url,
headers=headers,
data=request_data,
cookies=request.cookies,
allow_redirects=False
)

# Prepare Firestore log entry
entry = {
"timestamp": datetime.utcnow().isoformat(),
"method": request.method,
"target_url": target_url,
"request": {
"headers": dict(request.headers),
"body": request_data.decode(errors='ignore'),
},
"response": {
"status": response.status_code,
"headers": dict(response.headers),
"body": response.text[:1000] # Limit for Firestore size
}
}

log_to_firestore(entry)

return Response(response.content,
status=response.status_code,
headers=dict(response.headers))

except Exception as e:
error_entry = {
"timestamp": datetime.utcnow().isoformat(),
"method": request.method,
"target_url": target_url,
"error": str(e)
}
log_to_firestore(error_entry)
return f"Error: {str(e)}", 500

if __name__ == '__main__':
print(f"Proxy Server running at: http://{LOCAL_IP}:{PORT}")
app.run(host='0.0.0.0', port=PORT, debug=True)



Подробнее здесь: https://stackoverflow.com/questions/795 ... ask-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»