Open
Description
We ought to support the following cases.
Raw upload content from an async file interface:
import httpx
import trio
async def main():
async with httpx.AsyncClient() as client:
async with await trio.open_file(...) as f:
client.post("https://www.example.com", content=f)
trio.run(main)
Multipart file upload from an async file interface:
import httpx
import trio
async def main():
async with httpx.AsyncClient() as client:
async with await trio.open_file(...) as f:
client.post("https://www.example.com", file={"upload": f})
trio.run(main)
We probably want to ensure that we're supporting both trio
, anyio
(Which have the same interfaces), and perhaps also `aiofiles. So eg, also supporting the following...
# Supporting the same as above but using `asyncio`, with `anyio` for the file operations.
import anyio
import asyncio
import httpx
async def main():
async with httpx.AsyncClient() as client:
async with await anyio.open_file(...) as f:
client.post("https://www.example.com", content=f)
asyncio.run(main())
The content=...
case is a little simpler than the data=...
case, since it really just need an async variant of peek_filelike_length
, and a minor update to the ._content.encode_content()
function.
Also fiddly is what the type annotations ought to look like.