Skip to content

Commit 24a9d0f

Browse files
committed
Handle comma-separated values in x-forwarded-port header
1 parent ad1b280 commit 24a9d0f

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

azure/functions/_http_wsgi.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ def to_environ(self, errors_buffer: StringIO) -> Dict[str, Any]:
113113
def _get_port(self, parsed_url, lowercased_headers: Dict[str, str]) -> int:
114114
port: int = 80
115115
if lowercased_headers.get('x-forwarded-port'):
116-
return int(lowercased_headers['x-forwarded-port'])
116+
# Handle comma-separated port values (e.g., "443,8080,433")
117+
forwarded_port = lowercased_headers['x-forwarded-port'].split(',')[0].strip()
118+
return int(forwarded_port)
117119
elif getattr(parsed_url, 'port', None):
118120
return int(parsed_url.port)
119121
elif parsed_url.scheme == 'https':

tests/test_http_wsgi.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,24 @@ def test_request_protocol_by_header(self):
100100
self.assertEqual(environ['SERVER_PORT'], str(8081))
101101
self.assertEqual(environ['wsgi.url_scheme'], 'https')
102102

103+
def test_request_protocol_by_header_with_multiple_ports(self):
104+
func_request = self._generate_func_request(headers={
105+
"x-forwarded-port": "443,8080,433"
106+
})
107+
error_buffer = StringIO()
108+
environ = WsgiRequest(func_request).to_environ(error_buffer)
109+
self.assertEqual(environ['SERVER_PORT'], str(443))
110+
self.assertEqual(environ['wsgi.url_scheme'], 'https')
111+
112+
def test_request_protocol_by_header_with_spaces(self):
113+
func_request = self._generate_func_request(headers={
114+
"x-forwarded-port": " 8443 , 8080 "
115+
})
116+
error_buffer = StringIO()
117+
environ = WsgiRequest(func_request).to_environ(error_buffer)
118+
self.assertEqual(environ['SERVER_PORT'], str(8443))
119+
self.assertEqual(environ['wsgi.url_scheme'], 'https')
120+
103121
def test_request_protocol_by_scheme(self):
104122
func_request = self._generate_func_request(url="http://a.b.com")
105123
error_buffer = StringIO()

0 commit comments

Comments
 (0)