File size: 5,609 Bytes
588adc0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#!/usr/bin/env python3
import http.server
import socketserver
import urllib.request
import urllib.error
import json
import os
import sys
from pathlib import Path
# Порты для сервисов
API_PORT = int(os.environ.get("API_PORT", 8080))
UI_PORT = int(os.environ.get("UI_PORT", 3000))
PROXY_PORT = int(os.environ.get("PROXY_PORT", 49483))
class ProxyHandler(http.server.SimpleHTTPRequestHandler):
def log_message(self, format, *args):
"""Переопределение логирования для вывода в stdout"""
print("%s - %s" % (self.address_string(), format % args))
def do_GET(self):
"""Обработка GET запросов с перенаправлением"""
print(f"GET request: {self.path}")
# Если путь начинается с /api, перенаправляем на API сервер
if self.path.startswith('/api/'):
self._proxy_request("GET", API_PORT)
else:
self.send_error(404, "Not Found")
def do_POST(self):
"""Обработка POST запросов с перенаправлением"""
print(f"POST request: {self.path}")
# Если путь начинается с /api, перенаправляем на API сервер
if self.path.startswith('/api/'):
self._proxy_request("POST", API_PORT)
elif self.path.startswith('/api/dev/v1/packages') or self.path.startswith('/api/designer/v1/packages'):
self._handle_packages_request()
else:
self.send_error(404, "Not Found")
def do_OPTIONS(self):
"""Обработка OPTIONS запросов"""
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', 'Content-Type, Authorization')
self.end_headers()
def _proxy_request(self, method, port):
"""Прокси запрос на указанный порт"""
target_url = f"http://localhost:{port}{self.path}"
try:
# Читаем тело запроса, если есть
content_length = int(self.headers['Content-Length']) if 'Content-Length' in self.headers else 0
body = self.rfile.read(content_length) if content_length > 0 else None
# Создаем запрос
req = urllib.request.Request(
target_url,
data=body,
headers={k: v for k, v in self.headers.items() if k.lower() not in ('host', 'content-length')},
method=method
)
# Выполняем запрос
with urllib.request.urlopen(req) as response:
# Копируем заголовки ответа
self.send_response(response.status)
for key, val in response.getheaders():
if key.lower() not in ('transfer-encoding', 'content-encoding'):
self.send_header(key, val)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
# Копируем тело ответа
self.wfile.write(response.read())
except urllib.error.HTTPError as e:
self.send_response(e.code)
for key, val in e.headers.items():
if key.lower() not in ('transfer-encoding', 'content-encoding'):
self.send_header(key, val)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(e.read())
except Exception as e:
self.send_error(500, f"Proxy Error: {str(e)}")
def _handle_packages_request(self):
"""Обрабатывает запросы к пакетам"""
try:
# Читаем содержимое property.json
property_file = Path("/tmp/ten_user/agents/property.json")
if property_file.exists():
with open(property_file, 'r') as f:
property_data = json.load(f)
graphs = property_data.get("graphs", [])
# Формируем ответ
response = {
"data": graphs,
"status": 200,
"message": "Success"
}
# Отправляем ответ
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(json.dumps(response).encode('utf-8'))
else:
self.send_error(404, "Property file not found")
except Exception as e:
self.send_error(500, f"Error handling packages request: {str(e)}")
def run_proxy_server():
"""Запускает прокси-сервер на указанном порту"""
handler = ProxyHandler
with socketserver.TCPServer(("", PROXY_PORT), handler) as httpd:
print(f"Starting proxy server on port {PROXY_PORT}...")
httpd.serve_forever()
if __name__ == "__main__":
run_proxy_server() |