Closed
Description
There's a few bits of thinking around the Transport API that we'd like to be completely set on before we roll with a 1.0 release.
- We should consider splitting the sync/async interface as
.request
/.arequest
. This would allow transport implementations that support both sync+async usage, which would be a really nice usability for some use-cases. - There's a very strong case to be made for
.request
being a context manager. See ShouldTransport.request()
return a context manager? httpcore#145 - Needs some very careful investigation. - We need to do a bit of thinking around making custom transports easier to use. Eg from a POV of not having to specify defaults verbosely as soon as dropping down to that level. The docs at https://www.python-httpx.org/advanced/#custom-transports are a good example of where we could be making some usability improvements.
- We ought to consider exposing something like
httpx.HTTPTransport(...)
rather than forcing users to drop intohttpcore
once they're configuring transports directly. - The work on exposing the content stream API is also somewhat related... See Exposing the content stream API #1253
To give a few examples of the effect of some of these decisions...
Expose low-level configuration options on the transport but not the client, without having gnarly extra configuration needed...
client = httpx.Client(transport=httpx.HTTPTransport(local_address="..."))
Mount a customised transport for one specific domain, without having gnarly extra configuration needed...
client = httpx.Client(..., mounts={"all://www.example.com": httpx.HTTPTransport(verify=False, retries=1)})
Transport API using .request
and .arequest
...
# A custom transport class, that always redirects to https URLs, and supports both sync and async API,
# meaning it can be used with either kind of client.
client = httpx.Client(..., mounts={"http": HTTPSRedirect()})
client = httpx.AsyncClient(..., mounts={"http": HTTPSRedirect()})