[tor-commits] [oonib/master] Properly write error messages.

art at torproject.org art at torproject.org
Wed Sep 11 09:13:52 UTC 2013


commit 4210908e8853cd81e5945a5c09cc943a8f28bec4
Author: Arturo Filastò <art at fuffa.org>
Date:   Tue Aug 27 13:34:05 2013 +0200

    Properly write error messages.
    
    Update the /bouncer API to reflect spec changes
---
 oonib/bouncer/handlers.py |   60 +++++++++++++++++++++++++++++++++------------
 oonib/errors.py           |    3 ++-
 oonib/handlers.py         |    5 ++++
 3 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/oonib/bouncer/handlers.py b/oonib/bouncer/handlers.py
index e669e8e..9e987f0 100644
--- a/oonib/bouncer/handlers.py
+++ b/oonib/bouncer/handlers.py
@@ -36,7 +36,7 @@ class Bouncer(object):
         try:
             helpers = self.knownHelpers[helper_name]
         except KeyError:
-            raise e.NoHelperFound
+            raise e.TestHelperNotFound
         
         helpers_dict = {}
         for helper in helpers:
@@ -52,15 +52,26 @@ class Bouncer(object):
         requested_helpers = ['a', 'b', 'c']
         will return:
          {
-            'a': '127.0.0.1',
-            'b': 'http://127.0.0.1',
-            'c': '127.0.0.1:590',
-            'collector': 'httpo://thirteenchars1.onion'
+            'a': {
+                'address': '127.0.0.1',
+                'collector': 'httpo://thirteenchars1.onion'
+            },
+            'b': {
+                'address': '127.0.0.1:8081',
+                'collector': 'httpo://thirteenchars1.onion'
+            },
+            'c': {
+                'address': 'http://127.0.0.1',
+                'collector': 'httpo://thirteenchars2.onion'
+            },
+            'default': {
+                'collector': 'httpo://thirteenchars1.onion'
+            }
          }
 
          or 
 
-         {}
+         {'error': 'test-helper-not-found'}
 
          if no valid helper was found
 
@@ -72,18 +83,37 @@ class Bouncer(object):
                     result[collector] = {}
                 result[collector][helper_name] = helper_address
 
-        helper_list = []
+        # {
+        #   'foo.onion': {'some-helper': 'some-address'},
+        #   'foo2.onion': {'some-helper': 'some-addres2'}
+        # }
+
+        response = {}
+        default_collector = None
+        max_helper_count = 0
         for collector, helpers in result.items():
-            if len(helpers) == len(requested_helpers):
-                valid_helpers = helpers
-                valid_helpers['collector'] = collector
-                helper_list.append(valid_helpers)
+            if len(helpers) > max_helper_count:
+                default_collector = collector
             else:
                 continue
-        if len(helper_list) == 0:
-            return {}
-        else:
-            return random.choice(helper_list)
+
+        response['default'] = {}
+        response['default']['collector'] = default_collector
+
+        if not len(result[default_collector]) == len(requested_helpers):
+            found_helpers = set(result[default_collector].items())
+            for missing_helper in found_helpers.difference(requested_helpers):
+                collector, address = random.choice(self.getHelperAddress(missing_helper).items())
+                response[missing_helper] = {}
+                response[missing_helper]['collector'] = collector
+                response[missing_helper]['address'] = address
+
+        for name, address in result[default_collector].items():
+            response[name] = {}
+            response[name]['address'] = address
+            response[name]['collector'] = default_collector
+        
+        return response
 
 class BouncerQueryHandler(OONIBHandler):
     def initialize(self):
diff --git a/oonib/errors.py b/oonib/errors.py
index 5c4e4d8..2385a6f 100644
--- a/oonib/errors.py
+++ b/oonib/errors.py
@@ -55,5 +55,6 @@ class TestHelpersKeyMissing(OONIBError):
     log_message = "test-helpers-key-missing"
 
 class TestHelperNotFound(OONIBError):
-    status_code = 400
+    status_code = 404
     log_message = "test-helper-not-found"
+
diff --git a/oonib/handlers.py b/oonib/handlers.py
index 033a69f..2231a2a 100644
--- a/oonib/handlers.py
+++ b/oonib/handlers.py
@@ -4,6 +4,11 @@ from cyclone import escape
 from cyclone import web
 
 class OONIBHandler(web.RequestHandler):
+    def write_error(self, status_code, exception=None, **kw):
+        self.set_status(status_code)
+        if exception:
+            self.write({'error': exception.log_message})
+
     def write(self, chunk):
         """
         This is a monkey patch to RequestHandler to allow us to serialize also





More information about the tor-commits mailing list