-
-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Fix 'I/O operation on closed file' and 'Form data has been processed already' upon redirect on multipart data #9201
base: master
Are you sure you want to change the base?
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #9201 +/- ##
==========================================
- Coverage 98.31% 98.28% -0.04%
==========================================
Files 107 107
Lines 34508 34709 +201
Branches 4100 4131 +31
==========================================
+ Hits 33928 34114 +186
- Misses 410 417 +7
- Partials 170 178 +8
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
try: | ||
# It is weird but some IO object dont have `seekable()` method as IOBase object, | ||
# it seems better for us to direct try if the `seek()` and `tell()` is available | ||
# e.g. tarfile.TarFile._Stream |
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.
This class doesn't appear to be an IOBase, so I'm wondering why it reaches this code. Does it match one of the payload subclasses?
if not self._fields: | ||
return self._writer |
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.
This doesn't appear to save much, one call to .clear().
if not self._fields: | |
return self._writer |
At first glance, it looks like some reasonable changes for an awkward situation. |
What do these changes do?
Fix 'I/O operation on closed file' and 'Form data has been processed already' upon redirect on multipart data, based on the discussion in #6853 .
This approach tries to pre-build Payload object for the data passing into the request, before the redirect
while True
loop starts, so we can reuse the same Payload object for the entire redirect chain. However, it is notable that I/O object is always an issue, so my thought here is to use theseek
operation on the I/O object to allow chunk writing on redirect requests.Yet, for non-seekable I/O objects, some possible solution are:
I think more discussion might be needed for non-seekable objects, so I just raise error in this PR first.
Another thing I think worth discussion is that I removed the
close()
operation on the I/O object in this PR due to the following reasons:StringIOPayload
do notclose
its I/O value in the original code,But I do think more discussions might be needed here.
Are there changes in behavior for the user?
No.
Is it a substantial burden for the maintainers to support this?
Yes.
Related issue number
Fixes #5577
Fixes #5530
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.