Skip to content

Commit

Permalink
Force header keys/values to bytes/unicode before coercing to unicode
Browse files Browse the repository at this point in the history
Previously, parse_header_string was only called with data coming out of
requests, which would be either bytes or unicode. Now that we're sending
it request headers as well (see related change), we need to be more
defensive.

If the value given is neither bytes nor unicode, convert it to a native
string. This will allow developers using the client API to continue
sending header dicts like

  {'X-Delete-After': 2}

...as in Swift's test/probe/test_object_expirer.py

Change-Id: Ie57a93274507b184af5cad4260f244359a585f09
Related-Change: I43dd7254f7281d4db59b286aa2145643c64e1705
  • Loading branch information
tipabu committed Feb 26, 2016
1 parent ee90547 commit aa0edd0
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
2 changes: 2 additions & 0 deletions swiftclient/client.py
Expand Up @@ -169,6 +169,8 @@ def http_log(args, kwargs, resp, body):


def parse_header_string(data):
if not isinstance(data, (six.text_type, six.binary_type)):
data = str(data)
if six.PY2:
if isinstance(data, six.text_type):
# Under Python2 requests only returns binary_type, but if we get
Expand Down
7 changes: 5 additions & 2 deletions tests/unit/test_swiftclient.py
Expand Up @@ -1203,13 +1203,16 @@ class TestPostObject(MockHttpTest):

def test_ok(self):
c.http_connection = self.fake_http_connection(200)
delete_at = 2.1 # not str! we don't know what other devs will use!
args = ('http://www.test.com', 'token', 'container', 'obj',
{'X-Object-Meta-Test': 'mymeta'})
{'X-Object-Meta-Test': 'mymeta',
'X-Delete-At': delete_at})
c.post_object(*args)
self.assertRequests([
('POST', '/container/obj', '', {
'x-auth-token': 'token',
'X-Object-Meta-Test': 'mymeta'}),
'X-Object-Meta-Test': 'mymeta',
'X-Delete-At': delete_at}),
])

def test_unicode_ok(self):
Expand Down

0 comments on commit aa0edd0

Please sign in to comment.