#!/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()