diff options
author | Toshio Kuratomi <toshio@fedoraproject.org> | 2015-05-14 14:19:15 -0700 |
---|---|---|
committer | Toshio Kuratomi <toshio@fedoraproject.org> | 2015-07-06 09:59:46 -0700 |
commit | 6906760d46b8afb884c5340415a17df315afd1b2 (patch) | |
tree | 1617b9d5b09030b09895d5cebcaa128a6da1a4ec | |
parent | 0deb87f3dcf9c4416f6754e7085540967822a3e0 (diff) | |
download | ansible-modules-core-6906760d46b8afb884c5340415a17df315afd1b2.tar.gz |
Fix problem writing binary content to a temporary file in the uri module.
Fixes https://github.com/ansible/ansible/issues/10938
Fixes https://github.com/ansible/ansible/issues/7606
-rw-r--r-- | network/basics/uri.py | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/network/basics/uri.py b/network/basics/uri.py index 5d19f64f..a3584502 100644 --- a/network/basics/uri.py +++ b/network/basics/uri.py @@ -20,6 +20,7 @@ # # see examples/playbooks/uri.yml +import cgi import shutil import tempfile import base64 @@ -191,7 +192,6 @@ try: except ImportError: HAS_URLPARSE = False - def write_file(module, url, dest, content): # create a tempfile with some test content fd, tmpsrc = tempfile.mkstemp() @@ -313,10 +313,7 @@ def uri(module, url, dest, user, password, body, method, headers, redirects, soc r['redirected'] = redirected r.update(resp_redir) r.update(resp) - try: - return r, unicode(content.decode('raw_unicode_escape')), dest - except: - return r, content, dest + return r, content, dest except httplib2.RedirectMissingLocation: module.fail_json(msg="A 3xx redirect response code was provided but no Location: header was provided to point to the new location.") except httplib2.RedirectLimit: @@ -441,22 +438,32 @@ def main(): ukey = key.replace("-", "_") uresp[ukey] = value + # Default content_encoding to try + content_encoding = 'utf-8' if 'content_type' in uresp: - if uresp['content_type'].startswith('application/json') or \ - uresp['content_type'].startswith('text/json'): + content_type, params = cgi.parse_header(uresp['content_type']) + if 'charset' in params: + content_encoding = params['charset'] + u_content = unicode(content, content_encoding, errors='xmlcharrefreplace') + if content_type.startswith('application/json') or \ + content_type.startswith('text/json'): try: - js = json.loads(content) + js = json.loads(u_content) uresp['json'] = js except: pass + else: + u_content = unicode(content, content_encoding, errors='xmlcharrefreplace') + if resp['status'] not in status_code: - module.fail_json(msg="Status code was not " + str(status_code), content=content, **uresp) + module.fail_json(msg="Status code was not " + str(status_code), content=u_content, **uresp) elif return_content: - module.exit_json(changed=changed, content=content, **uresp) + module.exit_json(changed=changed, content=u_content, **uresp) else: module.exit_json(changed=changed, **uresp) # import module snippets from ansible.module_utils.basic import * -main() +if __name__ == '__main__': + main() |