Use req.forwarded in req properties server_name, server_port, scheme and remote_addr.

X-Scheme handling moved to parse_xforwarded.
This commit is contained in:
L. Kärkkäinen 2019-07-20 16:36:18 +03:00
parent f69383db04
commit b896454135
2 changed files with 8 additions and 33 deletions

View File

@ -39,7 +39,10 @@ def parse_xforwarded(headers, config):
addr = addr.strip() addr = addr.strip()
if not addr: if not addr:
return None 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}} return {'for': addr, **{h: v for h, v in other if v}}
def test_parse_forwarded(): def test_parse_forwarded():

View File

@ -372,7 +372,7 @@ class Request(dict):
""" """
return ( return (
self.app.config.get("SERVER_NAME") self.app.config.get("SERVER_NAME")
or self.headers.get("x-forwarded-host") or self.forwarded.get("host")
or self.host.split(":")[0] or self.host.split(":")[0]
) )
@ -394,7 +394,7 @@ class Request(dict):
:return: server port :return: server port
:rtype: int :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 self.host.split(":")[1] if ":" in self.host else None
) )
if forwarded_port: if forwarded_port:
@ -412,33 +412,7 @@ class Request(dict):
:return: original client ip. :return: original client ip.
""" """
if not hasattr(self, "_remote_addr"): if not hasattr(self, "_remote_addr"):
if self.app.config.PROXIES_COUNT == 0: self._remote_addr = self.forwarded.get("for") or ""
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 = ""
return self._remote_addr return self._remote_addr
@property @property
@ -451,9 +425,7 @@ class Request(dict):
:return: http|https|ws|wss or arbitrary value given by the headers. :return: http|https|ws|wss or arbitrary value given by the headers.
:rtype: str :rtype: str
""" """
forwarded_proto = self.headers.get( forwarded_proto = self.forwarded.get("proto")
"x-forwarded-proto"
) or self.headers.get("x-scheme")
if forwarded_proto: if forwarded_proto:
return forwarded_proto return forwarded_proto