Commit 50b314b
committed
fix(envelope): classify malformed upstream JSON as UPSTREAM_ERROR
Addresses Codex review on PR #2 (P2, shared/envelope.py:113).
json.JSONDecodeError subclasses ValueError, so when Health Canada answers
HTTP 200 with an HTML error page, httpx's .json() raised inside a guarded
tool and fell through to the ValueError arm — reporting INVALID_INPUT and
blaming the caller for an upstream outage. It also broke live tests in a
confusing way: assert_live_or_transient tolerates only UPSTREAM_ERROR,
RATE_LIMITED and UPSTREAM_UNAVAILABLE, so a real outage failed as if the
arguments were wrong.
Handle JSONDecodeError ahead of the ValueError arm. A second test pins that
genuine argument-validation ValueErrors still return INVALID_INPUT, so the
fix cannot swallow real caller errors.
Verified the mechanism rather than assuming it: JSONDecodeError does
subclass ValueError, httpx .json() raises it on an HTML body, and both the
drug and nutrient clients call .json() inside the guarded path.
Also records in STATE.md that the same masking is latent in ~40 ValueError
arms downstream of shared/http.py:api_get, which has no decode guard. That
is pre-existing and best fixed once inside api_get; left out of this PR.1 parent ccbaa6e commit 50b314b
3 files changed
Lines changed: 61 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
89 | 89 | | |
90 | 90 | | |
91 | 91 | | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
92 | 102 | | |
93 | 103 | | |
94 | 104 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
| |||
109 | 110 | | |
110 | 111 | | |
111 | 112 | | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
112 | 122 | | |
113 | 123 | | |
114 | 124 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
123 | 164 | | |
124 | 165 | | |
125 | 166 | | |
| |||
0 commit comments