Convert dict headers and Webob headers into lowercase.

In the fold_headers function, if the headers behaves like a dict,
they were being retured unchanged. This would cause issues in the
later processing to extract the microversion header, which matches
on lower case strings.

Convert these headers to lowercase also provide a test case to
validate the header is being parsed correctly.

Change-Id: I8501c813d668c0a32905906e4ef3f8c6c6b12de2
Close-Bug:# 1606351
This commit is contained in:
PollyZ 2016-07-26 15:28:18 -05:00
parent c031779d58
commit 1f6eac7c3d
3 changed files with 12 additions and 3 deletions

View File

@ -90,8 +90,7 @@ def fold_headers(headers):
# If it behaves like a dict, return it. Webob uses objects which
# are not dicts, but behave like them.
if hasattr(headers, 'keys'):
# TODO(cdent): canonicalize? (i.e. in lower())
return headers
return dict((k.lower(), v) for k, v in headers.items())
header_dict = collections.defaultdict(list)
for header, value in headers:
header_dict[header.lower()].append(value.strip())

View File

@ -216,3 +216,12 @@ class TestGetHeaders(testtools.TestCase):
headers, service_type='compute',
legacy_headers=['x-openstack-nova-api-version'])
self.assertEqual('2.0', version)
def test_capitalized_headers(self):
headers = {
'X-Openstack-Ironic-Api-Version': '123.456'
}
version = microversion_parse.get_version(
headers, service_type='ironic',
legacy_headers=['X-Openstack-Ironic-Api-Version'])
self.assertEqual('123.456', version)

View File

@ -30,7 +30,8 @@ class TestWebobHeaders(testtools.TestCase):
folded_headers = microversion_parse.fold_headers(headers)
self.assertEqual(3, len(folded_headers))
self.assertEqual(set(headers.keys()), set(folded_headers.keys()))
self.assertEqual(set(['header-one', 'header-three', 'header-two']),
set(folded_headers.keys()))
self.assertEqual('gamma', folded_headers['header-three'])
def test_simple_match(self):