From 155053ea61bb7a9afc19dc289886231e238bb298 Mon Sep 17 00:00:00 2001
From: Victor Stinner <victor.stinner@enovance.com>
Date: Mon, 31 Mar 2014 12:40:24 +0200
Subject: [PATCH] Fix swiftclient.client.quote() for Python 3

On Python 3, urllib.parse.quote() accepts bytes and str (unicode) types and
always return str (unicode).

Add also more tests with non-ASCII characters.

Change-Id: I8e0f19da7240e874392327d0da074ed4abb7d213
---
 swiftclient/client.py     |  5 ++++-
 tests/test_swiftclient.py | 12 ++++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/swiftclient/client.py b/swiftclient/client.py
index 01dbaa1e..27664614 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -97,8 +97,11 @@ def http_log(args, kwargs, resp, body):
 
 def quote(value, safe='/'):
     """
-    Patched version of urllib.quote that encodes utf8 strings before quoting
+    Patched version of urllib.quote that encodes utf8 strings before quoting.
+    On Python 3, call directly urllib.parse.quote().
     """
+    if six.PY3:
+        return _quote(value, safe=safe)
     value = encode_utf8(value)
     if isinstance(value, bytes):
         return _quote(value, safe)
diff --git a/tests/test_swiftclient.py b/tests/test_swiftclient.py
index 80f074c4..f18856d1 100644
--- a/tests/test_swiftclient.py
+++ b/tests/test_swiftclient.py
@@ -182,10 +182,14 @@ class MockHttpResponse():
 class TestHttpHelpers(MockHttpTest):
 
     def test_quote(self):
-        value = 'standard string'
-        self.assertEqual(b'standard%20string', c.quote(value))
-        value = u'\u0075nicode string'
-        self.assertEqual(b'unicode%20string', c.quote(value))
+        value = b'bytes\xff'
+        self.assertEqual('bytes%FF', c.quote(value))
+        value = 'native string'
+        self.assertEqual('native%20string', c.quote(value))
+        value = u'unicode string'
+        self.assertEqual('unicode%20string', c.quote(value))
+        value = u'unicode:\xe9\u20ac'
+        self.assertEqual('unicode%3A%C3%A9%E2%82%AC', c.quote(value))
 
     def test_http_connection(self):
         url = 'http://www.test.com'