|
|
@@ -752,11 +752,13 @@ def test_get_environment_values(self): |
|
|
# nail the keys of environ
|
|
|
self.assertEqual(sorted(environ.keys()), [
|
|
|
'CONTENT_LENGTH', 'CONTENT_TYPE', 'HTTP_CONNECTION', 'HTTP_X_FOO',
|
|
|
'PATH_INFO', 'QUERY_STRING', 'REMOTE_ADDR', 'REQUEST_METHOD',
|
|
|
'SCRIPT_NAME', 'SERVER_NAME', 'SERVER_PORT', 'SERVER_PROTOCOL',
|
|
|
'SERVER_SOFTWARE', 'wsgi.errors', 'wsgi.file_wrapper', 'wsgi.input',
|
|
|
'wsgi.input_terminated', 'wsgi.multiprocess', 'wsgi.multithread',
|
|
|
'wsgi.run_once', 'wsgi.url_scheme', 'wsgi.version'])
|
|
|
'PATH_INFO', 'QUERY_STRING', 'REMOTE_ADDR', 'REMOTE_HOST',
|
|
|
'REMOTE_PORT', 'REQUEST_METHOD', 'SCRIPT_NAME', 'SERVER_NAME',
|
|
|
'SERVER_PORT', 'SERVER_PROTOCOL', 'SERVER_SOFTWARE', 'wsgi.errors',
|
|
|
'wsgi.file_wrapper', 'wsgi.input', 'wsgi.input_terminated',
|
|
|
'wsgi.multiprocess', 'wsgi.multithread', 'wsgi.run_once',
|
|
|
'wsgi.url_scheme', 'wsgi.version'
|
|
|
])
|
|
|
|
|
|
self.assertEqual(environ['REQUEST_METHOD'], 'GET')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '80')
|
|
|
@@ -768,6 +770,8 @@ def test_get_environment_values(self): |
|
|
self.assertEqual(environ['PATH_INFO'], '/')
|
|
|
self.assertEqual(environ['QUERY_STRING'], 'abc')
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '127.0.0.1')
|
|
|
self.assertEqual(environ['REMOTE_HOST'], '127.0.0.1')
|
|
|
self.assertEqual(environ['REMOTE_PORT'], '39830')
|
|
|
self.assertEqual(environ['CONTENT_TYPE'], 'abc')
|
|
|
self.assertEqual(environ['CONTENT_LENGTH'], '10')
|
|
|
self.assertEqual(environ['HTTP_X_FOO'], 'BAR')
|
|
|
@@ -799,7 +803,7 @@ def test_get_environment_values_w_scheme_override_untrusted(self): |
|
|
def test_get_environment_values_w_scheme_override_trusted(self):
|
|
|
import sys
|
|
|
inst = self._makeOne()
|
|
|
inst.channel.addr = ['192.168.1.1']
|
|
|
inst.channel.addr = ['192.168.1.1', 8080]
|
|
|
inst.channel.server.adj.trusted_proxy = '192.168.1.1'
|
|
|
request = DummyParser()
|
|
|
request.headers = {
|
|
|
@@ -816,14 +820,16 @@ def test_get_environment_values_w_scheme_override_trusted(self): |
|
|
# nail the keys of environ
|
|
|
self.assertEqual(sorted(environ.keys()), [
|
|
|
'CONTENT_LENGTH', 'CONTENT_TYPE', 'HTTP_CONNECTION', 'HTTP_X_FOO',
|
|
|
'PATH_INFO', 'QUERY_STRING', 'REMOTE_ADDR', 'REQUEST_METHOD',
|
|
|
'SCRIPT_NAME', 'SERVER_NAME', 'SERVER_PORT', 'SERVER_PROTOCOL',
|
|
|
'SERVER_SOFTWARE', 'wsgi.errors', 'wsgi.file_wrapper', 'wsgi.input',
|
|
|
'HTTP_X_FORWARDED_PROTO', 'PATH_INFO', 'QUERY_STRING',
|
|
|
'REMOTE_ADDR', 'REMOTE_HOST', 'REQUEST_METHOD', 'SCRIPT_NAME',
|
|
|
'SERVER_NAME', 'SERVER_PORT', 'SERVER_PROTOCOL', 'SERVER_SOFTWARE',
|
|
|
'wsgi.errors', 'wsgi.file_wrapper', 'wsgi.input',
|
|
|
'wsgi.input_terminated', 'wsgi.multiprocess', 'wsgi.multithread',
|
|
|
'wsgi.run_once', 'wsgi.url_scheme', 'wsgi.version'])
|
|
|
'wsgi.run_once', 'wsgi.url_scheme', 'wsgi.version'
|
|
|
])
|
|
|
|
|
|
self.assertEqual(environ['REQUEST_METHOD'], 'GET')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '80')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '443')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'localhost')
|
|
|
self.assertEqual(environ['SERVER_SOFTWARE'], 'waitress')
|
|
|
self.assertEqual(environ['SERVER_PROTOCOL'], 'HTTP/1.0')
|
|
|
@@ -861,6 +867,289 @@ def test_get_environment_values_w_bogus_scheme_override(self): |
|
|
inst.request = request
|
|
|
self.assertRaises(ValueError, inst.get_environment)
|
|
|
|
|
|
|
|
|
def test_parse_proxy_headers_forwarded_for(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'X_FORWARDED_FOR': '192.0.2.1'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=False
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '192.0.2.1')
|
|
|
|
|
|
def test_parse_proxy_headers_forwarded_for_v6_missing_brackets(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'X_FORWARDED_FOR': '2001:db8::0'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=False
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '[2001:db8::0]')
|
|
|
|
|
|
def test_parse_proxy_headers_forwared_for_multiple(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'X_FORWARDED_FOR': '192.0.2.1, 198.51.100.2, 203.0.113.1'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=2
|
|
|
)
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
|
|
|
def test_parse_forwarded_multiple_proxies(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For=192.0.2.1;host=fake.com, For=198.51.100.2;host=example.com:8080, For=203.0.113.1'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=2,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'example.com')
|
|
|
self.assertEqual(environ['HTTP_HOST'], 'example.com:8080')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '8080')
|
|
|
|
|
|
def test_parse_proxy_headers_forwarded_host_with_port(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'X_FORWARDED_FOR': '192.0.2.1, 198.51.100.2, 203.0.113.1',
|
|
|
'X_FORWARDED_PROTO': 'http',
|
|
|
'X_FORWARDED_HOST': 'example.com:8080',
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=2,
|
|
|
trusted_proxy_forwarded=False,
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'example.com')
|
|
|
self.assertEqual(environ['HTTP_HOST'], 'example.com:8080')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '8080')
|
|
|
|
|
|
def test_parse_proxy_headers_forwarded_host_without_port(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'X_FORWARDED_FOR': '192.0.2.1, 198.51.100.2, 203.0.113.1',
|
|
|
'X_FORWARDED_PROTO': 'http',
|
|
|
'X_FORWARDED_HOST': 'example.com',
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=2,
|
|
|
trusted_proxy_forwarded=False,
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'example.com')
|
|
|
self.assertEqual(environ['HTTP_HOST'], 'example.com')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '80')
|
|
|
|
|
|
def test_parse_proxy_headers_forwarded_host_with_forwarded_port(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'X_FORWARDED_FOR': '192.0.2.1, 198.51.100.2, 203.0.113.1',
|
|
|
'X_FORWARDED_PROTO': 'http',
|
|
|
'X_FORWARDED_HOST': 'example.com',
|
|
|
'X_FORWARDED_PORT': '8080'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=2,
|
|
|
trusted_proxy_forwarded=False,
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'example.com')
|
|
|
self.assertEqual(environ['HTTP_HOST'], 'example.com:8080')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '8080')
|
|
|
|
|
|
def test_parse_forwarded(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For=198.51.100.2:5858;host=example.com:8080;proto=https'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
self.assertEqual(environ['REMOTE_PORT'], '5858')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'example.com')
|
|
|
self.assertEqual(environ['HTTP_HOST'], 'example.com:8080')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '8080')
|
|
|
self.assertEqual(environ['wsgi.url_scheme'], 'https')
|
|
|
|
|
|
def test_parse_forwarded_warning_other_proxy_headers(self):
|
|
|
inst = self._makeOne()
|
|
|
inst.logger = DummyLogger()
|
|
|
|
|
|
headers = {
|
|
|
'X_FORWARDED_FOR': '[2001:db8::1]',
|
|
|
'FORWARDED': 'For=198.51.100.2;host=example.com:8080;proto=https'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
self.assertEqual(len(inst.logger.logged), 1)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'example.com')
|
|
|
self.assertEqual(environ['HTTP_HOST'], 'example.com:8080')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '8080')
|
|
|
self.assertEqual(environ['wsgi.url_scheme'], 'https')
|
|
|
|
|
|
def test_parse_forwarded_empty_pair(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For=198.51.100.2;;proto=https;by=_unused'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
|
|
|
def test_parse_forwarded_pair_token_whitespace(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For=198.51.100.2; proto =https'
|
|
|
}
|
|
|
environ = {}
|
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
def test_parse_forwarded_pair_value_whitespace(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For= "198.51.100.2"; proto =https'
|
|
|
}
|
|
|
environ = {}
|
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
def test_parse_forwarded_pair_no_equals(self):
|
|
|
inst = self._makeOne()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For'
|
|
|
}
|
|
|
environ = {}
|
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
def test_parse_forwarded_warning_unknown_token(self):
|
|
|
inst = self._makeOne()
|
|
|
inst.logger = DummyLogger()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For=198.51.100.2;host=example.com:8080;proto=https;unknown="yolo"'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=True
|
|
|
)
|
|
|
|
|
|
self.assertEqual(len(inst.logger.logged), 1)
|
|
|
self.assertIn('Unknown Forwarded token', inst.logger.logged[0])
|
|
|
|
|
|
self.assertEqual(environ['REMOTE_ADDR'], '198.51.100.2')
|
|
|
self.assertEqual(environ['SERVER_NAME'], 'example.com')
|
|
|
self.assertEqual(environ['HTTP_HOST'], 'example.com:8080')
|
|
|
self.assertEqual(environ['SERVER_PORT'], '8080')
|
|
|
self.assertEqual(environ['wsgi.url_scheme'], 'https')
|
|
|
|
|
|
def test_parse_forwarded_warning_forwarded_exists(self):
|
|
|
inst = self._makeOne()
|
|
|
inst.logger = DummyLogger()
|
|
|
|
|
|
headers = {
|
|
|
'FORWARDED': 'For=198.51.100.2'
|
|
|
}
|
|
|
environ = {}
|
|
|
inst.parse_proxy_headers(
|
|
|
environ,
|
|
|
headers,
|
|
|
trusted_proxy_count=1,
|
|
|
trusted_proxy_forwarded=False
|
|
|
)
|
|
|
|
|
|
self.assertEqual(len(inst.logger.logged), 1)
|
|
|
self.assertIn('Forwarded header was present', inst.logger.logged[0])
|
|
|
self.assertNotIn('FORWARDED', headers)
|
|
|
|
|
|
|
|
|
class TestErrorTask(unittest.TestCase):
|
|
|
|
|
|
def _makeOne(self, channel=None, request=None):
|
|
|
@@ -969,8 +1258,11 @@ class DummyAdj(object): |
|
|
port = 80
|
|
|
url_prefix = ''
|
|
|
trusted_proxy = None
|
|
|
trusted_proxy_count = 1
|
|
|
trusted_proxy_forwarded = False
|
|
|
|
|
|
class DummyServer(object):
|
|
|
trusted_proxy = False
|
|
|
server_name = 'localhost'
|
|
|
effective_port = 80
|
|
|
|
|
|
@@ -981,7 +1273,7 @@ class DummyChannel(object): |
|
|
closed_when_done = False
|
|
|
adj = DummyAdj()
|
|
|
creation_time = 0
|
|
|
addr = ['127.0.0.1']
|
|
|
addr = ('127.0.0.1', 39830)
|
|
|
|
|
|
def __init__(self, server=None):
|
|
|
if server is None:
|
|
|
|