Issue with MultiPartParser class
See original GitHub issueChecklist
- The bug is reproducible against the latest release and/or
master
. - There are no similar issues or pull requests to fix it yet.
Describe the bug
MultiPartParser
class fails to parse a request body produced by the client but not Postman (or similar).
To reproduce
from starlette.formparsers import MultiPartParser, FormParser
from starlette.datastructures import Headers
import asyncio
client_body = b'--xoxoxoxoxoxoxoxoxoxo_1600710720987\r\nContent-Disposition: form-data; name="fasta"; filename="sequences.fasta"\r\nContent-Type: multipart/form-data\r\n\r\n>P23A07_IgM-1047:H:Q10C92:17/22:NID2093\nCAGGTTTCAGTAG\n--xoxoxoxoxoxoxoxoxoxo_1600710720987\r\nContent-Disposition: form-data; name="attributes"; filename="attributes.tsv"\r\nContent-Type: multipart/form-data\r\n\r\n"Campaign ID"\t"Plate Set ID"\t"No"\n\r\n--xoxoxoxoxoxoxoxoxoxo_1600710720987--\r\n'
client_headers = Headers({'accept-encoding': 'gzip,deflate', 'content-length': '39940', 'content-type': 'multipart/form-data; boundary=xoxoxoxoxoxoxoxoxoxo_1600710720987', 'host': '10.0.5.13:80', 'connection': 'Keep-Alive', 'user-agent': 'KNIME Uploader'})
postman_body = b'----------------------------850116600781883365617864\r\nContent-Disposition: form-data; name="attributes"; filename="test-attribute_5.tsv"\r\nContent-Type: text/tab-separated-values\r\n\r\n"Campaign ID"\t"Plate Set ID"\t"No"\n\r\n----------------------------850116600781883365617864\r\nContent-Disposition: form-data; name="fasta"; filename="test-sequence_correct_5.fasta"\r\nContent-Type: application/octet-stream\r\n\r\n>P23G01_IgG1-1411:H:Q10C3:1/1:NID18\r\nCAGGTATTGAA\r\n\r\n----------------------------850116600781883365617864--\r\n'
postman_headers = Headers({'content-type': 'multipart/form-data; boundary=--------------------------850116600781883365617864', 'user-agent': 'PostmanRuntime/7.26.0', 'accept': '*/*', 'cache-control': 'no-cache', 'host': '10.0.5.13:80', 'accept-encoding': 'gzip, deflate, br', 'connection': 'keep-alive', 'content-length': '2455'})
async def stream(message):
body = message.get("body", b"")
if body:
yield body
async def client_test_multipart():
parser = MultiPartParser(client_headers, stream({"body": client_body}))
form = await parser.parse()
print([(k, v) for k, v in form.items()])
return form
async def postman_test_multipart():
parser = MultiPartParser(postman_headers, stream({"body": postman_body}))
form = await parser.parse()
print([(k, v) for k, v in form.items()])
return form
loop = asyncio.get_event_loop()
loop.run_until_complete(client_test_multipart())
loop.run_until_complete(postman_test_multipart())
Expected behavior
client_test_multipart
should read and return two files from the client_body
as with postman_test_multipart
and postman_body
.
Actual behavior
client_test_multipart
reads only one file from the request body produced by the client.
Debugging material
[('fasta', <starlette.datastructures.UploadFile object at 0x7f091c0b1a20>)]
[('attributes', <starlette.datastructures.UploadFile object at 0x7f091c0b1a58>), ('fasta', <starlette.datastructures.UploadFile object at 0x7f091c0b1828>)]
Environment
- OS: Linux
- Python version: 3.8
- Starlette version: 0.13.6
Issue Analytics
- State:
- Created 3 years ago
- Comments:10 (1 by maintainers)
Top Results From Across the Web
'Error instantiating webwork.multipart.parser.class | Jira
Cause. The /work and /tmp (/temp in Jira 8.2.3) directories in JIRA's installation directory may have incorrect permissions.
Read more >MultipartParser is not validating data in Django Rest Framework
How else should I use the MultiPartParser class in the views ? I keep getting the error: TypeError: 'NoneType' object is not iterable....
Read more >MultipartParser class for uploading files — oracle-tech
One of the problems I'm facing while using this class is it requires me to get FilePart as soon as I get it...
Read more >Parsers - Django REST framework
REST framework includes a number of built in Parser classes, that allow you to accept ... You will typically want to use both...
Read more >HTTP::MultiPartParser - metacpan.org
HTTP MultiPart Parser. ... This class provides a low-level API for processing MultiPart MIME data streams conforming to MultiPart types as defined in...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
I still find it strange that after all this time since the issue has been raised the maintainers of
python-multipart
do not to even comment on the issue.@hall-b
python-multipart
is only used for uploading multiple files at once. Perhaps you can do it one file at a time? If not, do try modifying the body of the request to make it standard as I did here.@tomchristie any update on this ?
python-multipart
doesn’t seem to address this issue, however, this is quite blocking when using theUploadFile
from FastAPI.I’m using the requests library from python and I cannot manage to upload files, I always get a
422 Unprocessable Entity
as response.#1514 seemed to address this issue nicely given that the
baize
library seems much more active thanpython-multipart
library. If this solution doesn’t suits you, what else are you planning to do ?Does anyone currently have a workaround to use
UploadFile
from FastAPI and pythonrequests
as client ?Thanks in advance for your reply