diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2014-07-11 15:09:14 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2014-07-11 15:09:14 +0000 |
commit | 1a5e3e748a5ea4f48e3e88fa3859db4c186d6ba5 (patch) | |
tree | a3748d413eaee6a24dffd6246aa4ec106fc090bf /distbuild/jm.py | |
parent | ce1fedb4e5ab82105853c4f3a8e05fb83f62c18e (diff) | |
download | morph-1a5e3e748a5ea4f48e3e88fa3859db4c186d6ba5.tar.gz |
Make our use of json binary path safebaserock/richardmaw/bugfix/unicode-safe-json
json only accepts unicode. Various APIs such as file paths and environment
variables allow binary data, so we need to support this properly.
This patch changes every[1] use of json.load or json.dump to escape
non-unicode data strings. This appears exactly as it used to if the
input was valid unicode, if it isn't it will insert \xabcd escapes in
the place of non-unicode data.
When loading back in, if json.load is told to unescape it with
`encoding='unicode-escape'` then it will convert it back correctly.
This change was primarily to support file paths that weren't valid
unicode, where this would choke and die. Now it works, but any tools
that parsed the metadata need to unescape the paths.
[1]: The interface to the remote repo cache uses json data, but I haven't
changes its json.load calls to unescape the data, since the repo
caches haven't been made to escape the data.
Diffstat (limited to 'distbuild/jm.py')
-rw-r--r-- | distbuild/jm.py | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/distbuild/jm.py b/distbuild/jm.py index 69fa5bd1..97ee1a0f 100644 --- a/distbuild/jm.py +++ b/distbuild/jm.py @@ -67,7 +67,7 @@ class JsonMachine(StateMachine): def send(self, msg): '''Send a message to the other side.''' - self.sockbuf.write('%s\n' % json.dumps(msg)) + self.sockbuf.write('%s\n' % json.dumps(msg, encoding='unicode-escape')) def close(self): '''Tell state machine it should shut down. @@ -91,7 +91,7 @@ class JsonMachine(StateMachine): line = line.rstrip() if self.debug_json: logging.debug('JsonMachine: line: %s' % repr(line)) - msg = json.loads(line) + msg = json.loads(line, encoding='unicode-escape') self.mainloop.queue_event(self, JsonNewMessage(msg)) def _send_eof(self, event_source, event): |