@@ -107,7 +107,7 @@ def _is_loopback_host(host: str | None) -> bool:
107107
108108def _is_loopback_origin (origin : str | None ) -> bool :
109109 """Return True when a browser Origin points at the local Memanto host."""
110- if not origin :
110+ if not origin or not isinstance ( origin , str ) :
111111 return False
112112 try :
113113 parsed = urlsplit (origin )
@@ -120,7 +120,7 @@ def _is_loopback_origin(origin: str | None) -> bool:
120120
121121def _is_loopback_host_header (host : str | None ) -> bool :
122122 """Return True when an HTTP Host header names a loopback interface."""
123- if not host :
123+ if not host or not isinstance ( host , str ) :
124124 return False
125125 try :
126126 hostname = urlsplit (f"//{ host } " ).hostname
@@ -132,10 +132,14 @@ def _is_loopback_host_header(host: str | None) -> bool:
132132def _is_cross_site_browser_request (request : Request ) -> bool :
133133 """Detect browser requests that must not inherit loopback trust."""
134134 origin = request .headers .get ("origin" )
135- if origin is not None :
135+ if origin is not None and isinstance ( origin , str ) :
136136 return not _is_loopback_origin (origin )
137137
138- fetch_site = request .headers .get ("sec-fetch-site" , "" ).strip ().lower ()
138+ fetch_site = request .headers .get ("sec-fetch-site" , "" )
139+ if isinstance (fetch_site , str ):
140+ fetch_site = fetch_site .strip ().lower ()
141+ else :
142+ fetch_site = ""
139143 return fetch_site in {"cross-site" , "same-site" }
140144
141145
0 commit comments