diff options
author | Jeff Forcier <jeff@bitprophet.org> | 2017-12-18 12:20:33 -0800 |
---|---|---|
committer | Jeff Forcier <jeff@bitprophet.org> | 2017-12-18 12:20:49 -0800 |
commit | 7c1d29c97c2e4861953706c8d0197ad399178b86 (patch) | |
tree | 9d6af578badead642fb3a3b8351bcaa57ffa5ec6 | |
parent | cd57cf0ba7d29cd97ceafe692c9aa3e2d68c0ef6 (diff) |
Leverage b() in asbytes() to avoid duplication.
Cannot really get RID of asbytes() though, but that's fine.
Also tweak flow & comments for clarity
-rw-r--r-- | paramiko/common.py | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/paramiko/common.py b/paramiko/common.py index 0012372a..d38c4563 100644 --- a/paramiko/common.py +++ b/paramiko/common.py @@ -20,7 +20,7 @@ Common constants and global variables. """ import logging -from paramiko.py3compat import byte_chr, PY2, bytes_types, text_type, long +from paramiko.py3compat import byte_chr, PY2, bytes_types, text_type, long, b MSG_DISCONNECT, MSG_IGNORE, MSG_UNIMPLEMENTED, MSG_DEBUG, \ MSG_SERVICE_REQUEST, MSG_SERVICE_ACCEPT = range(1, 7) @@ -161,17 +161,24 @@ else: def asbytes(s): - """Coerce to bytes if possible or return unchanged.""" - if isinstance(s, bytes_types): - return s - if isinstance(s, text_type): - # Accept text and encode as utf-8 for compatibility only. - return s.encode("utf-8") - asbytes = getattr(s, "asbytes", None) - if asbytes is not None: - return asbytes() - # May be an object that implements the buffer api, let callers handle. - return s + """ + Coerce to bytes if possible or return unchanged. + """ + try: + # Attempt to run through our version of b(), which does the Right Thing + # for string/unicode/buffer (Py2) or bytes/str (Py3), and raises + # TypeError if it's not one of those types. + return b(s) + except TypeError: + try: + # If it wasn't a string/byte/buffer type object, try calling an + # asbytes() method, which many of our internal classes implement. + return s.asbytes() + except AttributeError: + # Finally, just do nothing & assume this object is sufficiently + # byte-y or buffer-y that everything will work out (or that callers + # are capable of handling whatever it is.) + return s xffffffff = long(0xffffffff) |