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