diff --git a/oslo_policy/policy.py b/oslo_policy/policy.py index a0e5ad34..ac116efe 100644 --- a/oslo_policy/policy.py +++ b/oslo_policy/policy.py @@ -325,11 +325,19 @@ def parse_file_contents(data): 'policy_name2': 'policy2,...} """ try: - parsed = yaml.safe_load(data) - except yaml.YAMLError as e: - # For backwards-compatibility, convert yaml error to ValueError, - # which is what JSON loader raised. - raise ValueError(six.text_type(e)) + # NOTE(snikitin): jsonutils.loads() is much faster than + # yaml.safe_load(). However jsonutils.loads() parses only JSON while + # yaml.safe_load() parses JSON and YAML. So here we try to parse data + # by jsonutils.loads() first. In case of failure yaml.safe_load() + # will be used instead. + parsed = jsonutils.loads(data) + except ValueError: + try: + parsed = yaml.safe_load(data) + except yaml.YAMLError as e: + # For backwards-compatibility, convert yaml error to ValueError, + # which is what JSON loader raised. + raise ValueError(six.text_type(e)) return parsed