From 94aa518fe70d9c1500b3abfefb19789afc82d77c Mon Sep 17 00:00:00 2001 From: soraefir Date: Mon, 8 Jun 2026 20:41:51 +0200 Subject: [PATCH] fix --- modules/server/containers/apps/favicon.nix | 35 ++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/modules/server/containers/apps/favicon.nix b/modules/server/containers/apps/favicon.nix index d0a262b..77b8aaf 100644 --- a/modules/server/containers/apps/favicon.nix +++ b/modules/server/containers/apps/favicon.nix @@ -112,10 +112,31 @@ let or headers.get("X-Original-Host") or headers.get("Host", "") ) - host = (host or "").split(",", 1)[0].split(":", 1)[0].strip().lower() - if APP_DOMAIN and host.endswith(f".{APP_DOMAIN}"): - return host[:-(len(APP_DOMAIN) + 1)] - return host + return (host or "").split(",", 1)[0].split(":", 1)[0].strip().lower().rstrip(".") + + def _host_candidates(host): + candidates = [] + + def add(candidate): + if candidate and candidate not in candidates: + candidates.append(candidate) + + add(host) + if APP_DOMAIN: + suffix = f".{APP_DOMAIN}" + if host.endswith(suffix): + add(host[: -len(suffix)].rstrip(".")) + if "." in host: + add(host.split(".", 1)[0]) + + return candidates + + def _profile_for_host(host): + for candidate in _host_candidates(host): + profile = MAPPINGS.get(candidate) + if profile: + return candidate, profile + return None, DEFAULT_PROFILE def _replace_svg_color(svg, attribute, color): if attribute in {"fill", "stroke"}: @@ -194,7 +215,7 @@ let def _serve(self, include_body): host = _request_host(self.headers) - profile = MAPPINGS.get(host) or DEFAULT_PROFILE + matched_host, profile = _profile_for_host(host) if not profile: self.send_error(404, "No favicon mapping for host") return @@ -209,6 +230,8 @@ let self.send_response(304) self.send_header("ETag", etag) self.send_header("Cache-Control", CACHE_CONTROL) + self.send_header("X-Favicon-Host", host or "default") + self.send_header("X-Favicon-Mapping", matched_host or "default") self.end_headers() return @@ -218,6 +241,8 @@ let self.send_header("Content-Length", str(len(payload))) self.send_header("Cache-Control", CACHE_CONTROL) self.send_header("ETag", etag) + self.send_header("X-Favicon-Host", host or "default") + self.send_header("X-Favicon-Mapping", matched_host or "default") self.end_headers() if include_body: self.wfile.write(payload)