Я пытаюсь создать базовый прокси-сервер, доступный из Интернета, для пересылки запросов, а также для их регистрации в базе данных 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
Поддержка сервера CONNECT Flask ⇐ Python
Программы на Python
1765347357
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79532548/support-connect-flask-server[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия