-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Improve ContentLengthError messages to show expected vs received bytes #11355
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 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
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
CodSpeed Performance ReportMerging #11355 will not alter performanceComparing Summary
|
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 |
# Calculate how much we received vs expected | ||
expected = self._original_length if self._original_length is not None else 0 | ||
# self._length is decremented as data is received, so received = expected - remaining | ||
received = expected - self._length if self._length <= expected else 0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there any way we can get the else condition here? My understanding is that it shouldn't be possible. If we receive the number of bytes expected, then we consider that message complete and read any further bytes as the start of the next message. Therefore, we should never be able to have more than the expected number of bytes (I also don't see any equivalent logic in the Cython changes).
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:
Are there changes in behavior for the user?
Yes, but only in error messages. The
ContentLengthError
exception now provides more diagnostic information:ContentLengthError: 400, message='Not enough data to satisfy content length header.'
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:
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
CONTRIBUTORS.txt
CHANGES/
foldername 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 animproper 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 breakingchanges 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 buildprocess.
.packaging
: Notes for downstreams about unobvious side effectsand 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 abovecategories.
Make sure to use full sentences with correct case and punctuation,
for example:
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.