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