[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [stem/master] Throwing DescriptorUnavailable when tor can't provide one for a relay



commit 6a3882a372149ff18b5be7f82fa4b9e5cac113b1
Author: Damian Johnson <atagar@xxxxxxxxxxxxxx>
Date:   Thu Dec 4 17:30:59 2014 -0800

    Throwing DescriptorUnavailable when tor can't provide one for a relay
    
    Tor gives a pretty sucky 'GETINFO request contained unrecognized keywords:
    ns/id/5AC9C5AA75BA1F18D8459B326B4B8111A856D290' error when the descriptor is
    unavailable for a given relay. Having us give something better...
    
      https://trac.torproject.org/projects/tor/ticket/13879
---
 docs/change_log.rst |    1 +
 stem/__init__.py    |    8 ++++++++
 stem/control.py     |   40 ++++++++++++++++++++++++++++++++--------
 3 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/docs/change_log.rst b/docs/change_log.rst
index 4034884..e9fcac7 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -52,6 +52,7 @@ The following are only available within Stem's `git repository
   * :func:`~stem.process.launch_tor_with_config` could cause a "Too many open files" OSError if called too many times (:trac:`13141`)
   * The :func:`~stem.control.Controller.get_exit_policy` method errored if tor couldn't determine our external address
   * The Controller's methods for retrieving descriptors could raise unexpected ValueErrors if tor didn't have any descriptors available
+  * Throwing a new :class:`~stem.DescriptorUnavailable` exception type when the :class:`~stem.control.Controller` can't provide the descriptor for a relay (:trac:`13879`)
 
  * **Descriptors**
 
diff --git a/stem/__init__.py b/stem/__init__.py
index 310f4ab..ffdfe72 100644
--- a/stem/__init__.py
+++ b/stem/__init__.py
@@ -13,6 +13,7 @@ Library for working with the tor process.
     |- OperationFailed - Tor was unable to successfully complete the operation.
     |  |- UnsatisfiableRequest - Tor was unable to satisfy a valid request.
     |  |  +- CircuitExtensionFailed - Attempt to make or extend a circuit failed.
+    |  |- DescriptorUnavailable - The given relay descriptor is unavailable.
     |  +- InvalidRequest - Invalid request.
     |     +- InvalidArguments - Invalid request parameters.
     +- SocketError - Communication with the socket failed.
@@ -459,6 +460,7 @@ __all__ = [
   'OperationFailed',
   'UnsatisfiableRequest',
   'CircuitExtensionFailed',
+  'DescriptorUnavailable',
   'InvalidRequest',
   'InvalidArguments',
   'SocketError',
@@ -539,6 +541,12 @@ class CircuitExtensionFailed(UnsatisfiableRequest):
     self.circ = circ
 
 
+class DescriptorUnavailable(OperationFailed):
+  """
+  Tor was unable to provide a descriptor for the given relay.
+  """
+
+
 class InvalidRequest(OperationFailed):
   """
   Exception raised when the request was invalid or malformed.
diff --git a/stem/control.py b/stem/control.py
index f947aca..cace3ad 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -1456,6 +1456,8 @@ class Controller(BaseController):
     :returns: :class:`~stem.descriptor.microdescriptor.Microdescriptor` for the given relay
 
     :raises:
+      * :class:`stem.DescriptorUnavailable` if unable to provide a descriptor
+        for the given relay
       * :class:`stem.ControllerError` if unable to query the descriptor
       * **ValueError** if **relay** doesn't conform with the pattern for being
         a fingerprint or nickname
@@ -1476,10 +1478,16 @@ class Controller(BaseController):
     else:
       raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay)
 
-    desc_content = self.get_info(query, get_bytes = True)
+    try:
+      desc_content = self.get_info(query, get_bytes = True)
+    except stem.InvalidArguments as exc:
+      if str(exc).startswith('GETINFO request contained unrecognized keywords:'):
+        raise stem.DescriptorUnavailable("Tor was unable to provide the descriptor for '%s'" % relay)
+      else:
+        raise exc
 
     if not desc_content:
-      raise stem.ControllerError("Descriptor information is unavailable, tor might still be downloading it")
+      raise stem.DescriptorUnavailable("Descriptor information is unavailable, tor might still be downloading it")
 
     return stem.descriptor.microdescriptor.Microdescriptor(desc_content)
 
@@ -1555,6 +1563,8 @@ class Controller(BaseController):
     :returns: :class:`~stem.descriptor.server_descriptor.RelayDescriptor` for the given relay
 
     :raises:
+      * :class:`stem.DescriptorUnavailable` if unable to provide a descriptor
+        for the given relay
       * :class:`stem.ControllerError` if unable to query the descriptor
       * **ValueError** if **relay** doesn't conform with the pattern for being
         a fingerprint or nickname
@@ -1576,10 +1586,16 @@ class Controller(BaseController):
       else:
         raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay)
 
-      desc_content = self.get_info(query, get_bytes = True)
+      try:
+        desc_content = self.get_info(query, get_bytes = True)
+      except stem.InvalidArguments as exc:
+        if str(exc).startswith('GETINFO request contained unrecognized keywords:'):
+          raise stem.DescriptorUnavailable("Tor was unable to provide the descriptor for '%s'" % relay)
+        else:
+          raise exc
 
       if not desc_content:
-        raise stem.ControllerError("Descriptor information is unavailable, tor might still be downloading it")
+        raise stem.DescriptorUnavailable("Descriptor information is unavailable, tor might still be downloading it")
 
       return stem.descriptor.server_descriptor.RelayDescriptor(desc_content)
     except Exception as exc:
@@ -1622,7 +1638,7 @@ class Controller(BaseController):
       if not self._is_server_descriptors_available():
         raise stem.ControllerError(SERVER_DESCRIPTORS_UNSUPPORTED)
       else:
-        raise stem.ControllerError("Descriptor information is unavailable, tor might still be downloading it")
+        raise stem.DescriptorUnavailable("Descriptor information is unavailable, tor might still be downloading it")
 
     for desc in stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_content)):
       yield desc
@@ -1670,6 +1686,8 @@ class Controller(BaseController):
       for the given relay
 
     :raises:
+      * :class:`stem.DescriptorUnavailable` if unable to provide a descriptor
+        for the given relay
       * :class:`stem.ControllerError` if unable to query the descriptor
       * **ValueError** if **relay** doesn't conform with the pattern for being
         a fingerprint or nickname
@@ -1695,10 +1713,16 @@ class Controller(BaseController):
     else:
       raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay)
 
-    desc_content = self.get_info(query, get_bytes = True)
+    try:
+      desc_content = self.get_info(query, get_bytes = True)
+    except stem.InvalidArguments as exc:
+      if str(exc).startswith('GETINFO request contained unrecognized keywords:'):
+        raise stem.DescriptorUnavailable("Tor was unable to provide the descriptor for '%s'" % relay)
+      else:
+        raise exc
 
     if not desc_content:
-      raise stem.ControllerError("Descriptor information is unavailable, tor might still be downloading it")
+      raise stem.DescriptorUnavailable("Descriptor information is unavailable, tor might still be downloading it")
 
     if self.get_conf('UseMicrodescriptors', '0') == '1':
       return stem.descriptor.router_status_entry.RouterStatusEntryMicroV3(desc_content)
@@ -1747,7 +1771,7 @@ class Controller(BaseController):
     desc_content = self.get_info('ns/all', get_bytes = True)
 
     if not desc_content:
-      raise stem.ControllerError("Descriptor information is unavailable, tor might still be downloading it")
+      raise stem.DescriptorUnavailable("Descriptor information is unavailable, tor might still be downloading it")
 
     desc_iterator = stem.descriptor.router_status_entry._parse_file(
       io.BytesIO(desc_content),

_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits