mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-05-10 05:50:02 +00:00
Disable tcp_nodelay
for reqwest::Client
and add rate limiting for https requests (#458)
This commit is contained in:
parent
8398ec2d4b
commit
76bc030f90
12 changed files with 243 additions and 99 deletions
|
@ -1,13 +1,19 @@
|
|||
use std::{ffi::OsString, path::PathBuf};
|
||||
use std::{
|
||||
ffi::OsString,
|
||||
fmt,
|
||||
num::{NonZeroU64, ParseIntError},
|
||||
path::PathBuf,
|
||||
str::FromStr,
|
||||
};
|
||||
|
||||
use binstalk::{
|
||||
errors::BinstallError,
|
||||
helpers::remote::tls::Version,
|
||||
manifests::cargo_toml_binstall::PkgFmt,
|
||||
ops::resolve::{CrateName, VersionReqExt},
|
||||
};
|
||||
use clap::{Parser, ValueEnum};
|
||||
use log::LevelFilter;
|
||||
use reqwest::tls::Version;
|
||||
use semver::VersionReq;
|
||||
|
||||
#[derive(Debug, Parser)]
|
||||
|
@ -108,6 +114,21 @@ pub struct Args {
|
|||
#[clap(help_heading = "Overrides", long)]
|
||||
pub pkg_url: Option<String>,
|
||||
|
||||
/// Override the rate limit duration.
|
||||
///
|
||||
/// By default, cargo-binstall allows one request per 5 ms.
|
||||
///
|
||||
/// Example:
|
||||
///
|
||||
/// - `6`: Set the duration to 6ms, allows one request per 6 ms.
|
||||
///
|
||||
/// - `6/2`: Set the duration to 6ms and request_count to 2,
|
||||
/// allows 2 requests per 6ms.
|
||||
///
|
||||
/// Both duration and request count must not be 0.
|
||||
#[clap(help_heading = "Overrides", long, default_value_t = RateLimit::default())]
|
||||
pub rate_limit: RateLimit,
|
||||
|
||||
/// Disable symlinking / versioned updates.
|
||||
///
|
||||
/// By default, Binstall will install a binary named `<name>-<version>` in the install path, and
|
||||
|
@ -218,6 +239,45 @@ impl From<TLSVersion> for Version {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct RateLimit {
|
||||
pub duration: NonZeroU64,
|
||||
pub request_count: NonZeroU64,
|
||||
}
|
||||
|
||||
impl fmt::Display for RateLimit {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}/{}", self.duration, self.request_count)
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStr for RateLimit {
|
||||
type Err = ParseIntError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
Ok(if let Some((first, second)) = s.split_once('/') {
|
||||
Self {
|
||||
duration: first.parse()?,
|
||||
request_count: second.parse()?,
|
||||
}
|
||||
} else {
|
||||
Self {
|
||||
duration: s.parse()?,
|
||||
..Default::default()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for RateLimit {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
duration: NonZeroU64::new(5).unwrap(),
|
||||
request_count: NonZeroU64::new(1).unwrap(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse() -> Result<Args, BinstallError> {
|
||||
// Filter extraneous arg when invoked by cargo
|
||||
// `cargo run -- --help` gives ["target/debug/cargo-binstall", "--help"]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue