From ccaa7eda3ee392cb11e39c3f733e9e726fc25a09 Mon Sep 17 00:00:00 2001 From: Thomas Steen Rasmussen Date: Wed, 19 Apr 2017 16:19:09 +0200 Subject: [PATCH 1/3] fix check for x-forwarded-for header for WS connections --- daphne/utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/daphne/utils.py b/daphne/utils.py index cb8043c..1ffa3ee 100644 --- a/daphne/utils.py +++ b/daphne/utils.py @@ -27,6 +27,9 @@ def parse_x_forwarded_for(headers, # Convert twisted-style headers into dicts if isinstance(headers, Headers): headers = dict(headers.getAllRawHeaders()) + else: + # convert non twisted headers dict into utf-8 + headers = {name.encode("utf-8"): values.encode("utf-8") for name, values in headers.items()} # Lowercase all header names in the dict headers = {name.lower(): values for name, values in headers.items()} From cc870105f1e099e9fa2f7ed0153b303dfdc1e0d4 Mon Sep 17 00:00:00 2001 From: Thomas Steen Rasmussen Date: Wed, 19 Apr 2017 22:45:51 +0200 Subject: [PATCH 2/3] only encode header keys, not values; only decode value when instance of bytes --- daphne/utils.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/daphne/utils.py b/daphne/utils.py index 1ffa3ee..db16312 100644 --- a/daphne/utils.py +++ b/daphne/utils.py @@ -5,7 +5,9 @@ def header_value(headers, header_name): value = headers[header_name] if isinstance(value, list): value = value[0] - return value.decode("utf-8") + if isinstance(value, bytes): + value = value.decode("utf-8") + return value def parse_x_forwarded_for(headers, @@ -24,15 +26,14 @@ def parse_x_forwarded_for(headers, if not address_header_name: return original - # Convert twisted-style headers into dicts if isinstance(headers, Headers): + # Convert twisted-style headers into dicts headers = dict(headers.getAllRawHeaders()) + # Lowercase header keys + headers = {name.lower(): values for name, values in headers.items()} else: - # convert non twisted headers dict into utf-8 - headers = {name.encode("utf-8"): values.encode("utf-8") for name, values in headers.items()} - - # Lowercase all header names in the dict - headers = {name.lower(): values for name, values in headers.items()} + # Lowercase and encode header keys + headers = {name.lower().encode("utf-8"): values for name, values in headers.items()} address_header_name = address_header_name.lower().encode("utf-8") result = original From 61454dafb5a2ff69b1db1c915a89f15fe43c54c8 Mon Sep 17 00:00:00 2001 From: Thomas Steen Rasmussen Date: Wed, 19 Apr 2017 23:05:25 +0200 Subject: [PATCH 3/3] only encode header keys as utf8 when not already bytes --- daphne/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daphne/utils.py b/daphne/utils.py index db16312..dc3a85e 100644 --- a/daphne/utils.py +++ b/daphne/utils.py @@ -33,7 +33,7 @@ def parse_x_forwarded_for(headers, headers = {name.lower(): values for name, values in headers.items()} else: # Lowercase and encode header keys - headers = {name.lower().encode("utf-8"): values for name, values in headers.items()} + headers = {name.lower() if isinstance(name, bytes) else name.lower().encode("utf-8"): values for name, values in headers.items()} address_header_name = address_header_name.lower().encode("utf-8") result = original