@@ -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=======================================================================================
75101VERSION-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