diff --git a/sanic/forwarded.py b/sanic/forwarded.py index 05957795..67fb9ac1 100644 --- a/sanic/forwarded.py +++ b/sanic/forwarded.py @@ -39,7 +39,10 @@ def parse_xforwarded(headers, config): addr = addr.strip() if not addr: return None - other = ((h, headers.get(f'x-forwarded-{h}')) for h in ('proto', 'host', 'port', 'path')) + other = ( + ('proto', headers.get('x-scheme')), + *((h, headers.get(f'x-forwarded-{h}')) for h in ('proto', 'host', 'port', 'path')) + ) return {'for': addr, **{h: v for h, v in other if v}} def test_parse_forwarded(): diff --git a/sanic/request.py b/sanic/request.py index 1929c3e6..0ac96386 100644 --- a/sanic/request.py +++ b/sanic/request.py @@ -372,7 +372,7 @@ class Request(dict): """ return ( self.app.config.get("SERVER_NAME") - or self.headers.get("x-forwarded-host") + or self.forwarded.get("host") or self.host.split(":")[0] ) @@ -394,7 +394,7 @@ class Request(dict): :return: server port :rtype: int """ - forwarded_port = self.headers.get("x-forwarded-port") or ( + forwarded_port = self.forwarded.get("port") or ( self.host.split(":")[1] if ":" in self.host else None ) if forwarded_port: @@ -412,33 +412,7 @@ class Request(dict): :return: original client ip. """ if not hasattr(self, "_remote_addr"): - if self.app.config.PROXIES_COUNT == 0: - self._remote_addr = "" - elif self.app.config.REAL_IP_HEADER and self.headers.get( - self.app.config.REAL_IP_HEADER - ): - self._remote_addr = self.headers[ - self.app.config.REAL_IP_HEADER - ] - elif self.app.config.FORWARDED_FOR_HEADER: - forwarded_for = self.headers.get( - self.app.config.FORWARDED_FOR_HEADER, "" - ).split(",") - remote_addrs = [ - addr - for addr in [addr.strip() for addr in forwarded_for] - if addr - ] - if self.app.config.PROXIES_COUNT == -1: - self._remote_addr = remote_addrs[0] - elif len(remote_addrs) >= self.app.config.PROXIES_COUNT: - self._remote_addr = remote_addrs[ - -self.app.config.PROXIES_COUNT - ] - else: - self._remote_addr = "" - else: - self._remote_addr = "" + self._remote_addr = self.forwarded.get("for") or "" return self._remote_addr @property @@ -451,9 +425,7 @@ class Request(dict): :return: http|https|ws|wss or arbitrary value given by the headers. :rtype: str """ - forwarded_proto = self.headers.get( - "x-forwarded-proto" - ) or self.headers.get("x-scheme") + forwarded_proto = self.forwarded.get("proto") if forwarded_proto: return forwarded_proto