summaryrefslogtreecommitdiff
path: root/paramiko/common.py
diff options
context:
space:
mode:
authorJeff Forcier <jeff@bitprophet.org>2017-12-18 12:20:33 -0800
committerJeff Forcier <jeff@bitprophet.org>2017-12-18 12:20:49 -0800
commit7c1d29c97c2e4861953706c8d0197ad399178b86 (patch)
tree9d6af578badead642fb3a3b8351bcaa57ffa5ec6 /paramiko/common.py
parentcd57cf0ba7d29cd97ceafe692c9aa3e2d68c0ef6 (diff)
downloadparamiko-7c1d29c97c2e4861953706c8d0197ad399178b86.tar.gz
Leverage b() in asbytes() to avoid duplication.
Cannot really get RID of asbytes() though, but that's fine. Also tweak flow & comments for clarity
Diffstat (limited to 'paramiko/common.py')
-rw-r--r--paramiko/common.py31
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)