mirror of
https://github.com/django/daphne.git
synced 2025-04-25 03:03:47 +03:00
49 lines
1.9 KiB
Python
49 lines
1.9 KiB
Python
|
|
|
|
def parse_x_forwarded_for(headers,
|
|
address_header_name='X-Forwarded-For',
|
|
port_header_name='X-Forwarded-Port',
|
|
original=None):
|
|
"""
|
|
Parses an X-Forwarded-For header and returns a host/port pair as a list.
|
|
|
|
@param headers: The twisted-style object containing a request's headers
|
|
@param address_header_name: The name of the expected host header
|
|
@param port_header_name: The name of the expected port header
|
|
@param original: A host/port pair that should be returned if the headers are not in the request
|
|
@return: A list containing a host (string) as the first entry and a port (int) as the second.
|
|
"""
|
|
if not address_header_name:
|
|
return original
|
|
|
|
address_header_name = address_header_name.lower().encode("utf-8")
|
|
result = original
|
|
if headers.hasHeader(address_header_name):
|
|
address_value = headers.getRawHeaders(address_header_name)[0].decode("utf-8")
|
|
|
|
if ',' in address_value:
|
|
address_value = address_value.split(",")[-1].strip()
|
|
|
|
if ':' in address_value:
|
|
address_host, address_port = address_value.split(':')
|
|
result = [address_host, 0]
|
|
try:
|
|
result[1] = int(address_port)
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
result = [address_value, 0]
|
|
|
|
if port_header_name:
|
|
# We only want to parse the X-Forwarded-Port header if we also parsed the X-Forwarded-For
|
|
# header to avoid inconsistent results.
|
|
port_header_name = port_header_name.lower().encode("utf-8")
|
|
if headers.hasHeader(port_header_name):
|
|
port_value = headers.getRawHeaders(port_header_name)[0].decode("utf-8")
|
|
try:
|
|
result[1] = int(port_value)
|
|
except ValueError:
|
|
pass
|
|
|
|
return result
|