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

explain the options bootstrap passes to curl #129594

Merged
merged 2 commits into from
Sep 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions src/bootstrap/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,22 +106,29 @@ def _download(path, url, probably_big, verbose, exception):

try:
if (probably_big or verbose) and "GITHUB_ACTIONS" not in os.environ:
option = "-#"
option = "--progress-bar"
else:
option = "-s"
option = "--silent"
# If curl is not present on Win32, we should not sys.exit
# but raise `CalledProcessError` or `OSError` instead
require(["curl", "--version"], exception=platform_is_win32())
extra_flags = []
if curl_version() > (7, 70):
extra_flags = [ "--retry-all-errors" ]
# options should be kept in sync with
# src/bootstrap/src/core/download.rs
# for consistency.
# they are also more compreprensivly explained in that file.
run(["curl", option] + extra_flags + [
"-L", # Follow redirect.
"-y", "30", "-Y", "10", # timeout if speed is < 10 bytes/sec for > 30 seconds
"--connect-timeout", "30", # timeout if cannot connect within 30 seconds
"-o", path,
# Follow redirect.
"--location",
# timeout if speed is < 10 bytes/sec for > 30 seconds
"--speed-time", "30", "--speed-limit", "10",
# timeout if cannot connect within 30 seconds
"--connect-timeout", "30",
"--output", path,
"--continue-at", "-",
"--retry", "3", "-SRf", url],
"--retry", "3", "--show-error", "--remote-time", "--fail", url],
verbose=verbose,
exception=True, # Will raise RuntimeError on failure
)
Expand Down
31 changes: 24 additions & 7 deletions src/bootstrap/src/core/download.rs
Original file line number Diff line number Diff line change
Expand Up @@ -227,25 +227,42 @@ impl Config {
fn download_http_with_retries(&self, tempfile: &Path, url: &str, help_on_error: &str) {
println!("downloading {url}");
// Try curl. If that fails and we are on windows, fallback to PowerShell.
// options should be kept in sync with
// src/bootstrap/src/core/download.rs
// for consistency
let mut curl = command("curl");
curl.args([
"-y",
// follow redirect
"--location",
// timeout if speed is < 10 bytes/sec for > 30 seconds
"--speed-time",
"30",
"-Y",
"10", // timeout if speed is < 10 bytes/sec for > 30 seconds
"--speed-limit",
"10",
// timeout if cannot connect within 30 seconds
"--connect-timeout",
"30", // timeout if cannot connect within 30 seconds
"-o",
"30",
// output file
"--output",
tempfile.to_str().unwrap(),
// if there is an error, don't restart the download,
// instead continue where it left off.
"--continue-at",
"-",
// retry up to 3 times. note that this means a maximum of 4
// attempts will be made, since the first attempt isn't a *re*try.
"--retry",
"3",
"-SRf",
// show errors, even if --silent is specified
"--show-error",
// set timestamp of downloaded file to that of the server
"--remote-time",
// fail on non-ok http status
"--fail",
]);
// Don't print progress in CI; the \r wrapping looks bad and downloads don't take long enough for progress to be useful.
if CiEnv::is_ci() {
curl.arg("-s");
curl.arg("--silent");
} else {
curl.arg("--progress-bar");
}
Expand Down
Loading