commit 4210908e8853cd81e5945a5c09cc943a8f28bec4 Author: Arturo Filastò art@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
tor-commits@lists.torproject.org