-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
feat: add unix_socket() option to client builder #2624
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
Conversation
d085a43
to
fa63213
Compare
6fd20be
to
378218f
Compare
Utilize seanmonstar/reqwest#2624 which resolves seanmonstar/reqwest#39.
Utilize seanmonstar/reqwest#2624 which resolves seanmonstar/reqwest#39.
Perfect timing for me as I was just looking for the solution. Question though, if you create a client like this: let client = reqwest::Client::builder()
.unix_socket(server.path())
.build()
.unwrap();
let unix_res = client .get("http://yolo.local/foo")
.send()
.await
.expect("send request"); can i still reuse the client with like this? let ip_res = client .get("https://google.com")
.send()
.await
.expect("send request"); |
No, if set, all connections use the socket. I've updated the top to quote the rationale from the linked issue. We could in the future come up with a design that allows both, but it requires coming up with how to intuitively configure that. |
Haven't looked at any code but I would assume this can be determined by looking at the socket address protocol. Like maybe instead of using http:// you could use ipc:// ? |
I don't like that, as the higher layer protocol is still HTTP, only TCP gets replaced, so this would be assuming HTTP, which would be annoying for connecting to non-HTTP over a socket (perhaps HTTPS for example, or potential future protocols). http+unix:// could work though, similar to the "git+https" URLs you sometimes see. |
yea im not very rehersed with all this stuff. All i know is that i need to be able to switch between unix socket at http at runtime. I can make my own implementation to do this based on this PR but i would be making my own interface which i would rather not. With zmq, you use a leading '/' to indicate an absolute socket path. like
maybe this is a good way to it? so in reqwests case it would be like: let client = reqwest::Client::builder()
.unix_socket(server.path())
.build()
.unwrap();
let unix_res = client.get("https:///local/foo.socket")
.send()
.await
.expect("send request");
let ip_res = client.get("https://google.com")
.send()
.await
.expect("send request"); although you may want to use relative paths for some reason, im not sure if thats a good way to do it. |
Actually no, this won't work at all, what I said won't either. The actual request URL still has to be extracted somehow, and ideally the Host header has to be set. If you do something like that, neither will be (easily) possible. Perhaps get() could take a type that specifies a socket to connect to instead of trying to resolve the address in the request URL. E.g. EDIT: seems like this is actually very close to the second proposed alternative in the OP. :) |
Yea that would work for me! |
Those methods do take a The other existing problem right now is that the connection pool implementation keys connections based on |
Besides that, you could use this implementation currently and just use 2 |
Utilize seanmonstar/reqwest#2624 which resolves seanmonstar/reqwest#39.
@seanmonstar Hi. Is there any concerns about this PR that you still need to solve, or is this something that is just waiting to land when a new minor reqwest is ready to be released? |
I initially started coding on this at request of someone with plans to use it. Before merging, I wanted to see if it ended up serving the needs, or if through usage there were some changes needed. So, currently waiting. |
It works great for the project I'm working on (talking to docker over a unix socket)! |
This fits my usecase ! |
I'm writing up a test suite for a server listening to HTTP over a Unix socket and this works like a charm. The current behavior of the |
2152574
to
3fb061f
Compare
Is it possible to merge this PR? We would love to use this feature as well. |
I try to use this branch in my test but I'm confused on how to reach the unix socket. I show you my code: In the
I use that in my app like this:
But I'm now confused on how to use it in my test. Here you see how I have written my tests beforehand with a classical url. I don't know how I can now target the socket-path with my request:
|
If you constructed a |
Thanks. It now works for me. I had to understand, that the url-host you give to reqwest doesn't matter to a unix socket, but you still have to give one. It also only works with files for me, that I didn't create but that are created by tokios UnixListener.
|
It would be convenient if there was a |
Utilize seanmonstar/reqwest#2624 which resolves seanmonstar/reqwest#39.
Utilize seanmonstar/reqwest#2624 which resolves seanmonstar/reqwest#39.
I did a proof-of-concept of using this in the Datadog PHP profiler. It's awkward to have to construct a URL, but I assume it's because:
But for now, using |
@morrisonlevi thanks for the feedback! Yep, those two pieces, and also: it needs to construct a |
Are there any remaining blockers to merging this? Wondering when we can plan to start using this? |
Nope, no blockers, thanks for all the feedback! |
Utilize seanmonstar/reqwest#2624 which resolves seanmonstar/reqwest#39.
Bumps reqwest from 0.12.22 to 0.12.23. Release notes Sourced from reqwest's releases. v0.12.23 tl;dr 🇺🇩🇸 Add ClientBuilder::unix_socket(path) option that will force all requests over that Unix Domain Socket. 🔁 Add ClientBuilder::retries(policy) and reqwest::retry::Builder to configure automatic retries. Add ClientBuilder::dns_resolver2() with more ergonomic argument bounds, allowing more resolver implementations. Add http3_* options to blocking::ClientBuilder. Fix default TCP timeout values to enabled and faster. Fix SOCKS proxies to default to port 1080 (wasm) Add cache methods to RequestBuilder. What's Changed Minimize package size by @weiznich in seanmonstar/reqwest#2759 chore(dev-dependencies): bump brotli by @seanmonstar in seanmonstar/reqwest#2760 upgrade hickory-dns to 0.25 by @seanmonstar in seanmonstar/reqwest#2761 Re-expose http3 options in blocking::clientBuilder by @ducaale in seanmonstar/reqwest#2770 fix(proxy): restore default port 1080 for SOCKS proxies without explicit port by @0x676e67 in seanmonstar/reqwest#2771 ci: use msrv-aware cargo in msrv job by @seanmonstar in seanmonstar/reqwest#2779 feat: add request cache option for wasm by @Spxg in seanmonstar/reqwest#2775 style(client): use std::task::ready! macro to simplify Poll branch match by @0x676e67 in seanmonstar/reqwest#2781 fix: add default tcp keepalive and user_timeout values by @seanmonstar in seanmonstar/reqwest#2780 feat: add unix_socket() option to client builder by @seanmonstar in seanmonstar/reqwest#2624 Add retry policies by @seanmonstar in seanmonstar/reqwest#2763 refactor: loosen retry for_host parameter bounds by @Enduriel in seanmonstar/reqwest#2792 feat: add dns_resolver2 that is more ergonomic and flexible by @seanmonstar in seanmonstar/reqwest#2793 Prepare v0.12.23 by @seanmonstar in seanmonstar/reqwest#2795 New Contributors @weiznich made their first contribution in seanmonstar/reqwest#2759 @Spxg made their first contribution in seanmonstar/reqwest#2775 @Enduriel made their first contribution in seanmonstar/reqwest#2792 Full Changelog: seanmonstar/[email protected] Changelog Sourced from reqwest's changelog. v0.12.23 Add ClientBuilder::unix_socket(path) option that will force all requests over that Unix Domain Socket. Add ClientBuilder::retries(policy) and reqwest::retry::Builder to configure automatic retries. Add ClientBuilder::dns_resolver2() with more ergonomic argument bounds, allowing more resolver implementations. Add http3_* options to blocking::ClientBuilder. Fix default TCP timeout values to enabled and faster. Fix SOCKS proxies to default to port 1080 (wasm) Add cache methods to RequestBuilder. Commits ae7375b v0.12.23 9aacdc1 feat: add dns_resolver2 that is more ergonomic and flexible (#2793) 221be11 refactor: loosen retry for_host parameter bounds (#2792) acd1b05 feat: add reqwest::retry policies (#2763) 54b6022 feat: add ClientBuilder::unix_socket() option (#2624) 6358cef fix: add default tcp keepalive and user_timeout values (#2780) 21226a5 style(client): use std::task::ready! macro to simplify Poll branch matching... 82086e7 feat: add request cache options for wasm (#2775) 2a0f7a3 ci: use msrv-aware cargo in msrv job (#2779) f186803 fix(proxy): restore default port 1080 for SOCKS proxies without explicit port... Additional commits viewable in compare view Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase. Dependabot commands and options You can trigger Dependabot actions by commenting on this PR: @dependabot rebase will rebase this PR @dependabot recreate will recreate this PR, overwriting any edits that have been made to it @dependabot merge will merge this PR after your CI passes on it @dependabot squash and merge will squash and merge this PR after your CI passes on it @dependabot cancel merge will cancel a previously requested merge and block automerging @dependabot reopen will reopen this PR if it is closed @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Utilize seanmonstar/reqwest#2624 which resolves seanmonstar/reqwest#39.
Adds a new option,
ClientBuilder::unix_socket(path)
, if set, will force all connections to use that instead of TCP. TLS works as expected. Thinking on my own experience, if I need to use unix sockets, I'm not usually using the same configured client for external requests too. This way provides a useful easy option, and we're slowly working on making reqwest more modular.Closes #39
Background (originally at #39 (comment))