From 1838f43effef4167d3d07f3e01c5e2cdb5b91a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=2E=20K=C3=A4rkk=C3=A4inen?= Date: Sat, 20 Jul 2019 16:52:35 +0300 Subject: [PATCH] Cleanup and fix req.server_port; no longer reports socket port if any forwards headers are used. --- sanic/request.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/sanic/request.py b/sanic/request.py index 0ac96386..b638d1b5 100644 --- a/sanic/request.py +++ b/sanic/request.py @@ -389,19 +389,20 @@ class Request(dict): def server_port(self): """ Attempt to get the server's port in this order: - `x-forwarded-port` header, :func:`Request.host`, actual port used by - the transport layer socket. + `forwarded` header, `x-forwarded-port` header, :func:`Request.host`, + actual port used by the transport layer socket. :return: server port :rtype: int """ - forwarded_port = self.forwarded.get("port") or ( - self.host.split(":")[1] if ":" in self.host else None - ) - if forwarded_port: - return int(forwarded_port) + if self.forwarded: + forwarded_port = self.forwarded.get("port") or ( + "80" if self.scheme in ("http", "ws") else "443" + ) + elif ":" in self.host: + forwarded_port = self.host.split(":")[1] else: - _, port = self.transport.get_extra_info("sockname") - return port + return self.transport.get_extra_info("sockname")[1] + return int(forwarded_port) @property def remote_addr(self):