aio-libs / aio-libs/aiohttp

Manually give content-length of FormData fields

Đang mở
#7,174 0 bình luận 1 reaction 0 người được giao Xem trên GitHub
enhancement
Ngôn ngữ chính
Python
Star
16.5k
Fork
2.4k
Merge trung bình
20 giờ 10 phút
Pull request đã merge (30 ngày)
221

Mô tả

### Is your feature request related to a problem?

Oh, the terrors of the internet.

The backend I am working with requires _Content-Length_ to be specified for the whole multipart request, which is discussed in the documentation here:

https://docs.aiohttp.org/en/stable/multipart.html#hacking-multipart

However, it seems like it is only possible to figure out what _Content-Length_ is by buffering the data to be sent.

In my situation, sometimes I have a large file on disk with a known size beforehand which I would like to include in a multi-part post request. The documentation also discusses "streaming uploads:"

https://docs.aiohttp.org/en/stable/client_quickstart.html#streaming-uploads

It would be nice if I could combine these solutions:

1. multi-part post request
2. _Content-Length_ for the whole request
3. streaming upload

Currently, (1) and (2) can be achieved using `aiohttp.FormData` with file-like objects, but using `io.IOBase` should be avoided because we are calling blocking IO inside an async context.

### Describe the solution you'd like

`aiohttp.FormData.add_field` should be extended in two ways:

1. support being given `AsyncIterable[bytes]` as value
2. accept optional parameter `content_length` which, if given, manually sets the length of the part.

When trying to send the `FormData`: if the lengths of all parts are known, then set the header *Content-Length*.

### Describe alternatives you've considered

Currently I am using `aiohttp.FormData` with file-like objects and accepting the performance penalty. If the files get too large, I will write a custom multi-part deserializer, hard-coding its parts into a string template and calculating the Content-Length manually. The hard-coded parts plus file "stream" would be wrapped similarly to how it's done here: https://github.com/aio-libs/aiohttp/issues/3598#issuecomment-463630698

### Related component

Client

### Additional context

_No response_

### Code of Conduct

- [X] I agree to follow the aio-libs Code of Conduct

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.