summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-08-02 07:55:23 +0000
committerGerrit Code Review <review@openstack.org>2019-08-02 07:55:23 +0000
commit4f320bd0345e8790a634f5713b1ed77ae3271c54 (patch)
tree29e5e208780de551fd40b41ab3ae46fb160f5899
parent78753987468cb6b04d0b4e06b432e22f5a7189bd (diff)
parent7175069b3e95c38070bb4373019f78c87ab103d0 (diff)
downloadpython-swiftclient-4f320bd0345e8790a634f5713b1ed77ae3271c54.tar.gz
Merge "Fix up requests so we can send non-RFC-compliant headers on py3"
-rw-r--r--swiftclient/client.py6
-rw-r--r--tests/functional/test_swiftclient.py17
2 files changed, 21 insertions, 2 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py
index f071182..4be2e2d 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -74,8 +74,10 @@ except ImportError:
pass
# requests version 1.2.3 try to encode headers in ascii, preventing
-# utf-8 encoded header to be 'prepared'
-if StrictVersion(requests.__version__) < StrictVersion('2.0.0'):
+# utf-8 encoded header to be 'prepared'. This also affects all
+# (or at least most) versions of requests on py3
+if StrictVersion(requests.__version__) < StrictVersion('2.0.0') \
+ or not six.PY2:
from requests.structures import CaseInsensitiveDict
def prepare_unicode_headers(self, headers):
diff --git a/tests/functional/test_swiftclient.py b/tests/functional/test_swiftclient.py
index bae3044..9a74c63 100644
--- a/tests/functional/test_swiftclient.py
+++ b/tests/functional/test_swiftclient.py
@@ -18,6 +18,7 @@ import unittest
import time
from io import BytesIO
+import six
from six.moves import configparser
import swiftclient
@@ -446,6 +447,22 @@ class TestFunctional(unittest.TestCase):
self.assertEqual('45.67', headers.get('x-object-meta-float'))
self.assertEqual('False', headers.get('x-object-meta-bool'))
+ def test_post_object_unicode_header_name(self):
+ self.conn.post_object(self.containername,
+ self.objectname,
+ {u'x-object-meta-\U0001f44d': u'\U0001f44d'})
+
+ # Note that we can't actually read this header back on py3; see
+ # https://bugs.python.org/issue37093
+ # We'll have to settle for just testing that the POST doesn't blow up
+ # with a UnicodeDecodeError
+ if six.PY2:
+ headers = self.conn.head_object(
+ self.containername, self.objectname)
+ self.assertIn(u'x-object-meta-\U0001f44d', headers)
+ self.assertEqual(u'\U0001f44d',
+ headers.get(u'x-object-meta-\U0001f44d'))
+
def test_copy_object(self):
self.conn.put_object(
self.containername, self.objectname, self.test_data)