From: Kefu Chai Date: Fri, 22 Jul 2016 07:55:16 +0000 (+0800) Subject: pybind/ceph_argparse: handle non ascii unicode args X-Git-Tag: ses5-milestone5~331^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5864626d275c423cdb8d3e52a91fe4cc6b8e6f90;p=ceph.git pybind/ceph_argparse: handle non ascii unicode args we raise UnicodeDecodeError at seeing non-ascii args if we fail to match it with any command signatures. instead, we should use a unicode string for representing the error in that case. please note, the exception is not printed at all in real-world. =) Fixes: http://tracker.ceph.com/issues/12287 Signed-off-by: Kefu Chai --- diff --git a/src/pybind/ceph_argparse.py b/src/pybind/ceph_argparse.py index e39862886cf3..49e69296819c 100644 --- a/src/pybind/ceph_argparse.py +++ b/src/pybind/ceph_argparse.py @@ -540,14 +540,16 @@ class CephPrefix(CephArgtype): self.prefix = prefix def valid(self, s, partial=False): - s = str(s) - if isinstance(s, bytes): - try: + try: + s = str(s) + if isinstance(s, bytes): # `prefix` can always be converted into unicode when being compared, # but `s` could be anything passed by user. s = s.decode('ascii') - except UnicodeDecodeError: - raise ArgumentPrefix("no match for {0}".format(s)) + except UnicodeEncodeError: + raise ArgumentPrefix(u"no match for {0}".format(s)) + except UnicodeDecodeError: + raise ArgumentPrefix("no match for {0}".format(s)) if partial: if self.prefix.startswith(s): diff --git a/src/test/pybind/test_ceph_argparse.py b/src/test/pybind/test_ceph_argparse.py index 51c0781c28ca..c34e0ea3acd3 100755 --- a/src/test/pybind/test_ceph_argparse.py +++ b/src/test/pybind/test_ceph_argparse.py @@ -92,10 +92,16 @@ class TestArgparse: class TestBasic: def test_non_ascii_in_non_options(self): - # unicode() is not able to convert this str parameter into unicode - # using the default encoding 'ascii'. and validate_command() should - # not choke on it. + # ArgumentPrefix("no match for {0}".format(s)) is not able to convert + # unicode str parameter into str. and validate_command() should not + # choke on it. + assert_is_none(validate_command(sigdict, [u'章鱼和鱿鱼'])) + assert_is_none(validate_command(sigdict, [u'–w'])) + # actually we always pass unicode strings to validate_command() in "ceph" + # CLI, but we also use bytestrings in our tests, so make sure it does not + # break. assert_is_none(validate_command(sigdict, ['章鱼和鱿鱼'])) + assert_is_none(validate_command(sigdict, ['–w'])) class TestPG(TestArgparse):