Author: jpotts
Date: Fri Sep 2 18:25:50 2016
New Revision: 1759001
URL: http://svn.apache.org/viewvc?rev=1759001&view=rev
Log:
Fix UnicodeEncodeError when calling urlencode with a dict that contains accents
to close #CMIS-995
Modified:
chemistry/cmislib/trunk/src/cmislib/browser/binding.py
Modified: chemistry/cmislib/trunk/src/cmislib/browser/binding.py
URL:
http://svn.apache.org/viewvc/chemistry/cmislib/trunk/src/cmislib/browser/binding.py?rev=1759001&r1=1759000&r2=1759001&view=diff
==============================================================================
--- chemistry/cmislib/trunk/src/cmislib/browser/binding.py (original)
+++ chemistry/cmislib/trunk/src/cmislib/browser/binding.py Fri Sep 2 18:25:50
2016
@@ -364,7 +364,7 @@ class BrowserCmisObject(object):
# invoke the URL
result = self._cmisClient.binding.post(updateUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password)
@@ -393,7 +393,7 @@ class BrowserCmisObject(object):
# invoke the URL
self._cmisClient.binding.post(moveUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password)
@@ -421,7 +421,7 @@ class BrowserCmisObject(object):
# invoke the URL
self._cmisClient.binding.post(delUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password,
@@ -1667,7 +1667,7 @@ class BrowserDocument(BrowserCmisObject)
# invoke the URL
result = self._cmisClient.binding.post(coUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password)
@@ -1694,7 +1694,7 @@ class BrowserDocument(BrowserCmisObject)
# invoke the URL
self._cmisClient.binding.post(coUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password)
@@ -1794,7 +1794,7 @@ class BrowserDocument(BrowserCmisObject)
# invoke the URL
result = self._cmisClient.binding.post(ciUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password,
@@ -1945,7 +1945,7 @@ class BrowserDocument(BrowserCmisObject)
# invoke the URL
self._cmisClient.binding.post(delUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password)
@@ -2063,7 +2063,7 @@ class BrowserFolder(BrowserCmisObject):
# invoke the URL
result = self._cmisClient.binding.post(createFolderUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password,
@@ -2281,7 +2281,7 @@ class BrowserFolder(BrowserCmisObject):
# invoke the URL
self._cmisClient.binding.post(delUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password,
@@ -2321,7 +2321,7 @@ class BrowserFolder(BrowserCmisObject):
# invoke the URL
result = self._cmisClient.binding.post(addUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password,
@@ -2344,7 +2344,7 @@ class BrowserFolder(BrowserCmisObject):
# invoke the URL
result = self._cmisClient.binding.post(remUrl.encode('utf-8'),
- urlencode(props),
+ safe_urlencode(props),
'application/x-www-form-urlencoded',
self._cmisClient.username,
self._cmisClient.password)
@@ -3056,10 +3056,12 @@ class BrowserCmisId(str):
def setProps(properties, props, initialIndex=0):
+
"""
Transform key, value from properties into props list items in the format
expected by the HTTP POST request
"""
+
i = initialIndex
for key, val in properties.items():
props["propertyId[%s]" % i] = key
@@ -3101,11 +3103,13 @@ def getSpecializedObject(obj, **kwargs):
def encode_multipart_formdata(fields, contentFile, contentType):
+
"""
fields is a sequence of (name, value) elements for regular form fields.
files is a sequence of (name, filename, value) elements for data to be
uploaded as files
Return (content_type, body) ready for httplib.HTTP instance
"""
+
boundary = 'aPacHeCheMIStrycMisLIb%s' % (int(time.time()))
crlf = '\r\n'
L = []
@@ -3135,6 +3139,27 @@ def encode_multipart_formdata(fields, co
return content_type, body
+def safe_urlencode(in_dict):
+
+ """
+ Safe encoding of values taking care of unicode values
+ urllib.urlencode doesn't like unicode values
+ """
+
+ def encoded_dict(in_dict):
+ out_dict = {}
+ for k, v in in_dict.iteritems():
+ if isinstance(v, unicode):
+ v = v.encode('utf8')
+ elif isinstance(v, str):
+ # Must be encoded in UTF-8
+ v.decode('utf8')
+ out_dict[k] = v
+ return out_dict
+
+ return urlencode(encoded_dict(in_dict))
+
+
class ResultsSerializer(object):
"""