| | |
| | 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}") |
| | |
| | |
| | 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}") |
| | |
| | |
| | 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_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() |