-
Notifications
You must be signed in to change notification settings - Fork 237
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
Add an option to set the expect 100 timeout #376
Conversation
For larger request bodies, `curl` will use an `Expect` header to first validate the request headers before sending the actual body. However, if the server does not reply within `CURLOPT_EXPECT_100_TIMEOUT_MS` then the server will send the request anyways. This behaviour can sometimes lead to higher total latency since in the best case, an additional server roundtrip is required and in the worst case, the request is delayed by `CURLOPT_EXPECT_100_TIMEOUT_MS`. The best-case scenario is where the request is invalid and the server replies with a `417 Expectation Failed` without having to wait for or process the request body at all. This commit adds the ability to define a custom timeout or override it by setting it to zero.
Probably not, changing the default curl behavior for this sort of thing is out of scope for curl-rust. We want to keep this crate as relatively neutral, safe bindings to libcurl. |
Thanks for the PR! Agreed that we probably shouldn't change the default for now, but seems good to add regardless! |
Bump curl from 0.4.34 to 0.4.35 Bumps [curl](https://github.com/alexcrichton/curl-rust) from 0.4.34 to 0.4.35. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/alexcrichton/curl-rust/releases">curl's releases</a>.</em></p> <blockquote> <h2>0.4.35</h2> <h2>Added</h2> <ul> <li>Add some more fields to <code>Debug</code> for <code>Version</code> (<a href="https://github.com/alexcrichton/curl-rust/issues/368">#368</a>)</li> <li>Add <code>expect_100_timeout</code> option to mirror <a href="https://curl.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html"><code>CURLOPT_EXPECT_100_TIMEOUT_MS</code></a> (<a href="https://github.com/alexcrichton/curl-rust/issues/376">#376</a>)</li> <li>Add feature-gated support for <code>curl_easy_upkeep</code>, introduced in 7.62.0. Use the <code>upkeep_7_62_0</code> feature to enable this method. (<a href="https://github.com/alexcrichton/curl-rust/issues/378">#378</a>)</li> </ul> <h2>Fixed</h2> <ul> <li>Probe for OpenSSL certificates only once (<a href="https://github.com/alexcrichton/curl-rust/issues/362">#362</a>, <a href="https://github.com/alexcrichton/curl-rust/issues/363">#363</a>)</li> <li>Upgrade socket2 dependency to a version not making invalid assumptions about the memory layout of <code>std::net::SocketAddr</code>. (<a href="https://github.com/alexcrichton/curl-rust/issues/365">#365</a>)</li> <li>Fix debug formatting for <code>Events</code> struct (<a href="https://github.com/alexcrichton/curl-rust/issues/377">#377</a>)</li> <li>Fix <code>tcp_nodelay</code> not working for static builds on Unix (<a href="https://github.com/alexcrichton/curl-rust/issues/379">#379</a>, <a href="https://github.com/alexcrichton/curl-rust/issues/381">#381</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/alexcrichton/curl-rust/commit/e220da3c650ae6ea55c08591f36ead6d4a94f97e"><code>e220da3</code></a> Add support for zlib-ng (<a href="https://github.com/alexcrichton/curl-rust/issues/351">#351</a>)</li> <li>See full diff in <a href="https://github.com/alexcrichton/curl-rust/compare/curl-sys-0.4.34...curl-sys-0.4.35">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=curl&package-manager=cargo&previous-version=0.4.34&new-version=0.4.35)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) 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-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> 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 </details>
For larger request bodies,
curl
will use anExpect
header to first validatethe request headers before sending the actual body. However, if the server does not
reply within
CURLOPT_EXPECT_100_TIMEOUT_MS
then the server will send the request anyways.This behaviour can sometimes lead to higher total latency since in the best case, an additional
server roundtrip is required and in the worst case, the request is delayed by
CURLOPT_EXPECT_100_TIMEOUT_MS
.The best-case scenario is where the request is invalid and the server replies with a
417 Expectation Failed
without having to wait for or process the request body at all.
This commit adds the ability to define a custom timeout or override it by setting it to zero.
We could also disable the default curl behaviour of sending the
Expect
header if the timeout is set to zero. IMO,curl-rust
seems like a lower-level library and so I'm not sure if doing this here makes sense.Related discussions:
sagebind/isahc#303
curl/curl#6635
/cc @sagebind