Improve ContentLengthError messages to show expected vs received bytes
What do these changes do?
This PR improves error messages for ContentLengthError by including both the expected and received byte counts. When a response body doesn't match the Content-Length header, users now get a clear message like "Expected 100 bytes, got 60 bytes" instead of just "Not enough data to satisfy content length header."
The changes affect both the Python and Cython HTTP parsers:
- Added tracking of received bytes in the parsers
- Updated error messages to include expected vs received counts
- Added comprehensive tests to verify the new error messages
Are there changes in behavior for the user?
Yes, but only in error messages. The ContentLengthError exception now provides more diagnostic information:
- Before:
ContentLengthError: 400, message='Not enough data to satisfy content length header.' - After:
ContentLengthError: 400, message='Not enough data to satisfy content length header. Expected 100 bytes, got 60 bytes.'
This helps users debug issues more easily, such as in the Home Assistant ONVIF camera issue where the exact mismatch between expected and received bytes was unclear.
Is it a substantial burden for the maintainers to support this?
No. The changes are minimal and focused:
- Simple byte counting in the parsers
- No new APIs or breaking changes
- Only affects error message formatting
- Well-tested with comprehensive test coverage
The implementation is straightforward and maintainable - just tracking bytes received and including that information in error messages.
Related issue number
Related to home-assistant/core#148093 (helps diagnose "Not enough data to satisfy content length header" errors)
Checklist
- [x] I think the code is well written
- [x] Unit tests for the changes exist
- [ ] Documentation reflects the changes
- [ ] If you provide code modification, please add yourself to
CONTRIBUTORS.txt- The format is <Name> <Surname>.
- Please keep alphabetical order, the file is sorted by names.
- [ ] Add a new news fragment into the
CHANGES/folder-
name it
<issue_or_pr_num>.<type>.rst(e.g.588.bugfix.rst) -
if you don't have an issue number, change it to the pull request number after creating the PR
.bugfix: A bug fix for something the maintainers deemed an improper undesired behavior that got corrected to match pre-agreed expectations..feature: A new behavior, public APIs. That sort of stuff..deprecation: A declaration of future API removals and breaking changes in behavior..breaking: When something public is removed in a breaking way. Could be deprecated in an earlier release..doc: Notable updates to the documentation structure or build process..packaging: Notes for downstreams about unobvious side effects and tooling. Changes in the test invocation considerations and runtime assumptions..contrib: Stuff that affects the contributor experience. e.g. Running tests, building the docs, setting up the development environment..misc: Changes that are hard to assign to any of the above categories.
-
Make sure to use full sentences with correct case and punctuation, for example:
Fixed issue with non-ascii contents in doctest text files -- by :user:`contributor-gh-handle`.Use the past tense or the present tense a non-imperative mood, referring to what's changed compared to the last released version of this project.
-
Codecov Report
:white_check_mark: All modified and coverable lines are covered by tests.
:white_check_mark: Project coverage is 98.76%. Comparing base (6deecea) to head (82552e7).
:warning: Report is 41 commits behind head on master.
:white_check_mark: All tests successful. No failed tests found.
Additional details and impacted files
@@ Coverage Diff @@
## master #11355 +/- ##
=======================================
Coverage 98.76% 98.76%
=======================================
Files 129 129
Lines 43416 43461 +45
Branches 2324 2324
=======================================
+ Hits 42879 42924 +45
Misses 383 383
Partials 154 154
| Flag | Coverage Δ | |
|---|---|---|
| CI-GHA | 98.64% <100.00%> (+<0.01%) |
:arrow_up: |
| OS-Linux | 98.38% <100.00%> (+<0.01%) |
:arrow_up: |
| OS-Windows | 96.81% <100.00%> (-0.01%) |
:arrow_down: |
| OS-macOS | 97.69% <100.00%> (+<0.01%) |
:arrow_up: |
| Py-3.10.11 | 97.33% <100.00%> (+<0.01%) |
:arrow_up: |
| Py-3.10.18 | 97.73% <100.00%> (+<0.01%) |
:arrow_up: |
| Py-3.11.13 | 97.91% <100.00%> (+<0.01%) |
:arrow_up: |
| Py-3.11.9 | 97.52% <100.00%> (-0.01%) |
:arrow_down: |
| Py-3.12.10 | 97.63% <100.00%> (-0.01%) |
:arrow_down: |
| Py-3.12.11 | 98.03% <100.00%> (+<0.01%) |
:arrow_up: |
| Py-3.13.5 | 98.27% <100.00%> (-0.01%) |
:arrow_down: |
| Py-3.9.13 | 97.22% <100.00%> (+<0.01%) |
:arrow_up: |
| Py-3.9.23 | 97.61% <100.00%> (-0.01%) |
:arrow_down: |
| Py-pypy7.3.16 | 86.00% <100.00%> (-8.90%) |
:arrow_down: |
| VM-macos | 97.69% <100.00%> (+<0.01%) |
:arrow_up: |
| VM-ubuntu | 98.38% <100.00%> (+<0.01%) |
:arrow_up: |
| VM-windows | 96.81% <100.00%> (-0.01%) |
:arrow_down: |
Flags with carried forward coverage won't be shown. Click here to find out more.
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
CodSpeed Performance Report
Merging #11355 will not alter performance
Comparing log_missing_bytes (82552e7) with master (6deecea)
Summary
✅ 59 untouched benchmarks
I was able to find the underlying issue which turned out to be broken firmware on a camera without this change. I'll leave it here in case something things its still worth merging