Skip to content
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

Merged
merged 1 commit into from
Feb 23, 2021

Conversation

tailrecur
Copy link
Contributor

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.

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

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.
@sagebind
Copy link
Collaborator

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.

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.

@alexcrichton
Copy link
Owner

Thanks for the PR! Agreed that we probably shouldn't change the default for now, but seems good to add regardless!

@alexcrichton alexcrichton merged commit 2684931 into alexcrichton:master Feb 23, 2021
bors referenced this pull request in rust-lang/rust-semverver Mar 15, 2021
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants