Skip to content

Commit 6f0fa5d

Browse files
committed
fix: catch malformed mirror node response data
Signed-off-by: iron-prog <dt915725@gmail.com>
1 parent 9aba0b3 commit 6f0fa5d

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

src/hiero_sdk_python/client/network.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ def _fetch_nodes_from_mirror_node(self) -> list[_Node]:
215215
except requests.RequestException as e:
216216
logger.error("Error fetching nodes from mirror node API: %s", e)
217217
return []
218+
except (ValueError, KeyError, TypeError, IndexError, AttributeError) as e:
219+
logger.error("Error parsing mirror node API response: %s", e, exc_info=True)
220+
return []
218221

219222
def _fetch_nodes_from_default_nodes(self) -> list[_Node]:
220223
"""Fetches the list of nodes from the default nodes for the network."""

tests/unit/query_error_logging_test.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,37 @@ def raise_request_exception(*args, **kwargs):
166166
]
167167
assert matching
168168
assert matching[0].name == Network.__module__
169+
170+
171+
def test_fetch_nodes_from_mirror_node_logs_malformed_response(caplog, monkeypatch):
172+
"""Ensure malformed mirror node responses are logged and fall back to an empty list instead of raising."""
173+
source = inspect.getsource(Network._fetch_nodes_from_mirror_node)
174+
assert "print(" not in source
175+
176+
network = Network.__new__(Network)
177+
network.network = "testnet"
178+
179+
class _FakeResponse:
180+
def raise_for_status(self):
181+
pass
182+
183+
def json(self):
184+
# Missing required fields -> NodeAddress._from_dict raises.
185+
return {"nodes": [{"unexpected": "shape"}]}
186+
187+
monkeypatch.setattr("hiero_sdk_python.client.network.requests.get", lambda *_a, **_k: _FakeResponse())
188+
189+
with (
190+
caplog.at_level(logging.ERROR, logger="hiero_sdk_python"),
191+
caplog.at_level(logging.ERROR, logger="hiero_sdk_python.client.network"),
192+
):
193+
result = network._fetch_nodes_from_mirror_node()
194+
195+
assert result == []
196+
matching = [
197+
record
198+
for record in caplog.records
199+
if record.levelno == logging.ERROR and "Error parsing mirror node API response" in record.message
200+
]
201+
assert matching
202+
assert matching[0].name == Network.__module__

0 commit comments

Comments
 (0)