Use host header values only when the ports match

This commit is contained in:
Shadab Zafar 2016-02-18 07:01:52 +05:30
parent 6f96da08c9
commit 175109e44e
2 changed files with 12 additions and 3 deletions

View File

@ -183,7 +183,12 @@ class Request(Message):
This is useful in transparent mode where :py:attr:`host` is only an IP address, This is useful in transparent mode where :py:attr:`host` is only an IP address,
but may not reflect the actual destination as the Host header could be spoofed. but may not reflect the actual destination as the Host header could be spoofed.
""" """
return self._parse_host_header()[0] or self.host host, port = self._parse_host_header()
if not host:
return self.host
if not port:
port = 443 if self.scheme == 'https' else 80
return host if port == self.port else self.host
@property @property
def pretty_url(self): def pretty_url(self):

View File

@ -104,19 +104,23 @@ class TestRequestUtils(object):
def test_pretty_host(self): def test_pretty_host(self):
request = treq() request = treq()
# Without host header
assert request.pretty_host == "address" assert request.pretty_host == "address"
assert request.host == "address" assert request.host == "address"
# Same port as self.port (22)
request.headers["host"] = "other:22" request.headers["host"] = "other:22"
assert request.pretty_host == "other" assert request.pretty_host == "other"
# Different Ports
request.headers["host"] = "other" request.headers["host"] = "other"
assert request.pretty_host == "other" assert request.pretty_host == "address"
assert request.host == "address" assert request.host == "address"
# Empty host
request.host = None request.host = None
assert request.pretty_host is None assert request.pretty_host is None
assert request.host is None assert request.host is None
# Invalid IDNA # Invalid IDNA
request.headers["host"] = ".disqus.com" request.headers["host"] = ".disqus.com:22"
assert request.pretty_host == ".disqus.com" assert request.pretty_host == ".disqus.com"
def test_pretty_url(self): def test_pretty_url(self):