Aggiunto un log migliore
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 = []
|
||||||
|
|||||||
Reference in New Issue
Block a user