| |
| 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() |