[tor-commits] [stem/master] Circuit and stream ids are strings

atagar at torproject.org atagar at torproject.org
Thu Dec 13 16:42:22 UTC 2012


commit 6711458be83b2050b058b7528bccb4e15c2c6a25
Author: Damian Johnson <atagar at torproject.org>
Date:   Thu Dec 13 08:39:18 2012 -0800

    Circuit and stream ids are strings
    
    Ids for streams and circuits presently look like ints, but stem should handle
    them as strings as per the control-spec...
    
    ; Unique identifiers for streams or circuits.  Currently, Tor only
    ; uses digits, but this may change
    StreamID = 1*16 IDChar
    CircuitID = 1*16 IDChar
    IDChar = ALPHA / DIGIT
    
    Issue caught by Lunar^. This should be invisible to callers (they can probably
    still provide us with ints), the only noticeable difference being that
    new_circuit() and extend_circuit() now provides a str rather than int.
---
 stem/control.py                  |   27 +++++++++++++++------------
 test/integ/control/controller.py |    6 +++---
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/stem/control.py b/stem/control.py
index d615689..b8bbf15 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -1375,13 +1375,13 @@ class Controller(BaseController):
       * general
       * controller
     
-    :param int circuit_id: id of the circuit whose purpose is to be changed
+    :param str circuit_id: id of the circuit whose purpose is to be changed
     :param str purpose: purpose (either "general" or "controller")
     
     :raises: :class:`stem.InvalidArguments` if the circuit doesn't exist or if the purpose was invalid
     """
     
-    response = self.msg("SETCIRCUITPURPOSE %s purpose=%s" % (str(circuit_id), purpose))
+    response = self.msg("SETCIRCUITPURPOSE %s purpose=%s" % (circuit_id, purpose))
     stem.response.convert("SINGLELINE", response)
     
     if not response.is_ok():
@@ -1403,7 +1403,7 @@ class Controller(BaseController):
     
     return self.extend_circuit(0, path, purpose)
   
-  def extend_circuit(self, circuit = 0, path = None, purpose = "general"):
+  def extend_circuit(self, circuit = "0", path = None, purpose = "general"):
     """
     Either requests the creation of a new circuit or extends an existing one.
     
@@ -1415,31 +1415,34 @@ class Controller(BaseController):
     
     ::
       
-      >>> control.extend_circuit(0, ["718BCEA286B531757ACAFF93AE04910EA73DE617", "30BAB8EE7606CBD12F3CC269AE976E0153E7A58D", "2765D8A8C4BBA3F89585A9FFE0E8575615880BEB"])
+      >>> control.extend_circuit('0', ["718BCEA286B531757ACAFF93AE04910EA73DE617", "30BAB8EE7606CBD12F3CC269AE976E0153E7A58D", "2765D8A8C4BBA3F89585A9FFE0E8575615880BEB"])
       19
-      >>> control.extend_circuit(0)
+      >>> control.extend_circuit('0')
       20
       >>> print control.get_info('circuit-status')
       20 EXTENDED $718BCEA286B531757ACAFF93AE04910EA73DE617=KsmoinOK,$649F2D0ACF418F7CFC6539AB2257EB2D5297BAFA=Eskimo BUILD_FLAGS=NEED_CAPACITY PURPOSE=GENERAL TIME_CREATED=2012-12-06T13:51:11.433755
       19 BUILT $718BCEA286B531757ACAFF93AE04910EA73DE617=KsmoinOK,$30BAB8EE7606CBD12F3CC269AE976E0153E7A58D=Pascal1,$2765D8A8C4BBA3F89585A9FFE0E8575615880BEB=Anthracite PURPOSE=GENERAL TIME_CREATED=2012-12-06T13:50:56.969938
     
-    :param int circuit: id of a circuit to be extended
+    :param str circuit: id of a circuit to be extended
     :param list,str path: one or more relays to make a circuit through, this is
       required if the circuit id is non-zero
     :param str purpose: "general" or "controller"
     
-    :returns: int of the circuit id of the created or extended circuit
+    :returns: str of the circuit id of the created or extended circuit
     
     :raises: :class:`stem.InvalidRequest` if one of the parameters were invalid
     """
     
-    if path is None and circuit == 0:
+    # we might accidently get integer circuit ids
+    circuit = str(circuit)
+    
+    if path is None and circuit == '0':
       path_opt_version = stem.version.Requirement.EXTENDCIRCUIT_PATH_OPTIONAL
       
       if not self.get_version().meets_requirements(path_opt_version):
         raise stem.InvalidRequest(512, "EXTENDCIRCUIT requires the path prior to version %s" % path_opt_version)
     
-    args = [str(circuit)]
+    args = [circuit]
     if type(path) == str: path = [path]
     if path: args.append(",".join(path))
     if purpose: args.append("purpose=%s" % purpose)
@@ -1458,13 +1461,13 @@ class Controller(BaseController):
     else:
       raise stem.ProtocolError("EXTENDCIRCUIT returned unexpected response code: %s" % response.code)
     
-    return int(new_circuit)
+    return new_circuit
   
   def close_circuit(self, circuit_id, flag = ''):
     """
     Closes the specified circuit.
     
-    :param int circuit_id: id of the circuit to be closed
+    :param str circuit_id: id of the circuit to be closed
     :param str flag: optional value to modify closing, the only flag available
       is "IfUnused" which will not close the circuit unless it is unused
     
@@ -1487,7 +1490,7 @@ class Controller(BaseController):
     """
     Closes the specified stream.
     
-    :param int stream_id: id of the stream to be closed
+    :param str stream_id: id of the stream to be closed
     :param stem.RelayEndReason reason: reason the stream is closing
     :param str flag: not currently used
     
diff --git a/test/integ/control/controller.py b/test/integ/control/controller.py
index b2a9ffd..9af3cae 100644
--- a/test/integ/control/controller.py
+++ b/test/integ/control/controller.py
@@ -459,15 +459,15 @@ class TestController(unittest.TestCase):
     elif test.runner.require_online(self): return
     
     with test.runner.get_runner().get_tor_controller() as controller:
-      circ_id = controller.extend_circuit(0)
+      circ_id = controller.extend_circuit('0')
       # check if our circuit was created
       self.assertTrue(filter(lambda x: int(x.split()[0]) == circ_id, controller.get_info('circuit-status').splitlines()))
       circ_id = controller.new_circuit()
       self.assertTrue(filter(lambda x: int(x.split()[0]) == circ_id, controller.get_info('circuit-status').splitlines()))
       
       self.assertRaises(stem.InvalidRequest, controller.extend_circuit, "foo")
-      self.assertRaises(stem.InvalidRequest, controller.extend_circuit, 0, "thisroutershouldntexistbecausestemexists!@##$%#")
-      self.assertRaises(stem.InvalidRequest, controller.extend_circuit, 0, "thisroutershouldntexistbecausestemexists!@##$%#", "foo")
+      self.assertRaises(stem.InvalidRequest, controller.extend_circuit, '0', "thisroutershouldntexistbecausestemexists!@##$%#")
+      self.assertRaises(stem.InvalidRequest, controller.extend_circuit, '0', "thisroutershouldntexistbecausestemexists!@##$%#", "foo")
   
   def test_repurpose_circuit(self):
     """



More information about the tor-commits mailing list