Fix for to_text and to_bytes error handlers
* surrogate_then_strict doesn't exist. Switch to surrogate_or_strict instead. * Found some bugs in the _text.py implementation * The composed error handlers (error handlers which are made up of two or more python encoding error handlers) had a wrong string in it, 'surrogate_or_escape' doesn't exist. Replaced that with 'surrogate_or_replace' which is the correct handler name. * Left comment about the implicit conditions that are part of the surrogate_then_replace code path Fixes #23865 Fixes #23861
This commit is contained in:
parent
9986639681
commit
fc5d71de0d
3 changed files with 16 additions and 13 deletions
|
@ -44,7 +44,7 @@ except LookupError:
|
||||||
HAS_SURROGATEESCAPE = False
|
HAS_SURROGATEESCAPE = False
|
||||||
|
|
||||||
|
|
||||||
_COMPOSED_ERROR_HANDLERS = frozenset((None, 'surrogate_or_escape',
|
_COMPOSED_ERROR_HANDLERS = frozenset((None, 'surrogate_or_replace',
|
||||||
'surrogate_or_strict',
|
'surrogate_or_strict',
|
||||||
'surrogate_then_replace'))
|
'surrogate_then_replace'))
|
||||||
|
|
||||||
|
@ -133,6 +133,9 @@ def to_bytes(obj, encoding='utf-8', errors=None, nonstring='simplerepr'):
|
||||||
return obj.encode(encoding, errors)
|
return obj.encode(encoding, errors)
|
||||||
except UnicodeEncodeError:
|
except UnicodeEncodeError:
|
||||||
if original_errors in (None, 'surrogate_then_replace'):
|
if original_errors in (None, 'surrogate_then_replace'):
|
||||||
|
# We should only reach this if encoding was non-utf8 original_errors was
|
||||||
|
# surrogate_then_escape and errors was surrogateescape
|
||||||
|
|
||||||
# Slow but works
|
# Slow but works
|
||||||
return_string = obj.encode('utf-8', 'surrogateescape')
|
return_string = obj.encode('utf-8', 'surrogateescape')
|
||||||
return_string = return_string.decode('utf-8', 'replace')
|
return_string = return_string.decode('utf-8', 'replace')
|
||||||
|
|
|
@ -1011,7 +1011,7 @@ class AnsibleModule(object):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def user_and_group(self, path, expand=True):
|
def user_and_group(self, path, expand=True):
|
||||||
b_path = to_bytes(path, errors='surrogate_then_strict')
|
b_path = to_bytes(path, errors='surrogate_or_strict')
|
||||||
if expand:
|
if expand:
|
||||||
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
||||||
st = os.lstat(b_path)
|
st = os.lstat(b_path)
|
||||||
|
@ -1105,10 +1105,10 @@ class AnsibleModule(object):
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
def set_owner_if_different(self, path, owner, changed, diff=None, expand=True):
|
def set_owner_if_different(self, path, owner, changed, diff=None, expand=True):
|
||||||
b_path = to_bytes(path, errors='surrogate_then_strict')
|
b_path = to_bytes(path, errors='surrogate_or_strict')
|
||||||
if expand:
|
if expand:
|
||||||
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
||||||
path = to_text(b_path, errors='surrogate_then_strict')
|
path = to_text(b_path, errors='surrogate_or_strict')
|
||||||
if owner is None:
|
if owner is None:
|
||||||
return changed
|
return changed
|
||||||
orig_uid, orig_gid = self.user_and_group(path, expand)
|
orig_uid, orig_gid = self.user_and_group(path, expand)
|
||||||
|
@ -1139,10 +1139,10 @@ class AnsibleModule(object):
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
def set_group_if_different(self, path, group, changed, diff=None, expand=True):
|
def set_group_if_different(self, path, group, changed, diff=None, expand=True):
|
||||||
b_path = to_bytes(path, errors='surrogate_then_strict')
|
b_path = to_bytes(path, errors='surrogate_or_strict')
|
||||||
if expand:
|
if expand:
|
||||||
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
||||||
path = to_text(b_path, errors='surrogate_then_strict')
|
path = to_text(b_path, errors='surrogate_or_strict')
|
||||||
if group is None:
|
if group is None:
|
||||||
return changed
|
return changed
|
||||||
orig_uid, orig_gid = self.user_and_group(b_path, expand)
|
orig_uid, orig_gid = self.user_and_group(b_path, expand)
|
||||||
|
@ -1173,10 +1173,10 @@ class AnsibleModule(object):
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
def set_mode_if_different(self, path, mode, changed, diff=None, expand=True):
|
def set_mode_if_different(self, path, mode, changed, diff=None, expand=True):
|
||||||
b_path = to_bytes(path, errors='surrogate_then_strict')
|
b_path = to_bytes(path, errors='surrogate_or_strict')
|
||||||
if expand:
|
if expand:
|
||||||
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
||||||
path = to_text(b_path, errors='surrogate_then_strict')
|
path = to_text(b_path, errors='surrogate_or_strict')
|
||||||
path_stat = os.lstat(b_path)
|
path_stat = os.lstat(b_path)
|
||||||
|
|
||||||
if mode is None:
|
if mode is None:
|
||||||
|
@ -1253,10 +1253,10 @@ class AnsibleModule(object):
|
||||||
if attributes is None:
|
if attributes is None:
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
b_path = to_bytes(path, errors='surrogate_then_strict')
|
b_path = to_bytes(path, errors='surrogate_or_strict')
|
||||||
if expand:
|
if expand:
|
||||||
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
b_path = os.path.expanduser(os.path.expandvars(b_path))
|
||||||
path = to_text(b_path, errors='surrogate_then_strict')
|
path = to_text(b_path, errors='surrogate_or_strict')
|
||||||
|
|
||||||
existing = self.get_file_attributes(b_path)
|
existing = self.get_file_attributes(b_path)
|
||||||
|
|
||||||
|
|
|
@ -262,7 +262,7 @@ def get_hash(data, hashtype='sha1'):
|
||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
h.update(to_bytes(data, errors='surrogate_then_strict'))
|
h.update(to_bytes(data, errors='surrogate_or_strict'))
|
||||||
return h.hexdigest()
|
return h.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
@ -453,11 +453,11 @@ def do_groupby(environment, value, attribute):
|
||||||
|
|
||||||
|
|
||||||
def b64encode(string):
|
def b64encode(string):
|
||||||
return to_text(base64.b64encode(to_bytes(string, errors='surrogate_then_strict')))
|
return to_text(base64.b64encode(to_bytes(string, errors='surrogate_or_strict')))
|
||||||
|
|
||||||
|
|
||||||
def b64decode(string):
|
def b64decode(string):
|
||||||
return to_text(base64.b64decode(to_bytes(string, errors='surrogate_then_strict')))
|
return to_text(base64.b64decode(to_bytes(string, errors='surrogate_or_strict')))
|
||||||
|
|
||||||
|
|
||||||
class FilterModule(object):
|
class FilterModule(object):
|
||||||
|
|
Loading…
Reference in a new issue