summaryrefslogtreecommitdiff
path: root/cloudinit/user_data.py
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit/user_data.py')
-rw-r--r--cloudinit/user_data.py9
1 files changed, 9 insertions, 0 deletions
diff --git a/cloudinit/user_data.py b/cloudinit/user_data.py
index 9111bd39..ff21259c 100644
--- a/cloudinit/user_data.py
+++ b/cloudinit/user_data.py
@@ -109,6 +109,15 @@ class UserDataProcessor(object):
ctype = None
ctype_orig = part.get_content_type()
payload = part.get_payload(decode=True)
+ # In Python 3, decoding the payload will ironically hand us a
+ # bytes object. 'decode' means to decode according to
+ # Content-Transfer-Encoding, not according to any charset in the
+ # Content-Type. So, if we end up with bytes, first try to decode
+ # to str via CT charset, and failing that, try utf-8 using
+ # surrogate escapes.
+ if six.PY3 and isinstance(payload, bytes):
+ charset = part.get_charset() or 'utf-8'
+ payload = payload.decode(charset, errors='surrogateescape')
was_compressed = False
# When the message states it is of a gzipped content type ensure