Aggiunto un log migliore

This commit is contained in:
2026-07-01 15:30:30 +02:00
parent f73d5d9164
commit dde33c434d
2 changed files with 27 additions and 30 deletions

View File

@@ -230,27 +230,19 @@ def build_http_redirect(location: str) -> bytes:
return "\r\n".join(headers).encode("utf-8") return "\r\n".join(headers).encode("utf-8")
def build_user_host(host: str, user_id: str) -> Optional[str]: def rewrite_http_request_target(data: bytes, target: str) -> bytes:
if not host: header_end = data.find(b"\r\n")
return None if header_end == -1:
return data
hostname, separator, port = host.partition(":") request_line = data[:header_end].decode("iso-8859-1", errors="replace")
hostname = hostname.strip().lower() parts = request_line.split(" ", 2)
if not hostname: if len(parts) != 3:
return None return data
if hostname == "localhost": method, _, version = parts
target_host = f"{user_id}.localhost" rewritten_line = f"{method} {target} {version}".encode("iso-8859-1")
else: return rewritten_line + data[header_end:]
labels = [label for label in hostname.split(".") if label]
if not labels:
return None
if labels[0] == user_id:
target_host = hostname
else:
target_host = ".".join([user_id, *labels])
return f"{target_host}:{port}" if separator else target_host
def extract_user_from_http_request(data: bytes, known_users: Dict[str, Dict[str, Any]]): def extract_user_from_http_request(data: bytes, known_users: Dict[str, Dict[str, Any]]):
@@ -287,13 +279,10 @@ def extract_user_from_http_request(data: bytes, known_users: Dict[str, Dict[str,
if segments: if segments:
candidate = segments[0] candidate = segments[0]
if candidate in known_users: if candidate in known_users:
user_host = build_user_host(headers.get("host", ""), candidate) rewritten_path = "/" + "/".join(segments[1:]) if len(segments) > 1 else "/"
if user_host: rewritten_target = f"{rewritten_path}?{query}" if separator else rewritten_path
redirect_path = "/" + "/".join(segments[1:]) if len(segments) > 1 else "/" rewritten_data = rewrite_http_request_target(data, rewritten_target)
if separator: return known_users[candidate], rewritten_data, None
redirect_path = f"{redirect_path}?{query}"
redirect_target = f"http://{user_host}{redirect_path}"
return None, data, redirect_target
return None, data, None return None, data, None

View File

@@ -198,7 +198,7 @@ class ManagerConfigTests(unittest.TestCase):
self.assertEqual(rewritten, request) self.assertEqual(rewritten, request)
self.assertIsNone(redirect_target) self.assertIsNone(redirect_target)
def test_extract_user_from_path_returns_redirect_target(self): def test_extract_user_from_path_rewrites_request_for_direct_proxying(self):
request = ( request = (
b"GET /user1/websockify?token=abc HTTP/1.1\r\n" b"GET /user1/websockify?token=abc HTTP/1.1\r\n"
b"Host: localhost:8080\r\n" b"Host: localhost:8080\r\n"
@@ -209,9 +209,17 @@ class ManagerConfigTests(unittest.TestCase):
user, rewritten, redirect_target = self.manager.extract_user_from_http_request(request, users) user, rewritten, redirect_target = self.manager.extract_user_from_http_request(request, users)
self.assertIsNone(user) self.assertEqual(user["id"], "user1")
self.assertEqual(rewritten, request) self.assertEqual(
self.assertEqual(redirect_target, "http://user1.localhost:8080/websockify?token=abc") rewritten,
(
b"GET /websockify?token=abc HTTP/1.1\r\n"
b"Host: localhost:8080\r\n"
b"Upgrade: websocket\r\n"
b"\r\n"
),
)
self.assertIsNone(redirect_target)
def test_wait_until_ready_applies_stabilization_delay(self): def test_wait_until_ready_applies_stabilization_delay(self):
sleep_calls = [] sleep_calls = []