diff --git a/consul/callback.py b/consul/callback.py index d4637a2..f7bb1f8 100644 --- a/consul/callback.py +++ b/consul/callback.py @@ -72,21 +72,23 @@ def cb(response): if response.code == 404: data = None else: - data = json.loads(response.body) - if decode: - for item in data: - if item.get(decode) is not None: - item[decode] = base64.b64decode(item[decode]) - if is_id: - data = data["ID"] - if one: - if data == []: - data = None - if data is not None: - data = data[0] - if postprocess: - data = postprocess(data) + try: + data = json.loads(response.body) + if decode: + for item in data: + if item.get(decode) is not None: + item[decode] = base64.b64decode(item[decode]) + if is_id: + data = data["ID"] + if one and isinstance(data, list): + data = data[0] if data else None + if postprocess: + data = postprocess(data) + except (json.JSONDecodeError, TypeError, KeyError) as e: + raise ConsulException(f"Failed to decode JSON: {response.body} {e}") from e if index: + if "X-Consul-Index" not in response.headers: + raise ConsulException(f"Missing index header: {response.headers}") return response.headers["X-Consul-Index"], data return data