Fix KeyError on malformed Bitcoin Core RPC responses#2532
Draft
Fix KeyError on malformed Bitcoin Core RPC responses#2532
Conversation
✅ Deploy Preview for specter-desktop-docs canceled.
|
- Add defensive checks in __getattr__ to validate response structure - Handle non-dict responses gracefully - Handle error responses that aren't properly formatted dicts - Handle missing 'message' key in error dicts - Handle responses missing 'result' field - Fix RpcError.init_via_response to handle both Response objects and dicts - Add comprehensive test coverage for malformed response scenarios Co-authored-by: k9ert <117085+k9ert@users.noreply.github.com>
Co-authored-by: k9ert <117085+k9ert@users.noreply.github.com>
- Move unittest.mock import to top of file - Replace try/except blocks with pytest.raises() context manager - Make test code more idiomatic and maintainable Co-authored-by: k9ert <117085+k9ert@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Fix exception error handling in node settings
Fix KeyError on malformed Bitcoin Core RPC responses
Feb 5, 2026
al-munazzim
approved these changes
Feb 6, 2026
Contributor
al-munazzim
left a comment
There was a problem hiding this comment.
✅ LGTM - solid defensive coding.
The KeyError crash when Bitcoin Core returns malformed responses is a real issue. This PR:
- ✅ Validates response is a dict before accessing keys
- ✅ Handles
errorfield as non-dict (e.g., plain strings) - ✅ Handles missing
messagekey in error dicts - ✅ Good test coverage with 6 malformed response scenarios
The error messages are now informative instead of cryptic KeyErrors. Good work.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
BitcoinRPC.__getattr__crashes withKeyError: 'error'when Bitcoin Core returns malformed JSON-RPC responses. The code blindly accessedr['error']['message']without validating response structure.Changes
RPC error handling (
rpc.py)RpcError.init_via_response()to handle both Response objects and dictsTest coverage (
test_rpc.py)test_BitcoinRpc_malformed_responsecovering 6 malformed response scenariosExample
Before:
After:
All valid JSON-RPC 2.0 responses continue to work unchanged.
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
esm.ubuntu.com/usr/lib/apt/methods/https /usr/lib/apt/methods/https tgresql cal/bin/rustc ver -plu�� hon3.12 -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper de/node/bin/bash -plugin-opt=-pascut tgresql -plugin-opt=-pass-through=-lc /x86_64-linux-gnu/13/cc1 -I xml2 hon3.12 p/bin/git -I -x86_64-cpython--rs tgresql as(dns block)httpbin.org/usr/bin/python3 python3 /usr/include/pos--force-confdef -I as ctly�� /usr/include/pyt--print-foreign-architectures -I nfig/composer/vendor/bin/lsb_release -I /usr/include/pos-x -I hg root�� p/specter-desktop/.git --gdwarf-5 lsb_release -o build/temp.linux--listfiles /tmp/cc4LLc0S.s git(dns block)/usr/bin/python3 python3 /usr/include/pos--force-confdef -I as -I rd -I k/_temp/ghcca-no--force-confdef -I /usr/include/pos--fsys-tarfile -I git rev-�� p/specter-desktop/.git --gdwarf-5 ame -o e response struccall /tmp/ccna9yb6.s bash(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.