-
Notifications
You must be signed in to change notification settings - Fork 120
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
Rework Client constructors #237
Comments
This was largely already the case, just not enforced. Fixes: http-rs#46 Refs: http-rs/surf#237
Edit... see latest associated comments and PRs... |
For the rest, I think that would necessitate a Stated again, a base URL is not the only reason to use a Surf client:
Fwiw: Hyper also uses a builder for it's client (with far more fine-grained options). |
I've made a PR for pub fn with_http_client<C: HttpClient>(http_client: C) -> Client since that seems easy enough to do and I'm pretty sure the existing public |
Link to Hyper's builder: https://docs.rs/hyper/0.13.8/hyper/client/struct.Builder.html |
The more I think about this, the better of an idea it seems. I propose we do the following:
|
Kinda reverts http-rs#48 Related to http-rs/surf#237 Desirable for Surf-level config.
This is a follow-up to #229 (comment), breaking the proposal there into smaller issues. The goal of this is to enable this to work:
I think this may also serve as an alternative to http-rs/tide#701.
Client should always have a base url
Right now
Client::get
can either take a fully qualified URL or a path, depending on whether a base URL was configured. This degree of flexibility seems somewhat confusing, and setting the base URL takes some work to do. In contrast the undici JS HTTP client always requires a base URL, and uses that instance to create all further requests from:I think this model makes it easier to reason about how pooling works, how URLs are constructed, and enables streamlining the constructor too. Instead of making it so setting a base URL takes two lines, we could require it be part of the constructor:
Renaming of constructor methods?
Something I've been toying with is: what if we renamed the
Client
constructor methods. In particularClient::with_http_client
doesn't really roll of the tongue. Instead what I've been toying with is:Client::connect(url)
to construct a new client -- if we make this fallible + async this could be a logical place to e.g. construct a threadpool.Client::connect_with(url, client)
to construct a new client with a backing impl. If we could construct a backing impl from a closure (perhaps in the future?) then the_with
suffix would be a perfect fit. But if not that's also ok.One downside of this is that there's a
CONNECT
HTTP method too; so we probably couldn't expose these from the crate root. But I don't see that as too big of a downside.HttpClient instances should be Clone
Right now the
Client::with_http_client
method has the following signature:This means that even if a backend we pass implements
Clone
, we must wrap it in anotherArc
. This leads to constructs such as:Instead I'd like us to change the signature to:
Which will enable us to write:
The text was updated successfully, but these errors were encountered: