Commit 3f9bf09
fix(client): discard truncated JSON document on mid-stream EOF (#97)
JSONChunkReader's `_read_json_chunk` brace-counts one JSON document off the
response BufferStream, but its `while !eof(io)` loop also terminates on
end-of-stream. When a streaming response closed mid-document (a dropped or
cancelled connection), the partial bytes were handed to the JSON parser and
threw `Unexpected end of input`, surfacing as a logged "exception reading chunk"
error in the streaming consumer.
Track completeness in the object/array and string branches: only the balanced
close (`depth == 0`, or the terminating quote) marks the document complete. If
the loop exits via EOF while incomplete, return empty so `iterate` treats it as
a clean end of stream instead of parsing a truncated document. Complete
documents are unaffected.
Updates the existing jsonchunk4 test (it asserted the old throw-on-truncation
behavior) and adds `_read_json_chunk` unit tests for truncated object / nested
object / array / string, and complete-then-truncated. Bumps to 0.2.4.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent 8ce0218 commit 3f9bf09
3 files changed
Lines changed: 62 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
52 | 53 | | |
53 | 54 | | |
54 | 55 | | |
55 | | - | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
56 | 60 | | |
57 | 61 | | |
58 | 62 | | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
59 | 69 | | |
60 | 70 | | |
| 71 | + | |
61 | 72 | | |
62 | 73 | | |
63 | 74 | | |
| |||
68 | 79 | | |
69 | 80 | | |
70 | 81 | | |
| 82 | + | |
71 | 83 | | |
72 | 84 | | |
73 | 85 | | |
| 86 | + | |
| 87 | + | |
74 | 88 | | |
75 | 89 | | |
76 | 90 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
119 | 123 | | |
120 | 124 | | |
121 | 125 | | |
| |||
126 | 130 | | |
127 | 131 | | |
128 | 132 | | |
129 | | - | |
| 133 | + | |
130 | 134 | | |
131 | | - | |
| 135 | + | |
132 | 136 | | |
| 137 | + | |
133 | 138 | | |
134 | 139 | | |
135 | 140 | | |
| |||
278 | 283 | | |
279 | 284 | | |
280 | 285 | | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
281 | 320 | | |
282 | 321 | | |
283 | 322 | | |
| |||
303 | 342 | | |
304 | 343 | | |
305 | 344 | | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
306 | 350 | | |
307 | 351 | | |
308 | 352 | | |
0 commit comments