From 6b622beb4dd2430e81b7045730c01f7462f58116 Mon Sep 17 00:00:00 2001 From: Dietmar Schinnerl Date: Sat, 11 Aug 2012 16:24:16 +0200 Subject: [PATCH] Added filtering of non-JSON lines. --- lib/ansible/utils.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index 2e1109adfeb..9c75cc19d4b 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -120,7 +120,7 @@ def json_loads(data): def parse_json(raw_data): ''' this version for module return data only ''' - data = filter_leading_garbage(raw_data) + data = filter_leading_non_json_lines(raw_data) try: return json.loads(data) @@ -420,11 +420,20 @@ def last_non_blank_line(lines): return "" # we shouldn't come here (no lines?) but let's pretend nothing happend # We can't return all lines here because calling code expects only one + # line. And since we don't know which line to return we return an empty # line. -def line_needs_filtering(line): - return line.startswith('#') or (len(line) == 0) - -def filter_leading_garbage(lines): - return lines +def is_valid_json_line(line): + return line.startswith('=') or line.startswith('{') or line.startswith('[') + +def filter_leading_non_json_lines(lines): + ''' we need to filter anything which starts not with '{', '[', ', '=' or is an empty line. + But we filter only leading lines since multiline JSON is valid. ''' + filtered_lines = '' + no_more_filtering = False + for line in lines.splitlines(): + if (no_more_filtering or is_valid_json_line(line)): + no_more_filtering = True + filtered_lines += line + '\n' + return filtered_lines