From 737384513c0c2d7ebc734d9f157d15c91b49f2ec Mon Sep 17 00:00:00 2001 From: Max Goodman Date: Wed, 17 Jul 2013 15:53:44 -0700 Subject: [PATCH] Add more verbose JSON validation errors. --- r2/r2/lib/errors.py | 2 ++ r2/r2/lib/validator/validator.py | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/r2/r2/lib/errors.py b/r2/r2/lib/errors.py index f7cece0ff..d87f037c9 100644 --- a/r2/r2/lib/errors.py +++ b/r2/r2/lib/errors.py @@ -129,6 +129,8 @@ error_list = dict(( ('MULTI_TOO_MANY_SUBREDDITS', _('no more space for subreddits in that multireddit')), ('MULTI_SPECIAL_SUBREDDIT', _("can't add special subreddit %(path)s")), ('JSON_PARSE_ERROR', _('unable to parse JSON data')), + ('JSON_INVALID', _('unexpected JSON structure')), + ('JSON_MISSING_KEY', _('JSON missing key: "%(key)s"')), )) errors = Storage([(e, e) for e in error_list.keys()]) diff --git a/r2/r2/lib/validator/validator.py b/r2/r2/lib/validator/validator.py index 0fdfdeb7b..46bfed58b 100644 --- a/r2/r2/lib/validator/validator.py +++ b/r2/r2/lib/validator/validator.py @@ -2205,7 +2205,7 @@ class VValidatedJSON(VJSON): def run(self, data): if not isinstance(data, list): - raise ValueError + raise RedditError('JSON_INVALID', code=400) validated_data = [] for item in data: @@ -2230,11 +2230,15 @@ class VValidatedJSON(VJSON): def run(self, data): if not isinstance(data, dict): - raise ValueError + raise RedditError('JSON_INVALID', code=400) validated_data = {} for key, validator in self.spec.iteritems(): - validated_data[key] = validator.run(data[key]) + try: + validated_data[key] = validator.run(data[key]) + except KeyError: + raise RedditError('JSON_MISSING_KEY', code=400, + msg_params={'key': key}) return validated_data def spec_docs(self):