diff --git a/azure/functions/_http_wsgi.py b/azure/functions/_http_wsgi.py index f51317e1..173a8e7e 100644 --- a/azure/functions/_http_wsgi.py +++ b/azure/functions/_http_wsgi.py @@ -113,7 +113,9 @@ def to_environ(self, errors_buffer: StringIO) -> Dict[str, Any]: def _get_port(self, parsed_url, lowercased_headers: Dict[str, str]) -> int: port: int = 80 if lowercased_headers.get('x-forwarded-port'): - return int(lowercased_headers['x-forwarded-port']) + # Handle comma-separated port values (e.g., "443,8080,433") + forwarded_port = lowercased_headers['x-forwarded-port'].split(',')[0].strip() + return int(forwarded_port) elif getattr(parsed_url, 'port', None): return int(parsed_url.port) elif parsed_url.scheme == 'https': diff --git a/tests/test_http_wsgi.py b/tests/test_http_wsgi.py index 224d35dd..fa0fae5a 100644 --- a/tests/test_http_wsgi.py +++ b/tests/test_http_wsgi.py @@ -100,6 +100,24 @@ def test_request_protocol_by_header(self): self.assertEqual(environ['SERVER_PORT'], str(8081)) self.assertEqual(environ['wsgi.url_scheme'], 'https') + def test_request_protocol_by_header_with_multiple_ports(self): + func_request = self._generate_func_request(headers={ + "x-forwarded-port": "443,8080,433" + }) + error_buffer = StringIO() + environ = WsgiRequest(func_request).to_environ(error_buffer) + self.assertEqual(environ['SERVER_PORT'], str(443)) + self.assertEqual(environ['wsgi.url_scheme'], 'https') + + def test_request_protocol_by_header_with_spaces(self): + func_request = self._generate_func_request(headers={ + "x-forwarded-port": " 8443 , 8080 " + }) + error_buffer = StringIO() + environ = WsgiRequest(func_request).to_environ(error_buffer) + self.assertEqual(environ['SERVER_PORT'], str(8443)) + self.assertEqual(environ['wsgi.url_scheme'], 'https') + def test_request_protocol_by_scheme(self): func_request = self._generate_func_request(url="http://a.b.com") error_buffer = StringIO()