Skip to content

Commit 6695350

Browse files
committed
Added function to construct netloc by parsing request headers before defaulting to parsing the Request object's properties
1 parent 2d3e030 commit 6695350

File tree

1 file changed

+33
-27
lines changed

1 file changed

+33
-27
lines changed

src/murfey/server/api/bootstrap.py

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,32 @@ def _sanitise_str(input: str) -> str:
7070
return input_clean
7171

7272

73+
def resolve_netloc(request: Request) -> str:
74+
"""
75+
Helper function to construct the correct netloc (hostname[:port]) to use based on
76+
the request received. It will prioritise parsing the request headers for the host,
77+
port, protocol and using them to construct the netloc before defaulting to parsing
78+
the FastAPI Request object to do so.
79+
"""
80+
81+
# Prefer headers added by reverse proxies
82+
host = request.headers.get("X-Forwarded-Host", request.url.hostname)
83+
port = request.headers.get(
84+
"X-Forwarded-Port", str(request.url.port) if request.url.port else None
85+
)
86+
proto = request.headers.get("X-Forwarded-Proto", request.url.scheme)
87+
88+
# Default ports shouldn't be included; if no ports are found, return just the host
89+
if (
90+
(proto == "http" and port == "80")
91+
or (proto == "https" and port == "443")
92+
or not port
93+
):
94+
return host
95+
96+
return f"{host}:{port}"
97+
98+
7399
"""
74100
=======================================================================================
75101
VERSION-RELATED API ENDPOINTS
@@ -126,15 +152,10 @@ def get_bootstrap_instructions(request: Request):
126152
machine with no internet access.
127153
"""
128154

129-
# Constructs the netloc (hostname + port) and proxy path depending on if the
130-
# request was forwarded via proxy
131-
netloc = (
132-
f"{request.headers['X-Forwarded-Host']}:{request.headers['X-Forwarded-Port']}"
133-
if request.headers.get("X-Forwarded-Host")
134-
and request.headers.get("X-Forwarded-Port")
135-
else request.url.netloc
136-
)
137-
# Additional bit in URL path after the netloc caused by the proxy reroute
155+
# Check if this is a forwarded request from somewhere else and construct netloc
156+
netloc = resolve_netloc(request)
157+
158+
# Find path to 'bootstrap' router using current URL path
138159
proxy_path = request.url.path.removesuffix(f"{bootstrap.prefix}/")
139160

140161
return respond_with_template(
@@ -362,12 +383,7 @@ def get_pacman_mirrors(request: Request):
362383
"""
363384

364385
# Check if this is a forwarded request from somewhere else and construct netloc
365-
netloc = (
366-
f"{request.headers['X-Forwarded-Host']}:{request.headers['X-Forwarded-Port']}"
367-
if request.headers.get("X-Forwarded-Host")
368-
and request.headers.get("X-Forwarded-Port")
369-
else request.url.netloc
370-
)
386+
netloc = resolve_netloc(request)
371387

372388
# Find path to Rust router using current URL Path
373389
path_to_router = request.url.path.removesuffix("/config/pacman.d.zip")
@@ -641,12 +657,7 @@ def get_cargo_config(request: Request):
641657
"""
642658

643659
# Check if this is a forwarded request from somewhere else and construct netloc
644-
netloc = (
645-
f"{request.headers['X-Forwarded-Host']}:{request.headers['X-Forwarded-Port']}"
646-
if request.headers.get("X-Forwarded-Host")
647-
and request.headers.get("X-Forwarded-Port")
648-
else request.url.netloc
649-
)
660+
netloc = resolve_netloc(request)
650661

651662
# Find path to Rust router using current URL Path
652663
path_to_router = request.url.path.removesuffix("/cargo/config.toml")
@@ -723,12 +734,7 @@ def get_index_config(request: Request):
723734
"""
724735

725736
# Check if this is a forwarded request from somewhere else and construct netloc
726-
netloc = (
727-
f"{request.headers['X-Forwarded-Host']}:{request.headers['X-Forwarded-Port']}"
728-
if request.headers.get("X-Forwarded-Host")
729-
and request.headers.get("X-Forwarded-Port")
730-
else request.url.netloc
731-
)
737+
netloc = resolve_netloc(request)
732738

733739
# Find path to Rust router using current URL Path
734740
path_to_router = request.url.path.removesuffix("/index/config.json")

0 commit comments

Comments
 (0)