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()
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():

View File

@ -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