diff --git a/api/funkwhale_api/federation/utils.py b/api/funkwhale_api/federation/utils.py index e83f54b5d..df093add8 100644 --- a/api/funkwhale_api/federation/utils.py +++ b/api/funkwhale_api/federation/utils.py @@ -12,3 +12,24 @@ def full_url(path): return root + '/' + path else: return root + path + + +def clean_wsgi_headers(raw_headers): + """ + Convert WSGI headers from CONTENT_TYPE to Content-Type notation + """ + cleaned = {} + non_prefixed = [ + 'content_type', + 'content_length', + ] + for raw_header, value in raw_headers.items(): + h = raw_header.lower() + if not h.startswith('http_') and h not in non_prefixed: + continue + + words = h.replace('http_', '', 1).split('_') + cleaned_header = '-'.join([w.capitalize() for w in words]) + cleaned[cleaned_header] = value + + return cleaned diff --git a/api/tests/federation/test_utils.py b/api/tests/federation/test_utils.py index 8bada65bb..dc371ad9e 100644 --- a/api/tests/federation/test_utils.py +++ b/api/tests/federation/test_utils.py @@ -12,3 +12,37 @@ from funkwhale_api.federation import utils def test_full_url(settings, url, path, expected): settings.FUNKWHALE_URL = url assert utils.full_url(path) == expected + + +def test_extract_headers_from_meta(): + wsgi_headers = { + 'HTTP_HOST': 'nginx', + 'HTTP_X_REAL_IP': '172.20.0.4', + 'HTTP_X_FORWARDED_FOR': '188.165.228.227, 172.20.0.4', + 'HTTP_X_FORWARDED_PROTO': 'http', + 'HTTP_X_FORWARDED_HOST': 'localhost:80', + 'HTTP_X_FORWARDED_PORT': '80', + 'HTTP_CONNECTION': 'close', + 'CONTENT_LENGTH': '1155', + 'CONTENT_TYPE': 'txt/application', + 'HTTP_SIGNATURE': 'Hello', + 'HTTP_DATE': 'Sat, 31 Mar 2018 13:53:55 GMT', + 'HTTP_USER_AGENT': 'http.rb/3.0.0 (Mastodon/2.2.0; +https://mastodon.eliotberriot.com/)'} + + cleaned_headers = utils.clean_wsgi_headers(wsgi_headers) + + expected = { + 'Host': 'nginx', + 'X-Real-Ip': '172.20.0.4', + 'X-Forwarded-For': '188.165.228.227, 172.20.0.4', + 'X-Forwarded-Proto': 'http', + 'X-Forwarded-Host': 'localhost:80', + 'X-Forwarded-Port': '80', + 'Connection': 'close', + 'Content-Length': '1155', + 'Content-Type': 'txt/application', + 'Signature': 'Hello', + 'Date': 'Sat, 31 Mar 2018 13:53:55 GMT', + 'User-Agent': 'http.rb/3.0.0 (Mastodon/2.2.0; +https://mastodon.eliotberriot.com/)' + } + assert cleaned_headers == expected