[tor-commits] [stem/master] Alias for splitting bytes

atagar at torproject.org atagar at torproject.org
Sun Jan 21 02:04:04 UTC 2018


commit 4d5fe240b2db05ba8b640183bd85ff122fde3e8c
Author: Damian Johnson <atagar at torproject.org>
Date:   Wed Jan 17 08:15:47 2018 -0800

    Alias for splitting bytes
    
    We do quite a bit of splitting bytes into substrings. Adding a little alias for
    it.
---
 stem/client/__init__.py | 19 ++++++++++++++++++-
 stem/client/cell.py     | 10 ++++------
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/stem/client/__init__.py b/stem/client/__init__.py
index 3b38f8bb..9ad790a8 100644
--- a/stem/client/__init__.py
+++ b/stem/client/__init__.py
@@ -61,6 +61,19 @@ ADDR_INT = {
 }
 
 
+def split(content, size):
+  """
+  Simple split of bytes into two substrings.
+
+  :param bytes content: string to split
+  :param int size: index to split the string on
+
+  :returns: two value tuple with the split bytes
+  """
+
+  return content[:size], content[size:]
+
+
 class Size(object):
   """
   Unsigned `struct.pack format
@@ -107,6 +120,8 @@ class Size(object):
 
     :param bytes content: content to encode
 
+    :returns: **int** with the unpacked value
+
     :raises: **ValueError** if packed data isn't of the right size
     """
 
@@ -122,6 +137,8 @@ class Size(object):
 
     :param bytes content: content to encode
 
+    :returns: tuple of the form (unpacked, remainder)
+
     :raises: **ValueError** if packed data isn't of the right size
     """
 
@@ -180,7 +197,7 @@ class Address(collections.namedtuple('Address', ['type', 'type_int', 'value', 'v
 
     # TODO: add support for other address types
 
-    address_bin, content = content[:addr_length], content[addr_length:]
+    address_bin, content = split(content, addr_length)
     address = None
 
     if addr_type == AddrType.IPv4 and len(address_bin) == 4:
diff --git a/stem/client/cell.py b/stem/client/cell.py
index bc44298f..332e3f16 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -44,7 +44,7 @@ import random
 import sys
 
 from stem import UNDEFINED
-from stem.client import ZERO, Address, Certificate, Size
+from stem.client import ZERO, Address, Certificate, Size, split
 from stem.util import _hash_attr, datetime_to_unix
 
 FIXED_PAYLOAD_LEN = 509
@@ -119,9 +119,7 @@ class Cell(object):
     if len(content) < payload_len:
       raise ValueError('%s cell should have a payload of %i bytes, but only had %i' % (cls.NAME, payload_len, len(content)))
 
-    payload = content[:payload_len]
-    content = content[payload_len:]
-
+    payload, content = split(content, payload_len)
     return cls._unpack(payload, link_version, circ_id), content
 
   @classmethod
@@ -516,7 +514,7 @@ class CertsCell(Cell):
       if cert_size > len(content):
         raise ValueError('CERTS cell should have a certificate with %i bytes, but only had %i remaining' % (cert_size, len(content)))
 
-      cert_bytes, content = content[:cert_size], content[cert_size:]
+      cert_bytes, content = split(content, cert_size)
       certs.append(Certificate(cert_type, cert_bytes))
 
     return CertsCell(certs)
@@ -573,7 +571,7 @@ class AuthChallengeCell(Cell):
     if len(content) < AUTH_CHALLENGE_SIZE + 2:
       raise ValueError('AUTH_CHALLENGE payload should be at least 34 bytes, but was %i' % len(content))
 
-    challenge, content = content[:AUTH_CHALLENGE_SIZE], content[AUTH_CHALLENGE_SIZE:]
+    challenge, content = split(content, AUTH_CHALLENGE_SIZE)
     method_count, content = Size.SHORT.pop(content)
 
     if len(content) < method_count * 2:





More information about the tor-commits mailing list