From 18d3d1b530309e4ffefc9b9f135fd7fc8ff21b20 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 9 Jul 2022 08:06:39 +0000 Subject: [PATCH 01/75] Add status code in response assignations It is really interesting to hold the request status codes to be able to interact with them. For example assertion but it can be nice for other flow paths. --- README.md | 5 +++++ example/benchmark.yml | 6 ++++++ src/actions/assert.rs | 6 +++--- src/actions/assign.rs | 6 +++--- src/actions/delay.rs | 2 +- src/actions/exec.rs | 6 +++--- src/actions/mod.rs | 12 +++++++----- src/actions/request.rs | 14 +++++++++----- 8 files changed, 37 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index f5d9ff2..f9fcc57 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,11 @@ plan: request: url: /api/users/{{ foo.body.manager_id }} + - name: Assert request response code + assert: + key: foo.status + value: 200 + - name: Assign values assign: key: bar diff --git a/example/benchmark.yml b/example/benchmark.yml index d5abce4..cf4f1ff 100644 --- a/example/benchmark.yml +++ b/example/benchmark.yml @@ -55,6 +55,7 @@ plan: - 75 - name: Fetch some users by hash + assign: fetchuser request: url: /api/users/{{ item.id }} shuffle: true @@ -63,6 +64,11 @@ plan: - { id: 73 } - { id: 75 } + - name: Assert request response code + assert: + key: fetchuser.status + value: 200 + - name: Assert values assert: key: bar diff --git a/src/actions/assert.rs b/src/actions/assert.rs index 57d8062..584a62e 100644 --- a/src/actions/assert.rs +++ b/src/actions/assert.rs @@ -27,9 +27,9 @@ impl Assert { let value = extract(&item["assert"], "value"); Assert { - name: name.to_string(), - key: key.to_string(), - value: value.to_string(), + name, + key, + value, } } } diff --git a/src/actions/assign.rs b/src/actions/assign.rs index 2486684..7588485 100644 --- a/src/actions/assign.rs +++ b/src/actions/assign.rs @@ -26,9 +26,9 @@ impl Assign { let value = extract(&item["assign"], "value"); Assign { - name: name.to_string(), - key: key.to_string(), - value: value.to_string(), + name, + key, + value, } } } diff --git a/src/actions/delay.rs b/src/actions/delay.rs index d53e99b..dbae034 100644 --- a/src/actions/delay.rs +++ b/src/actions/delay.rs @@ -27,7 +27,7 @@ impl Delay { let seconds = u64::try_from(item["delay"]["seconds"].as_i64().unwrap()).expect("Invalid number of seconds"); Delay { - name: name.to_string(), + name, seconds, } } diff --git a/src/actions/exec.rs b/src/actions/exec.rs index c4df3b2..9aec911 100644 --- a/src/actions/exec.rs +++ b/src/actions/exec.rs @@ -28,9 +28,9 @@ impl Exec { let assign = extract_optional(item, "assign"); Exec { - name: name.to_string(), - command: command.to_string(), - assign: assign.map(str::to_string), + name, + command, + assign, } } } diff --git a/src/actions/mod.rs b/src/actions/mod.rs index 8c7a50e..592f586 100644 --- a/src/actions/mod.rs +++ b/src/actions/mod.rs @@ -42,9 +42,9 @@ impl fmt::Display for Report { } } -pub fn extract_optional<'a>(item: &'a Yaml, attr: &'a str) -> Option<&'a str> { +pub fn extract_optional<'a>(item: &'a Yaml, attr: &'a str) -> Option { if let Some(s) = item[attr].as_str() { - Some(s) + Some(s.to_string()) } else { if item[attr].as_hash().is_some() { panic!("`{}` needs to be a string. Try adding quotes", attr); @@ -54,9 +54,11 @@ pub fn extract_optional<'a>(item: &'a Yaml, attr: &'a str) -> Option<&'a str> { } } -pub fn extract<'a>(item: &'a Yaml, attr: &'a str) -> &'a str { - if let Some(s) = item[attr].as_str() { - s +pub fn extract<'a>(item: &'a Yaml, attr: &'a str) -> String { + if let Some(s) = item[attr].as_i64() { + s.to_string() + } else if let Some(s) = item[attr].as_str() { + s.to_string() } else { if item[attr].as_hash().is_some() { panic!("`{}` is required needs to be a string. Try adding quotes", attr); diff --git a/src/actions/request.rs b/src/actions/request.rs index 8151fda..0811307 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -38,6 +38,7 @@ pub struct Request { #[derive(Serialize, Deserialize)] struct AssignedRequest { + status: u16, body: Value, headers: Map, } @@ -78,15 +79,15 @@ impl Request { } Request { - name: name.to_string(), - url: url.to_string(), + name, + url, time: 0.0, method, headers, - body: body.map(str::to_string), + body, with_item, index, - assign: assign.map(str::to_string), + assign, } } @@ -274,10 +275,12 @@ impl Runnable for Request { status: 520u16, }), Some(response) => { + let status = response.status().as_u16(); + reports.push(Report { name: self.name.to_owned(), duration: duration_ms, - status: response.status().as_u16(), + status, }); if response.cookies().count() > 0 { @@ -302,6 +305,7 @@ impl Runnable for Request { let body: Value = serde_json::from_str(&data).unwrap_or(serde_json::Value::Null); let assigned = AssignedRequest { + status, body, headers, }; From cc81817eb43b3f73ee6974e30083080b8568170e Mon Sep 17 00:00:00 2001 From: Serhii Ivashchenko <26857105+IvashchenkoSerhii@users.noreply.github.com> Date: Wed, 1 Jun 2022 22:01:50 +0300 Subject: [PATCH 02/75] Setting tags for skipping and selecting task --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 13 +- SYNTAX.md | 15 +- example/benchmark.yml | 6 + src/benchmark.rs | 10 +- src/expandable/include.rs | 40 ++--- src/expandable/multi_file_request.rs | 2 +- src/main.rs | 24 ++- src/reader.rs | 22 ++- src/tags.rs | 227 +++++++++++++++++++++++++++ 11 files changed, 328 insertions(+), 35 deletions(-) create mode 100644 src/tags.rs diff --git a/Cargo.lock b/Cargo.lock index ae4ac5e..82beab1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -284,7 +284,7 @@ checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" [[package]] name = "drill" -version = "0.7.2" +version = "0.7.3" dependencies = [ "async-trait", "clap", diff --git a/Cargo.toml b/Cargo.toml index e3b6310..218d317 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drill" -version = "0.7.2" +version = "0.7.3" authors = ["Ferran Basora "] description = "Drill is a HTTP load testing application written in Rust inspired by Ansible syntax" repository = "https://github.com/fcsonline/drill" diff --git a/README.md b/README.md index f9fcc57..7b7cf83 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,12 @@ plan: - 73 - 75 + - name: Tagged user request + request: + url: /api/users/70 + tags: + - tag_user + - name: Fetch some users by hash request: url: /api/users/{{ item.id }} @@ -226,6 +232,7 @@ This is the list of all features supported by the current version of `drill`: - **Cookie support:** create benchmarks with sessions because cookies are propagates between requests. - **Stats:** get nice statistics about all the requests. Example: [cookies.yml](./example/cookies.yml) - **Thresholds:** compare the current benchmark performance against a stored one session and fail if a threshold is exceeded. +- **Tags:** specify test plan items by tags. ## Test it @@ -240,7 +247,7 @@ production environments. Full list of cli options, which is available under `drill --help` ``` -drill 0.7.1 +drill 0.7.3 HTTP load testing application written in Rust inspired by Ansible syntax USAGE: @@ -248,6 +255,8 @@ USAGE: FLAGS: -h, --help Prints help information + --list-tags List all benchmark tags + --list-tasks List benchmark tasks (executes --tags/--skip-tags filter) -n, --nanosec Shows statistics in nanoseconds --no-check-certificate Disables SSL certification check. (Not recommended) -q, --quiet Disables output @@ -260,6 +269,8 @@ OPTIONS: -b, --benchmark Sets the benchmark file -c, --compare Sets a compare file -r, --report Sets a report file + --skip-tags Tags to exclude + --tags Tags to include -t, --threshold Sets a threshold value in ms amongst the compared file -o, --timeout Set timeout in seconds for all requests ``` diff --git a/SYNTAX.md b/SYNTAX.md index 361068a..bb48617 100644 --- a/SYNTAX.md +++ b/SYNTAX.md @@ -48,7 +48,8 @@ All those three items can be combined with `name` property to be show in logs. - `with_items`: List of items to be interpolated in the given request url. - `with_items_range`: Generates items from an iterator from start, step, stop. - `with_items_from_csv`: Read the given CSV values and go through all of them as items. -- `assign`: save the response in the context to be interpolated later. +- `assign`: Save the response in the context to be interpolated later. +- `tags`: List of tags for that item. #### with_items_from_csv item properties @@ -58,3 +59,15 @@ Second, it can be a hash with the following properties: - `file_name`: csv file containing the records to be used as items - `quote_char`: character to use as quote in csv parsing. Defaults to `"\""`, but can be set to `"\'"`. If your csv file has quoted strings that contain commas and that causes parse errors, make sure this value is set correctly. + +#### tags item properties + +[Ansible](https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html#special-tags-always-and-never)-like tags. + +If you assing list of tags, e.g `[tag1, tag2]`, this item will be executed if `tag1` **OR** `tag2` is passed. + +Special tags: `always` and `never`. + +If you assign the `always` tag, `drill` will always run that item, unless you specifically skip it (`--skip-tags always`). + +If you assign the `never` tag to item, `drill` will skip that item unless you specifically request it (`--tags never`). diff --git a/example/benchmark.yml b/example/benchmark.yml index cf4f1ff..505c88c 100644 --- a/example/benchmark.yml +++ b/example/benchmark.yml @@ -54,6 +54,12 @@ plan: - 73 - 75 + - name: Tagged user request + request: + url: /api/users/70 + tags: + - tag_user + - name: Fetch some users by hash assign: fetchuser request: diff --git a/src/benchmark.rs b/src/benchmark.rs index 94f6fee..2d48f26 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -10,6 +10,7 @@ use tokio::{runtime, time::delay_for}; use crate::actions::{Report, Runnable}; use crate::config::Config; use crate::expandable::include; +use crate::tags::Tags; use crate::writer; use reqwest::Client; @@ -53,7 +54,7 @@ fn join(l: Vec, sep: &str) -> String { ) } -pub fn execute(benchmark_path: &str, report_path_option: Option<&str>, relaxed_interpolations: bool, no_check_certificate: bool, quiet: bool, nanosec: bool, timeout: Option<&str>, verbose: bool) -> BenchmarkResult { +pub fn execute(benchmark_path: &str, report_path_option: Option<&str>, relaxed_interpolations: bool, no_check_certificate: bool, quiet: bool, nanosec: bool, timeout: Option<&str>, verbose: bool, tags: &Tags) -> BenchmarkResult { let config = Arc::new(Config::new(benchmark_path, relaxed_interpolations, no_check_certificate, quiet, nanosec, timeout.map_or(10, |t| t.parse().unwrap_or(10)), verbose)); if report_path_option.is_some() { @@ -73,7 +74,12 @@ pub fn execute(benchmark_path: &str, report_path_option: Option<&str>, relaxed_i let mut benchmark: Benchmark = Benchmark::new(); let pool_store: PoolStore = PoolStore::new(); - include::expand_from_filepath(benchmark_path, &mut benchmark, Some("plan")); + include::expand_from_filepath(benchmark_path, &mut benchmark, Some("plan"), tags); + + if benchmark.is_empty() { + eprintln!("Empty benchmark. Exiting."); + std::process::exit(1); + } let benchmark = Arc::new(benchmark); let pool = Arc::new(Mutex::new(pool_store)); diff --git a/src/expandable/include.rs b/src/expandable/include.rs index e2f5232..cc15762 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -1,12 +1,12 @@ use std::path::Path; -use std::process; -use yaml_rust::{Yaml, YamlEmitter, YamlLoader}; +use yaml_rust::{Yaml, YamlEmitter}; use crate::interpolator::INTERPOLATION_REGEX; use crate::actions; use crate::benchmark::Benchmark; use crate::expandable::{include, multi_csv_request, multi_file_request, multi_iter_request, multi_request}; +use crate::tags::Tags; use crate::reader; @@ -14,7 +14,7 @@ pub fn is_that_you(item: &Yaml) -> bool { item["include"].as_str().is_some() } -pub fn expand(parent_path: &str, item: &Yaml, mut benchmark: &mut Benchmark) { +pub fn expand(parent_path: &str, item: &Yaml, mut benchmark: &mut Benchmark, tags: &Tags) { let include_path = item["include"].as_str().unwrap(); if INTERPOLATION_REGEX.is_match(&include_path) { @@ -24,30 +24,18 @@ pub fn expand(parent_path: &str, item: &Yaml, mut benchmark: &mut Benchmark) { let include_filepath = Path::new(parent_path).with_file_name(include_path); let final_path = include_filepath.to_str().unwrap(); - expand_from_filepath(final_path, &mut benchmark, None); + expand_from_filepath(final_path, &mut benchmark, None, tags); } -pub fn expand_from_filepath(parent_path: &str, mut benchmark: &mut Benchmark, accessor: Option<&str>) { - let benchmark_file = reader::read_file(parent_path); - - let docs = YamlLoader::load_from_str(benchmark_file.as_str()).unwrap(); - let doc = &docs[0]; - let items; - - if let Some(accessor_id) = accessor { - items = match doc[accessor_id].as_vec() { - Some(items) => items, - None => { - println!("Node missing on config: {}", accessor_id); - println!("Exiting."); - process::exit(1) - } - } - } else { - items = doc.as_vec().unwrap(); - } +pub fn expand_from_filepath(parent_path: &str, mut benchmark: &mut Benchmark, accessor: Option<&str>, tags: &Tags) { + let docs = reader::read_file_as_yml(parent_path); + let items = reader::read_yaml_doc_accessor(&docs[0], accessor); for item in items { + if tags.should_skip_item(item) { + continue; + } + if multi_request::is_that_you(item) { multi_request::expand(item, &mut benchmark); } else if multi_iter_request::is_that_you(item) { @@ -57,7 +45,7 @@ pub fn expand_from_filepath(parent_path: &str, mut benchmark: &mut Benchmark, ac } else if multi_file_request::is_that_you(item) { multi_file_request::expand(parent_path, item, &mut benchmark); } else if include::is_that_you(item) { - include::expand(parent_path, item, &mut benchmark); + include::expand(parent_path, item, &mut benchmark, tags); } else if actions::Delay::is_that_you(item) { benchmark.push(Box::new(actions::Delay::new(item, None))); } else if actions::Exec::is_that_you(item) { @@ -87,7 +75,7 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand("example/benchmark.yml", &doc, &mut benchmark); + expand("example/benchmark.yml", &doc, &mut benchmark, &Tags::new(None, None)); assert_eq!(is_that_you(&doc), true); assert_eq!(benchmark.len(), 2); @@ -101,6 +89,6 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand("example/benchmark.yml", &doc, &mut benchmark); + expand("example/benchmark.yml", &doc, &mut benchmark, &Tags::new(None, None)); } } diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 420bf7d..9c7c24a 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -26,7 +26,7 @@ pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { let with_items_filepath = Path::new(parent_path).with_file_name(with_items_path); let final_path = with_items_filepath.to_str().unwrap(); - let mut with_items_file = reader::read_file_as_yml(final_path); + let mut with_items_file = reader::read_file_as_yml_array(final_path); if let Some(shuffle) = item["shuffle"].as_bool() { if shuffle { diff --git a/src/main.rs b/src/main.rs index ec0b687..35490c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ mod config; mod expandable; mod interpolator; mod reader; +mod tags; mod writer; use crate::actions::Report; @@ -29,10 +30,27 @@ fn main() { let nanosec = matches.is_present("nanosec"); let timeout = matches.value_of("timeout"); let verbose = matches.is_present("verbose"); + let tags_option = matches.value_of("tags"); + let skip_tags_option = matches.value_of("skip-tags"); + let list_tags = matches.is_present("list-tags"); + let list_tasks = matches.is_present("list-tasks"); + #[cfg(windows)] let _ = control::set_virtual_terminal(true); - let benchmark_result = benchmark::execute(benchmark_file, report_path_option, relaxed_interpolations, no_check_certificate, quiet, nanosec, timeout, verbose); + if list_tags { + tags::list_benchmark_file_tags(benchmark_file); + process::exit(0); + }; + + let tags = tags::Tags::new(tags_option, skip_tags_option); + + if list_tasks { + tags::list_benchmark_file_tasks(benchmark_file, &tags); + process::exit(0); + }; + + let benchmark_result = benchmark::execute(benchmark_file, report_path_option, relaxed_interpolations, no_check_certificate, quiet, nanosec, timeout, verbose, &tags); let list_reports = benchmark_result.reports; let duration = benchmark_result.duration; @@ -53,6 +71,10 @@ fn app_args<'a>() -> clap::ArgMatches<'a> { .arg(Arg::with_name("threshold").short("t").long("threshold").help("Sets a threshold value in ms amongst the compared file").takes_value(true).conflicts_with("report")) .arg(Arg::with_name("relaxed-interpolations").long("relaxed-interpolations").help("Do not panic if an interpolation is not present. (Not recommended)").takes_value(false)) .arg(Arg::with_name("no-check-certificate").long("no-check-certificate").help("Disables SSL certification check. (Not recommended)").takes_value(false)) + .arg(Arg::with_name("tags").long("tags").help("Tags to include").takes_value(true)) + .arg(Arg::with_name("skip-tags").long("skip-tags").help("Tags to exclude").takes_value(true)) + .arg(Arg::with_name("list-tags").long("list-tags").help("List all benchmark tags").takes_value(false).conflicts_with_all(&["tags", "skip-tags"])) + .arg(Arg::with_name("list-tasks").long("list-tasks").help("List benchmark tasks (executes --tags/--skip-tags filter)").takes_value(false)) .arg(Arg::with_name("quiet").short("q").long("quiet").help("Disables output").takes_value(false)) .arg(Arg::with_name("timeout").short("o").long("timeout").help("Set timeout in seconds for all requests").takes_value(true)) .arg(Arg::with_name("nanosec").short("n").long("nanosec").help("Shows statistics in nanoseconds").takes_value(false)) diff --git a/src/reader.rs b/src/reader.rs index b2ab826..6e2f2d0 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -22,7 +22,27 @@ pub fn read_file(filepath: &str) -> String { content } -pub fn read_file_as_yml(filepath: &str) -> yaml_rust::yaml::Array { +pub fn read_file_as_yml(filepath: &str) -> Vec { + let content = read_file(filepath); + yaml_rust::YamlLoader::load_from_str(content.as_str()).unwrap() +} + +pub fn read_yaml_doc_accessor<'a>(doc: &'a yaml_rust::Yaml, accessor: Option<&str>) -> &'a Vec { + if let Some(accessor_id) = accessor { + match doc[accessor_id].as_vec() { + Some(items) => items, + None => { + println!("Node missing on config: {}", accessor_id); + println!("Exiting."); + std::process::exit(1) + } + } + } else { + doc.as_vec().unwrap() + } +} + +pub fn read_file_as_yml_array(filepath: &str) -> yaml_rust::yaml::Array { let path = Path::new(filepath); let display = path.display(); diff --git a/src/tags.rs b/src/tags.rs new file mode 100644 index 0000000..3351295 --- /dev/null +++ b/src/tags.rs @@ -0,0 +1,227 @@ +use crate::reader; +use colored::*; +use std::collections::HashSet; +use yaml_rust::{Yaml, YamlEmitter}; + +#[derive(Debug)] +pub struct Tags<'a> { + pub tags: Option>, + pub skip_tags: Option>, +} + +impl<'a> Tags<'a> { + pub fn new(tags_option: Option<&'a str>, skip_tags_option: Option<&'a str>) -> Self { + let tags: Option> = tags_option.map(|m| m.split(',').into_iter().map(|s| s.trim()).collect()); + let skip_tags: Option> = skip_tags_option.map(|m| m.split(',').into_iter().map(|s| s.trim()).collect()); + + if let (Some(t), Some(s)) = (&tags, &skip_tags) { + if !t.is_disjoint(s) { + panic!("`tags` and `skip-tags` must not contain the same values!"); + } + } + + Tags { + tags, + skip_tags, + } + } + + pub fn should_skip_item(&self, item: &Yaml) -> bool { + match item["tags"].as_vec() { + Some(item_tags_raw) => { + let item_tags: HashSet<&str> = item_tags_raw.iter().map(|t| t.as_str().unwrap()).collect(); + if let Some(s) = &self.skip_tags { + if !s.is_disjoint(&item_tags) { + return true; + } + } + if let Some(t) = &self.tags { + if item_tags.contains("never") && !t.contains("never") { + return true; + } + if !t.is_disjoint(&item_tags) { + return false; + } + } + if item_tags.contains("always") { + return false; + } + if item_tags.contains("never") { + return true; + } + self.tags.is_some() + } + None => self.tags.is_some(), + } + } +} + +pub fn list_benchmark_file_tasks(benchmark_file: &str, tags: &Tags) { + let docs = reader::read_file_as_yml(benchmark_file); + let items = reader::read_yaml_doc_accessor(&docs[0], Some("plan")); + + println!(); + + if let Some(tags) = &tags.tags { + let mut tags: Vec<_> = tags.into_iter().collect(); + tags.sort(); + println!("{:width$} {:width2$?}", "Tags".green(), &tags, width = 15, width2 = 25); + } + if let Some(tags) = &tags.skip_tags { + let mut tags: Vec<_> = tags.into_iter().collect(); + tags.sort(); + println!("{:width$} {:width2$?}", "Skip-Tags".green(), &tags, width = 15, width2 = 25); + } + + let items: Vec<_> = items.iter().filter(|item| !tags.should_skip_item(item)).collect(); + + if items.is_empty() { + println!("{}", "No items".red()); + std::process::exit(1) + } + + for item in items { + let mut out_str = String::new(); + let mut emitter = YamlEmitter::new(&mut out_str); + emitter.dump(item).unwrap(); + println!("{}", out_str); + } +} + +pub fn list_benchmark_file_tags(benchmark_file: &str) { + let docs = reader::read_file_as_yml(benchmark_file); + let items = reader::read_yaml_doc_accessor(&docs[0], Some("plan")); + + println!(); + + if items.is_empty() { + println!("{}", "No items".red()); + std::process::exit(1) + } + let mut tags: HashSet<&str> = HashSet::new(); + for item in items { + if let Some(item_tags_raw) = item["tags"].as_vec() { + tags.extend(item_tags_raw.iter().map(|t| t.as_str().unwrap())); + } + } + + let mut tags: Vec<_> = tags.into_iter().collect(); + tags.sort(); + println!("{:width$} {:?}", "Tags".green(), &tags, width = 15); +} + +#[cfg(test)] +mod tests { + use super::*; + + fn str_to_yaml(text: &str) -> Yaml { + let mut docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + docs.remove(0) + } + + fn prepare_default_item() -> Yaml { + str_to_yaml("---\nname: foo\nrequest:\n url: /\ntags:\n - tag1\n - tag2") + } + + #[test] + #[should_panic] + fn same_tags_and_skip_tags() { + let _ = Tags::new(Some("tag1"), Some("tag1")); + } + + #[test] + fn empty_tags_both() { + let item = str_to_yaml("---\nname: foo\nrequest:\n url: /"); + let tags = Tags::new(None, None); + assert!(!tags.should_skip_item(&item)); + } + + #[test] + fn empty_tags() { + let tags = Tags::new(None, None); + assert!(!tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn tags_contains() { + let tags = Tags::new(Some("tag1"), None); + assert!(!tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn tags_contains_second() { + let tags = Tags::new(Some("tag2"), None); + assert!(!tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn tags_contains_both() { + let tags = Tags::new(Some("tag1,tag2"), None); + assert!(!tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn tags_not_contains() { + let tags = Tags::new(Some("tag99"), None); + assert!(tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn skip_tags_not_contains() { + let tags = Tags::new(None, Some("tag99")); + assert!(!tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn skip_tags_contains() { + let tags = Tags::new(None, Some("tag1")); + assert!(tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn skip_tags_contains_second() { + let tags = Tags::new(None, Some("tag2")); + assert!(tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn tags_contains_but_also_skip_tags_contains() { + let tags = Tags::new(Some("tag1"), Some("tag2")); + assert!(tags.should_skip_item(&prepare_default_item())); + } + + #[test] + fn never_skipped_by_default() { + let item = str_to_yaml("---\nname: foo\nrequest:\n url: /\ntags:\n - never\n - tag2"); + let tags = Tags::new(None, None); + assert!(tags.should_skip_item(&item)); + } + + #[test] + fn never_tag_skipped_even_when_other_tag_included() { + let item = str_to_yaml("---\nname: foo\nrequest:\n url: /\ntags:\n - never\n - tag2"); + let tags = Tags::new(Some("tag2"), None); + assert!(tags.should_skip_item(&item)); + } + + #[test] + fn include_never_tag() { + let item = str_to_yaml("---\nname: foo\nrequest:\n url: /\ntags:\n - never\n - tag2"); + let tags = Tags::new(Some("never"), None); + assert!(!tags.should_skip_item(&item)); + } + + #[test] + fn always_tag_included_by_default() { + let item = str_to_yaml("---\nname: foo\nrequest:\n url: /\ntags:\n - always\n - tag2"); + let tags = Tags::new(Some("tag99"), None); + assert!(!tags.should_skip_item(&item)); + } + + #[test] + fn skip_always_tag() { + let item = str_to_yaml("---\nname: foo\nrequest:\n url: /\ntags:\n - always\n - tag2"); + let tags = Tags::new(None, Some("always")); + assert!(tags.should_skip_item(&item)); + } +} From 1915f64c61d2a343b369f7d20a15ec0a2255ada0 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 9 Jul 2022 15:12:54 +0000 Subject: [PATCH 03/75] Move from Travis to Github Actions --- .github/workflows/audit.yml | 16 ++++++++ .github/workflows/general.yml | 69 +++++++++++++++++++++++++++++++++++ .travis.yml | 22 ----------- 3 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/audit.yml create mode 100644 .github/workflows/general.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml new file mode 100644 index 0000000..abcbbff --- /dev/null +++ b/.github/workflows/audit.yml @@ -0,0 +1,16 @@ +name: Security audit +on: + push: + paths: + - '**/Cargo.toml' + - '**/Cargo.lock' + schedule: + - cron: '0 0 * * *' +jobs: + security_audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions-rs/audit-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml new file mode 100644 index 0000000..8d32d10 --- /dev/null +++ b/.github/workflows/general.yml @@ -0,0 +1,69 @@ +name: Rust + +on: [push] + +env: + CARGO_TERM_COLOR: always + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - uses: actions-rs/cargo@v1 + with: + command: test + + fmt: + name: Rustfmt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + components: rustfmt + - uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + + # clippy: + # name: Clippy + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v2 + # - uses: actions-rs/toolchain@v1 + # with: + # toolchain: stable + # override: true + # components: clippy + # - uses: actions-rs/clippy-check@v1 + # with: + # token: ${{ secrets.GITHUB_TOKEN }} + # args: -- -D warnings + + coverage: + name: Code coverage + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + + - name: Run cargo-tarpaulin + uses: actions-rs/tarpaulin@v0.1 + with: + args: '--ignore-tests' diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9eda9d2..0000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -language: rust -cache: cargo -dist: trusty -os: - - linux - - osx - -rust: - # FIXME: Enable again when rustfmt is available on nightly - # - nightly - - stable - -before_script: - - rustup component add rustfmt - - cargo install --force cargo-audit - - cargo generate-lockfile - -script: - - cargo fmt --all -- --check - - cargo build - - cargo test - - cargo audit From 51238db8d5df918957d5d26c05a4665505888cb9 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 9 Jul 2022 16:15:11 +0000 Subject: [PATCH 04/75] Fix clippy offenses and enable GH action Fix clippy offenses in the source code and enable GH action check for clippy. --- .github/workflows/general.yml | 28 +++++++++++++-------------- src/actions/exec.rs | 2 +- src/actions/mod.rs | 16 ++++++--------- src/actions/request.rs | 25 ++++++++++++++---------- src/benchmark.rs | 1 + src/config.rs | 4 ++-- src/expandable/include.rs | 29 +++++++++++++++------------- src/expandable/multi_csv_request.rs | 8 ++++---- src/expandable/multi_file_request.rs | 6 +++--- src/expandable/multi_iter_request.rs | 14 +++++++------- src/expandable/multi_request.rs | 6 +++--- src/interpolator.rs | 4 ++-- src/main.rs | 2 +- src/tags.rs | 6 +++--- 14 files changed, 78 insertions(+), 73 deletions(-) diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 8d32d10..22105fa 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -35,20 +35,20 @@ jobs: command: fmt args: --all -- --check - # clippy: - # name: Clippy - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v2 - # - uses: actions-rs/toolchain@v1 - # with: - # toolchain: stable - # override: true - # components: clippy - # - uses: actions-rs/clippy-check@v1 - # with: - # token: ${{ secrets.GITHUB_TOKEN }} - # args: -- -D warnings + clippy: + name: Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + components: clippy + - uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: -- -D warnings coverage: name: Code coverage diff --git a/src/actions/exec.rs b/src/actions/exec.rs index 9aec911..2c32e03 100644 --- a/src/actions/exec.rs +++ b/src/actions/exec.rs @@ -49,7 +49,7 @@ impl Runnable for Exec { let execution = Command::new(args[0]).args(&args[1..]).output().expect("Couldn't run it"); let output: String = String::from_utf8_lossy(&execution.stdout).into(); - let output = output.trim_end().to_string().to_owned(); + let output = output.trim_end().to_string(); if let Some(ref key) = self.assign { context.insert(key.to_owned(), json!(output)); diff --git a/src/actions/mod.rs b/src/actions/mod.rs index 592f586..46c9d9e 100644 --- a/src/actions/mod.rs +++ b/src/actions/mod.rs @@ -45,12 +45,10 @@ impl fmt::Display for Report { pub fn extract_optional<'a>(item: &'a Yaml, attr: &'a str) -> Option { if let Some(s) = item[attr].as_str() { Some(s.to_string()) + } else if item[attr].as_hash().is_some() { + panic!("`{}` needs to be a string. Try adding quotes", attr); } else { - if item[attr].as_hash().is_some() { - panic!("`{}` needs to be a string. Try adding quotes", attr); - } else { - None - } + None } } @@ -59,11 +57,9 @@ pub fn extract<'a>(item: &'a Yaml, attr: &'a str) -> String { s.to_string() } else if let Some(s) = item[attr].as_str() { s.to_string() + } else if item[attr].as_hash().is_some() { + panic!("`{}` is required needs to be a string. Try adding quotes", attr); } else { - if item[attr].as_hash().is_some() { - panic!("`{}` is required needs to be a string. Try adding quotes", attr); - } else { - panic!("Unknown node `{}` => {:?}", attr, item[attr]); - } + panic!("Unknown node `{}` => {:?}", attr, item[attr]); } } diff --git a/src/actions/request.rs b/src/actions/request.rs index 0811307..108f19b 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -24,6 +24,7 @@ use crate::actions::{Report, Runnable}; static USER_AGENT: &str = "drill"; #[derive(Clone)] +#[allow(dead_code)] pub struct Request { name: String, url: String, @@ -54,7 +55,7 @@ impl Request { let assign = extract_optional(item, "assign"); let method = if let Some(v) = extract_optional(&item["request"], "method") { - v.to_string().to_uppercase() + v.to_uppercase() } else { "GET".to_string() }; @@ -121,7 +122,7 @@ impl Request { match context.get("base") { Some(value) => { if let Some(vs) = value.as_str() { - format!("{}{}", vs.to_string(), interpolated_url) + format!("{}{}", vs, interpolated_url) } else { panic!("{} Wrong type 'base' variable!", "WARNING!".yellow().bold()); } @@ -257,7 +258,7 @@ impl Runnable for Request { } if self.index.is_some() { - context.insert("index".to_string(), json!(self.index.clone().unwrap())); + context.insert("index".to_string(), json!(self.index.unwrap())); } let (res, duration_ms) = self.send_request(context, pool, config).await; @@ -319,7 +320,9 @@ impl Runnable for Request { None }; - log_message_response.map(|msg| log_response(msg, &data)); + if let Some(msg) = log_message_response { + log_response(msg, &data) + } } } } @@ -328,9 +331,9 @@ impl Runnable for Request { fn log_request(request: &reqwest::Request) { let mut message = String::new(); write!(message, "{}", ">>>".bold().green()).unwrap(); - write!(message, " {} {},", "URL:".bold(), request.url().to_string()).unwrap(); - write!(message, " {} {},", "METHOD:".bold(), request.method().to_string()).unwrap(); - write!(message, " {} {}", "HEADERS:".bold(), format!("{:?}", request.headers())).unwrap(); + write!(message, " {} {},", "URL:".bold(), request.url()).unwrap(); + write!(message, " {} {},", "METHOD:".bold(), request.method()).unwrap(); + write!(message, " {} {:?}", "HEADERS:".bold(), request.headers()).unwrap(); println!("{}", message); } @@ -338,9 +341,9 @@ fn log_message_response(response: &Option, duration_ms: f64) let mut message = String::new(); match response { Some(response) => { - write!(message, " {} {},", "URL:".bold(), response.url().to_string()).unwrap(); + write!(message, " {} {},", "URL:".bold(), response.url()).unwrap(); write!(message, " {} {},", "STATUS:".bold(), response.status()).unwrap(); - write!(message, " {} {}", "HEADERS:".bold(), format!("{:?}", response.headers())).unwrap(); + write!(message, " {} {:?}", "HEADERS:".bold(), response.headers()).unwrap(); write!(message, " {} {:.4} ms,", "DURATION:".bold(), duration_ms).unwrap(); } None => { @@ -353,6 +356,8 @@ fn log_message_response(response: &Option, duration_ms: f64) fn log_response(log_message_response: String, body: &Option) { let mut message = String::new(); write!(message, "{}{}", "<<<".bold().green(), log_message_response).unwrap(); - body.as_ref().map(|body| write!(message, " {} {:?}", "BODY:".bold(), body).unwrap()); + if let Some(body) = body.as_ref() { + write!(message, " {} {:?}", "BODY:".bold(), body).unwrap() + } println!("{}", message); } diff --git a/src/benchmark.rs b/src/benchmark.rs index 2d48f26..7406ce4 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -54,6 +54,7 @@ fn join(l: Vec, sep: &str) -> String { ) } +#[allow(clippy::too_many_arguments)] pub fn execute(benchmark_path: &str, report_path_option: Option<&str>, relaxed_interpolations: bool, no_check_certificate: bool, quiet: bool, nanosec: bool, timeout: Option<&str>, verbose: bool, tags: &Tags) -> BenchmarkResult { let config = Arc::new(Config::new(benchmark_path, relaxed_interpolations, no_check_certificate, quiet, nanosec, timeout.map_or(10, |t| t.parse().unwrap_or(10)), verbose)); diff --git a/src/config.rs b/src/config.rs index 958548a..edfd2f2 100644 --- a/src/config.rs +++ b/src/config.rs @@ -58,7 +58,7 @@ fn read_str_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp match config_doc[name].as_str() { Some(value) => { if value.contains('{') { - interpolator.resolve(&value, true).to_owned() + interpolator.resolve(value, true) } else { value.to_owned() } @@ -77,7 +77,7 @@ fn read_i64_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp let value = if let Some(value) = config_doc[name].as_i64() { Some(value) } else if let Some(key) = config_doc[name].as_str() { - interpolator.resolve(&key, false).parse::().ok() + interpolator.resolve(key, false).parse::().ok() } else { None }; diff --git a/src/expandable/include.rs b/src/expandable/include.rs index cc15762..2579b49 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -14,20 +14,20 @@ pub fn is_that_you(item: &Yaml) -> bool { item["include"].as_str().is_some() } -pub fn expand(parent_path: &str, item: &Yaml, mut benchmark: &mut Benchmark, tags: &Tags) { +pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark, tags: &Tags) { let include_path = item["include"].as_str().unwrap(); - if INTERPOLATION_REGEX.is_match(&include_path) { + if INTERPOLATION_REGEX.is_match(include_path) { panic!("Interpolations not supported in 'include' property!"); } let include_filepath = Path::new(parent_path).with_file_name(include_path); let final_path = include_filepath.to_str().unwrap(); - expand_from_filepath(final_path, &mut benchmark, None, tags); + expand_from_filepath(final_path, benchmark, None, tags); } -pub fn expand_from_filepath(parent_path: &str, mut benchmark: &mut Benchmark, accessor: Option<&str>, tags: &Tags) { +pub fn expand_from_filepath(parent_path: &str, benchmark: &mut Benchmark, accessor: Option<&str>, tags: &Tags) { let docs = reader::read_file_as_yml(parent_path); let items = reader::read_yaml_doc_accessor(&docs[0], accessor); @@ -37,15 +37,15 @@ pub fn expand_from_filepath(parent_path: &str, mut benchmark: &mut Benchmark, ac } if multi_request::is_that_you(item) { - multi_request::expand(item, &mut benchmark); + multi_request::expand(item, benchmark); } else if multi_iter_request::is_that_you(item) { - multi_iter_request::expand(item, &mut benchmark); + multi_iter_request::expand(item, benchmark); } else if multi_csv_request::is_that_you(item) { - multi_csv_request::expand(parent_path, item, &mut benchmark); + multi_csv_request::expand(parent_path, item, benchmark); } else if multi_file_request::is_that_you(item) { - multi_file_request::expand(parent_path, item, &mut benchmark); + multi_file_request::expand(parent_path, item, benchmark); } else if include::is_that_you(item) { - include::expand(parent_path, item, &mut benchmark, tags); + include::expand(parent_path, item, benchmark, tags); } else if actions::Delay::is_that_you(item) { benchmark.push(Box::new(actions::Delay::new(item, None))); } else if actions::Exec::is_that_you(item) { @@ -65,8 +65,11 @@ pub fn expand_from_filepath(parent_path: &str, mut benchmark: &mut Benchmark, ac } } +#[cfg(test)] mod tests { - use super::*; + use crate::benchmark::Benchmark; + use crate::expandable::include::{expand, is_that_you}; + use crate::tags::Tags; #[test] fn expand_include() { @@ -75,9 +78,9 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand("example/benchmark.yml", &doc, &mut benchmark, &Tags::new(None, None)); + expand("example/benchmark.yml", doc, &mut benchmark, &Tags::new(None, None)); - assert_eq!(is_that_you(&doc), true); + assert_eq!(is_that_you(doc), true); assert_eq!(benchmark.len(), 2); } @@ -89,6 +92,6 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand("example/benchmark.yml", &doc, &mut benchmark, &Tags::new(None, None)); + expand("example/benchmark.yml", doc, &mut benchmark, &Tags::new(None, None)); } } diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index 4e86c0f..2f915ea 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -25,7 +25,7 @@ pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { unreachable!(); }; - if INTERPOLATION_REGEX.is_match(&with_items_path) { + if INTERPOLATION_REGEX.is_match(with_items_path) { panic!("Interpolations not supported in 'with_items_from_csv' property!"); } @@ -59,9 +59,9 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand("example/benchmark.yml", &doc, &mut benchmark); + expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(&doc), true); + assert_eq!(is_that_you(doc), true); assert_eq!(benchmark.len(), 2); } @@ -73,6 +73,6 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand("example/benchmark.yml", &doc, &mut benchmark); + expand("example/benchmark.yml", doc, &mut benchmark); } } diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 9c7c24a..0ad8b4d 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -19,7 +19,7 @@ pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { unreachable!(); }; - if INTERPOLATION_REGEX.is_match(&with_items_path) { + if INTERPOLATION_REGEX.is_match(with_items_path) { panic!("Interpolation not supported in 'with_items_from_file' property!"); } @@ -53,9 +53,9 @@ mod test { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand("example/benchmark.yml", &doc, &mut benchmark); + expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(&doc), true); + assert_eq!(is_that_you(doc), true); assert_eq!(benchmark.len(), 3); } } diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index 376848a..2a9cefc 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -26,15 +26,15 @@ pub fn expand(item: &Yaml, benchmark: &mut Benchmark) { let step: &str = vstep.as_str().unwrap_or(""); let stop: &str = vstop.as_str().unwrap_or(""); - if INTERPOLATION_REGEX.is_match(&start) { + if INTERPOLATION_REGEX.is_match(start) { panic!("Interpolations not supported in 'start' property!"); } - if INTERPOLATION_REGEX.is_match(&step) { + if INTERPOLATION_REGEX.is_match(step) { panic!("Interpolations not supported in 'step' property!"); } - if INTERPOLATION_REGEX.is_match(&stop) { + if INTERPOLATION_REGEX.is_match(stop) { panic!("Interpolations not supported in 'stop' property!"); } @@ -74,9 +74,9 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand(&doc, &mut benchmark); + expand(doc, &mut benchmark); - assert_eq!(is_that_you(&doc), true); + assert_eq!(is_that_you(doc), true); assert_eq!(benchmark.len(), 10); } @@ -88,7 +88,7 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand(&doc, &mut benchmark); + expand(doc, &mut benchmark); } #[test] @@ -99,6 +99,6 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand(&doc, &mut benchmark); + expand(doc, &mut benchmark); } } diff --git a/src/expandable/multi_request.rs b/src/expandable/multi_request.rs index 0c0173a..2491167 100644 --- a/src/expandable/multi_request.rs +++ b/src/expandable/multi_request.rs @@ -47,9 +47,9 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand(&doc, &mut benchmark); + expand(doc, &mut benchmark); - assert_eq!(is_that_you(&doc), true); + assert_eq!(is_that_you(doc), true); assert_eq!(benchmark.len(), 3); } @@ -61,6 +61,6 @@ mod tests { let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); - expand(&doc, &mut benchmark); + expand(doc, &mut benchmark); } } diff --git a/src/interpolator.rs b/src/interpolator.rs index bc16767..4295415 100644 --- a/src/interpolator.rs +++ b/src/interpolator.rs @@ -4,8 +4,8 @@ use regex::{Captures, Regex}; use crate::benchmark::Context; -static INTERPOLATION_PREFIX: &'static str = "{{"; -static INTERPOLATION_SUFFIX: &'static str = "}}"; +static INTERPOLATION_PREFIX: &str = "{{"; +static INTERPOLATION_SUFFIX: &str = "}}"; lazy_static! { pub static ref INTERPOLATION_REGEX: Regex = { diff --git a/src/main.rs b/src/main.rs index 35490c7..b43101d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -184,7 +184,7 @@ fn show_stats(list_reports: &[Vec], stats_option: bool, nanosec: bool, d fn compare_benchmark(list_reports: &[Vec], compare_path_option: Option<&str>, threshold_option: Option<&str>) { if let Some(compare_path) = compare_path_option { if let Some(threshold) = threshold_option { - let compare_result = checker::compare(&list_reports, compare_path, threshold); + let compare_result = checker::compare(list_reports, compare_path, threshold); match compare_result { Ok(_) => process::exit(0), diff --git a/src/tags.rs b/src/tags.rs index 3351295..22825a1 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -63,12 +63,12 @@ pub fn list_benchmark_file_tasks(benchmark_file: &str, tags: &Tags) { println!(); if let Some(tags) = &tags.tags { - let mut tags: Vec<_> = tags.into_iter().collect(); + let mut tags: Vec<_> = tags.iter().collect(); tags.sort(); println!("{:width$} {:width2$?}", "Tags".green(), &tags, width = 15, width2 = 25); } if let Some(tags) = &tags.skip_tags { - let mut tags: Vec<_> = tags.into_iter().collect(); + let mut tags: Vec<_> = tags.iter().collect(); tags.sort(); println!("{:width$} {:width2$?}", "Skip-Tags".green(), &tags, width = 15, width2 = 25); } @@ -106,7 +106,7 @@ pub fn list_benchmark_file_tags(benchmark_file: &str) { } let mut tags: Vec<_> = tags.into_iter().collect(); - tags.sort(); + tags.sort_unstable(); println!("{:width$} {:?}", "Tags".green(), &tags, width = 15); } From 375b6c9445a8c614313f3abb6b45cd950cecb599 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 10 Jul 2022 08:36:02 +0000 Subject: [PATCH 05/75] Update colored dependency --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 82beab1..00f6885 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -167,9 +167,9 @@ dependencies = [ [[package]] name = "colored" -version = "1.9.3" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" dependencies = [ "atty", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index 218d317..eeb06c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ edition = "2018" [dependencies] clap = "2.32.0" -colored = "1.7.0" +colored = "2.0.0" csv = "1.0.5" regex = "1.5.5" serde = { version = "1.0", features = ["derive"] } From f75120a184c09b6545e7e3d8104ff9b09b64421c Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 10 Jul 2022 08:38:18 +0000 Subject: [PATCH 06/75] Update rand dependency --- Cargo.lock | 20 +++++--------------- Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 00f6885..dff2298 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -296,7 +296,7 @@ dependencies = [ "linked-hash-map", "num_cpus", "openssl-sys", - "rand 0.7.3", + "rand 0.8.5", "regex", "reqwest", "serde", @@ -1077,19 +1077,18 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_hc", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.3", - "rand_hc 0.3.1", ] [[package]] @@ -1139,15 +1138,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "redox_syscall" version = "0.2.9" @@ -1462,7 +1452,7 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if 1.0.0", "libc", - "rand 0.8.4", + "rand 0.8.5", "redox_syscall", "remove_dir_all", "winapi 0.3.9", diff --git a/Cargo.toml b/Cargo.toml index eeb06c3..8788f79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ async-trait = "0.1.30" futures = "0.3.5" lazy_static = "1.4.0" num_cpus = "1.13.0" -rand = "0.7.3" +rand = "0.8.5" hdrhistogram = "7.4.0" # Add openssl-sys as a direct dependency so it can be cross compiled to From 034a59223086d267ed723600e7a308789fe9c6b6 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 10 Jul 2022 09:39:46 +0000 Subject: [PATCH 07/75] Update reqwest dependency --- Cargo.lock | 790 ++++++++++++++----------------------------- Cargo.toml | 4 +- src/actions/delay.rs | 4 +- src/benchmark.rs | 7 +- 4 files changed, 263 insertions(+), 542 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dff2298..e83be9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "addr2line" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" -dependencies = [ - "gimli", -] - [[package]] name = "adler" version = "1.0.2" @@ -32,7 +23,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -54,35 +45,14 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "backtrace" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base-x" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -120,12 +90,6 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytes" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" - [[package]] name = "bytes" version = "1.0.1" @@ -138,12 +102,6 @@ version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -173,20 +131,14 @@ checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" dependencies = [ "atty", "lazy_static", - "winapi 0.3.9", + "winapi", ] -[[package]] -name = "const_fn" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" - [[package]] name = "cookie" -version = "0.14.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" +checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" dependencies = [ "percent-encoding", "time", @@ -195,9 +147,9 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.12.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3818dfca4b0cb5211a659bbcbb94225b7127407b2b135e650d717bfb78ab10d3" +checksum = "2e4b6aa369f41f5faa04bb80c9b1f4216ea81646ed6124d76ba5c49a7aafd9cd" dependencies = [ "cookie", "idna", @@ -231,7 +183,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -240,7 +192,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", ] @@ -250,7 +202,7 @@ version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "lazy_static", ] @@ -262,7 +214,7 @@ checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" dependencies = [ "bstr", "csv-core", - "itoa", + "itoa 0.4.7", "ryu", "serde", ] @@ -277,10 +229,10 @@ dependencies = [ ] [[package]] -name = "discard" -version = "1.0.4" +name = "data-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" +checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" [[package]] name = "drill" @@ -296,7 +248,7 @@ dependencies = [ "linked-hash-map", "num_cpus", "openssl-sys", - "rand 0.8.5", + "rand", "regex", "reqwest", "serde", @@ -312,14 +264,14 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" +checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" dependencies = [ "heck", "proc-macro2", @@ -333,7 +285,7 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crc32fast", "libc", "miniz_oxide", @@ -370,22 +322,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - [[package]] name = "futures" version = "0.3.15" @@ -473,48 +409,31 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.6", + "pin-project-lite", "pin-utils", "proc-macro-hack", "proc-macro-nested", "slab", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.10.2+wasi-snapshot-preview1", ] -[[package]] -name = "gimli" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" - [[package]] name = "h2" -version = "0.2.7" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "bytes 0.5.6", + "bytes", "fnv", "futures-core", "futures-sink", @@ -525,7 +444,6 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "tracing-futures", ] [[package]] @@ -534,6 +452,12 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + [[package]] name = "hdrhistogram" version = "7.4.0" @@ -550,12 +474,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" [[package]] name = "hermit-abi" @@ -574,7 +495,7 @@ checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ "libc", "match_cfg", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -583,40 +504,41 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ - "bytes 1.0.1", + "bytes", "fnv", - "itoa", + "itoa 0.4.7", ] [[package]] name = "http-body" -version = "0.3.1" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 0.5.6", + "bytes", "http", + "pin-project-lite", ] [[package]] name = "httparse" -version = "1.4.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.13.10" +version = "0.14.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-channel", "futures-core", "futures-util", @@ -625,8 +547,8 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa", - "pin-project", + "itoa 1.0.2", + "pin-project-lite", "socket2", "tokio", "tower-service", @@ -636,15 +558,15 @@ dependencies = [ [[package]] name = "hyper-tls" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 0.5.6", + "bytes", "hyper", "native-tls", "tokio", - "tokio-tls", + "tokio-native-tls", ] [[package]] @@ -665,28 +587,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" dependencies = [ "autocfg", - "hashbrown", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", + "hashbrown 0.9.1", ] [[package]] name = "ipconfig" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" +checksum = "723519edce41262b05d4143ceb95050e4c614f483e78e9fd9e39a8275a84ad98" dependencies = [ "socket2", "widestring", - "winapi 0.3.9", - "winreg 0.6.2", + "winapi", + "winreg 0.7.0", ] [[package]] @@ -701,6 +614,12 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + [[package]] name = "js-sys" version = "0.3.51" @@ -710,16 +629,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -728,9 +637,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.97" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "linked-hash-map" @@ -738,13 +647,23 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +[[package]] +name = "lock_api" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -780,16 +699,6 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -[[package]] -name = "mime_guess" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "minimal-lexical" version = "0.1.4" @@ -808,51 +717,21 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.23" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", "libc", "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio-uds" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -dependencies = [ - "iovec", - "libc", - "mio", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] name = "native-tls" -version = "0.2.7" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -866,17 +745,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "net2" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - [[package]] name = "nom" version = "7.0.0" @@ -908,12 +776,12 @@ dependencies = [ ] [[package]] -name = "object" -version = "0.25.3" +name = "num_threads" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ - "memchr", + "libc", ] [[package]] @@ -929,7 +797,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "549430950c79ae24e6d02e0b7404534ecf311d94cc9f861e9e4020187d13d885" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -966,36 +834,33 @@ dependencies = [ ] [[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "pin-project" -version = "1.0.7" +name = "parking_lot" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "pin-project-internal", + "lock_api", + "parking_lot_core", ] [[package]] -name = "pin-project-internal" -version = "1.0.7" +name = "parking_lot_core" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ - "proc-macro2", - "quote", - "syn", + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", ] [[package]] -name = "pin-project-lite" -version = "0.1.12" +name = "percent-encoding" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project-lite" @@ -1035,21 +900,29 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" dependencies = [ - "unicode-xid", + "unicode-ident", ] +[[package]] +name = "psl-types" +version = "2.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8eda7c62d9ecaafdf8b62374c006de0adf61666ae96a96ba74a37134aa4e470" + [[package]] name = "publicsuffix" -version = "1.5.6" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b4ce31ff0a27d93c8de1849cf58162283752f065a90d508f1105fa6c9a213f" +checksum = "292972edad6bbecc137ab84c5e36421a4a6c979ea31d3cc73540dd04315b33e1" dependencies = [ + "byteorder", + "hashbrown 0.11.2", "idna", - "url", + "psl-types", ] [[package]] @@ -1067,19 +940,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -1087,18 +947,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", ] [[package]] @@ -1108,16 +958,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -1126,16 +967,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -1176,22 +1008,23 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] name = "reqwest" -version = "0.10.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" dependencies = [ "base64", - "bytes 0.5.6", + "bytes", "cookie", "cookie_store", "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "hyper", @@ -1201,21 +1034,22 @@ dependencies = [ "lazy_static", "log", "mime", - "mime_guess", "native-tls", "percent-encoding", - "pin-project-lite 0.2.6", + "pin-project-lite", + "proc-macro-hack", "serde", + "serde_json", "serde_urlencoded", - "time", "tokio", - "tokio-tls", + "tokio-native-tls", + "tower-service", "trust-dns-resolver", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.7.0", + "winreg 0.10.1", ] [[package]] @@ -1228,21 +1062,6 @@ dependencies = [ "quick-error", ] -[[package]] -name = "rustc-demangle" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - [[package]] name = "ryu" version = "1.0.5" @@ -1256,9 +1075,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ "lazy_static", - "winapi 0.3.9", + "winapi", ] +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + [[package]] name = "security-framework" version = "2.3.1" @@ -1282,35 +1107,20 @@ dependencies = [ "libc", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" -version = "1.0.126" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" dependencies = [ "proc-macro2", "quote", @@ -1319,33 +1129,27 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" dependencies = [ - "itoa", + "itoa 1.0.2", "ryu", "serde", ] [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa", + "itoa 1.0.2", "ryu", "serde", ] -[[package]] -name = "sha1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" - [[package]] name = "slab" version = "0.4.3" @@ -1360,73 +1164,14 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "socket2" -version = "0.3.19" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ - "cfg-if 1.0.0", "libc", - "winapi 0.3.9", -] - -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", + "winapi", ] -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "strsim" version = "0.8.0" @@ -1435,13 +1180,13 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1450,12 +1195,12 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "rand 0.8.5", + "rand", "redox_syscall", "remove_dir_all", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1489,41 +1234,21 @@ dependencies = [ [[package]] name = "time" -version = "0.2.27" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" +checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" dependencies = [ - "const_fn", + "itoa 1.0.2", "libc", - "standback", - "stdweb", + "num_threads", "time-macros", - "version_check", - "winapi 0.3.9", ] [[package]] name = "time-macros" -version = "0.1.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] - -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn", -] +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" [[package]] name = "tinyvec" @@ -1542,29 +1267,26 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "0.2.25" +version = "1.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" dependencies = [ - "bytes 0.5.6", - "fnv", - "futures-core", - "iovec", - "lazy_static", + "bytes", "libc", "memchr", "mio", - "mio-uds", "num_cpus", - "pin-project-lite 0.1.12", - "slab", + "once_cell", + "pin-project-lite", + "socket2", + "winapi", ] [[package]] -name = "tokio-tls" -version = "0.3.1" +name = "tokio-native-tls" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ "native-tls", "tokio", @@ -1572,16 +1294,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.3.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-core", "futures-sink", - "log", - "pin-project-lite 0.1.12", + "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -1596,9 +1318,8 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ - "cfg-if 1.0.0", - "log", - "pin-project-lite 0.2.6", + "cfg-if", + "pin-project-lite", "tracing-core", ] @@ -1611,49 +1332,44 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - [[package]] name = "trust-dns-proto" -version = "0.19.7" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cad71a0c0d68ab9941d2fb6e82f8fb2e86d9945b94e1661dd0aaea2b88215a9" +checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" dependencies = [ "async-trait", - "backtrace", - "cfg-if 1.0.0", + "cfg-if", + "data-encoding", "enum-as-inner", - "futures", + "futures-channel", + "futures-io", + "futures-util", "idna", + "ipnet", "lazy_static", "log", - "rand 0.7.3", + "rand", "smallvec", "thiserror", + "tinyvec", "tokio", "url", ] [[package]] name = "trust-dns-resolver" -version = "0.19.7" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" +checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" dependencies = [ - "cfg-if 0.1.10", - "futures", + "cfg-if", + "futures-util", "ipconfig", "lazy_static", "log", "lru-cache", + "parking_lot", "resolv-conf", "smallvec", "thiserror", @@ -1667,15 +1383,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.5" @@ -1685,6 +1392,12 @@ dependencies = [ "matches", ] +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -1694,24 +1407,12 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" - [[package]] name = "unicode-width" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "url" version = "2.2.2" @@ -1754,15 +1455,15 @@ dependencies = [ [[package]] name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" @@ -1770,9 +1471,7 @@ version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" dependencies = [ - "cfg-if 1.0.0", - "serde", - "serde_json", + "cfg-if", "wasm-bindgen-macro", ] @@ -1797,7 +1496,7 @@ version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -1844,15 +1543,9 @@ dependencies = [ [[package]] name = "widestring" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" - -[[package]] -name = "winapi" -version = "0.2.8" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" [[package]] name = "winapi" @@ -1864,12 +1557,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -1883,31 +1570,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "winreg" -version = "0.6.2" +name = "windows-sys" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "winapi 0.3.9", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", ] +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "winreg" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] -name = "ws2_32-sys" -version = "0.2.1" +name = "winreg" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "winapi", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8788f79..b484d05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,8 +18,8 @@ serde_json = "1.0.39" yaml-rust = "0.4.3" url = "2.1.1" linked-hash-map = "0.5.3" -tokio = { version = "0.2.20", features = ["rt-core", "rt-threaded", "time", "net", "io-driver"] } -reqwest = { version = "0.10.4", features = ["cookies", "trust-dns"] } +tokio = { version = "1.19.2", features = ["time", "net"] } +reqwest = { version = "0.11.11", features = ["cookies", "trust-dns"] } async-trait = "0.1.30" futures = "0.3.5" lazy_static = "1.4.0" diff --git a/src/actions/delay.rs b/src/actions/delay.rs index dbae034..f39b8e4 100644 --- a/src/actions/delay.rs +++ b/src/actions/delay.rs @@ -1,6 +1,6 @@ use async_trait::async_trait; use colored::*; -use tokio::time::delay_for; +use tokio::time::sleep; use yaml_rust::Yaml; use crate::actions::extract; @@ -36,7 +36,7 @@ impl Delay { #[async_trait] impl Runnable for Delay { async fn execute(&self, _context: &mut Context, _reports: &mut Reports, _pool: &Pool, config: &Config) { - delay_for(Duration::from_secs(self.seconds as u64)).await; + sleep(Duration::from_secs(self.seconds as u64)).await; if !config.quiet { println!("{:width$} {}{}", self.name.green(), self.seconds.to_string().cyan().bold(), "s".magenta(), width = 25); diff --git a/src/benchmark.rs b/src/benchmark.rs index 7406ce4..f77e990 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -5,7 +5,7 @@ use std::time::{Duration, Instant}; use futures::stream::{self, StreamExt}; use serde_json::{json, Value}; -use tokio::{runtime, time::delay_for}; +use tokio::{runtime, time::sleep}; use crate::actions::{Report, Runnable}; use crate::config::Config; @@ -31,7 +31,7 @@ pub struct BenchmarkResult { async fn run_iteration(benchmark: Arc, pool: Pool, config: Arc, iteration: i64) -> Vec { if config.rampup > 0 { let delay = config.rampup / config.iterations; - delay_for(Duration::new((delay * iteration) as u64, 0)).await; + sleep(Duration::new((delay * iteration) as u64, 0)).await; } let mut context: Context = Context::new(); @@ -70,7 +70,8 @@ pub fn execute(benchmark_path: &str, report_path_option: Option<&str>, relaxed_i println!(); let threads = std::cmp::min(num_cpus::get(), config.concurrency as usize); - let mut rt = runtime::Builder::new().threaded_scheduler().enable_all().core_threads(threads).max_threads(threads).build().unwrap(); + let rt = runtime::Builder::new_multi_thread().enable_all().worker_threads(threads).build().unwrap(); + rt.block_on(async { let mut benchmark: Benchmark = Benchmark::new(); let pool_store: PoolStore = PoolStore::new(); From bda054b7b7f81a84d5a09281bece687607947f70 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 10 Jul 2022 09:43:03 +0000 Subject: [PATCH 08/75] Update openssl dependency --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e83be9a..f84ff82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -812,9 +812,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-src" -version = "111.20.0+1.1.1o" +version = "111.22.0+1.1.1q" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92892c4f87d56e376e469ace79f1128fdaded07646ddf73aa0be4706ff712dec" +checksum = "8f31f0d509d1c1ae9cada2f9539ff8f37933831fd5098879e482aa687d659853" dependencies = [ "cc", ] From d0d1451283e874798d9ff1ea3f078ba8617dea77 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 10 Jul 2022 10:05:36 +0000 Subject: [PATCH 09/75] Bump version to 0.8.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f84ff82..c7085e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,7 +236,7 @@ checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" [[package]] name = "drill" -version = "0.7.3" +version = "0.8.0" dependencies = [ "async-trait", "clap", diff --git a/Cargo.toml b/Cargo.toml index b484d05..4a8c390 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drill" -version = "0.7.3" +version = "0.8.0" authors = ["Ferran Basora "] description = "Drill is a HTTP load testing application written in Rust inspired by Ansible syntax" repository = "https://github.com/fcsonline/drill" diff --git a/README.md b/README.md index 7b7cf83..0e3bbb5 100644 --- a/README.md +++ b/README.md @@ -247,7 +247,7 @@ production environments. Full list of cli options, which is available under `drill --help` ``` -drill 0.7.3 +drill 0.8.0 HTTP load testing application written in Rust inspired by Ansible syntax USAGE: From 0209fc9a58960bbb0fa972820896cc7113fb20a5 Mon Sep 17 00:00:00 2001 From: Hendric Eckelt Date: Sun, 17 Jul 2022 13:22:47 +0000 Subject: [PATCH 10/75] Implement a pick option Allows to pick a subset of items from with_items. Pick limits the amount of requests done instead of doing one for each item. When used in conjunction with shuffle it can be used to send one request with a random item from the list. Resolves #131 --- README.md | 10 +++++ example/benchmark.yml | 10 +++++ src/actions/request.rs | 2 +- src/expandable/include.rs | 2 +- src/expandable/mod.rs | 60 ++++++++++++++++++++++++++++ src/expandable/multi_csv_request.rs | 35 ++++++++++++++-- src/expandable/multi_file_request.rs | 37 ++++++++++++++--- src/expandable/multi_request.rs | 35 ++++++++++++++-- 8 files changed, 176 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0e3bbb5..6018425 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,16 @@ plan: Authorization: Basic aHR0cHdhdGNoOmY= X-Foo: Bar X-Bar: Bar {{ memory.headers.token }} + + - name: One request with a random item + request: + url: /api/users/{{ item }} + with_items: + - 70 + - 73 + - 75 + shuffle: true + pick: 1 ``` As you can see, you can play with interpolations in different ways. This diff --git a/example/benchmark.yml b/example/benchmark.yml index 505c88c..8fb9811 100644 --- a/example/benchmark.yml +++ b/example/benchmark.yml @@ -131,3 +131,13 @@ plan: url: /api/users method: POST body: foo=bar&arg={{ bar }} + + - name: One request with a random item + request: + url: /api/users/{{ item }} + with_items: + - 70 + - 73 + - 75 + shuffle: true + pick: 1 diff --git a/src/actions/request.rs b/src/actions/request.rs index 108f19b..8eeb72b 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -360,4 +360,4 @@ fn log_response(log_message_response: String, body: &Option) { write!(message, " {} {:?}", "BODY:".bold(), body).unwrap() } println!("{}", message); -} +} \ No newline at end of file diff --git a/src/expandable/include.rs b/src/expandable/include.rs index 2579b49..fbd4814 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -94,4 +94,4 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark, &Tags::new(None, None)); } -} +} \ No newline at end of file diff --git a/src/expandable/mod.rs b/src/expandable/mod.rs index 9674966..5d78418 100644 --- a/src/expandable/mod.rs +++ b/src/expandable/mod.rs @@ -4,3 +4,63 @@ mod multi_csv_request; mod multi_file_request; mod multi_iter_request; mod multi_request; + +use yaml_rust::Yaml; + +pub fn pick(item: &Yaml, with_items: &Vec) -> usize { + match item["pick"].as_i64() { + Some(value) => { + if value.is_negative() { + panic!("pick option should not be negative, but was {}", value); + } else if value as usize > with_items.len() { + panic!("pick option should not be greater than the provided items, but was {}", value); + } else { + value as usize + } + } + None => with_items.len() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + mod pick { + use super::*; + + #[test] + fn should_return_the_configured_value() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items:\n - 1\n - 2\n - 3"; + let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; + let pick = pick(item, item["with_items"].as_vec().unwrap()); + + assert_eq!(pick, 2); + } + + #[test] + fn should_return_the_with_items_length_if_unset() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\nwith_items:\n - 1\n - 2\n - 3"; + let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; + let pick = pick(item, item["with_items"].as_vec().unwrap()); + + assert_eq!(pick, 3); + } + + #[test] + #[should_panic(expected = "pick option should not be negative, but was -1")] + fn should_panic_for_negative_values() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: -1\nwith_items:\n - 1\n - 2\n - 3"; + let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; + pick(item, item["with_items"].as_vec().unwrap()); + } + + #[test] + #[should_panic(expected = "pick option should not be greater than the provided items, but was 4")] + fn should_panic_for_values_greater_than_the_items_list() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 4\nwith_items:\n - 1\n - 2\n - 3"; + let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; + pick(item, item["with_items"].as_vec().unwrap()); + } + } +} diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index 2f915ea..e73cf12 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -3,11 +3,11 @@ use rand::thread_rng; use std::path::Path; use yaml_rust::Yaml; -use crate::interpolator::INTERPOLATION_REGEX; - use crate::actions::Request; use crate::benchmark::Benchmark; +use crate::interpolator::INTERPOLATION_REGEX; use crate::reader; +use super::pick; pub fn is_that_you(item: &Yaml) -> bool { item["request"].as_hash().is_some() && (item["with_items_from_csv"].as_str().is_some() || item["with_items_from_csv"].as_hash().is_some()) @@ -41,7 +41,8 @@ pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { } } - for (index, with_item) in with_items_file.iter().enumerate() { + let pick = pick(item, &with_items_file); + for (index, with_item) in with_items_file.iter().take(pick).enumerate() { let index = index as u32; benchmark.push(Box::new(Request::new(item, Some(with_item.clone()), Some(index)))); @@ -65,6 +66,32 @@ mod tests { assert_eq!(benchmark.len(), 2); } + #[test] + fn expand_multi_should_limit_requests_using_the_pick_option() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items_from_csv: ./fixtures/users.csv"; + let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let doc = &docs[0]; + let mut benchmark: Benchmark = Benchmark::new(); + + expand("example/benchmark.yml", doc, &mut benchmark); + + assert_eq!(is_that_you(doc), true); + assert_eq!(benchmark.len(), 2); + } + + #[test] + fn expand_multi_should_work_with_pick_and_shuffle() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 1\nshuffle: true\nwith_items_from_csv: ./fixtures/users.csv"; + let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let doc = &docs[0]; + let mut benchmark: Benchmark = Benchmark::new(); + + expand("example/benchmark.yml", doc, &mut benchmark); + + assert_eq!(is_that_you(doc), true); + assert_eq!(benchmark.len(), 1); + } + #[test] #[should_panic] fn runtime_expand() { @@ -75,4 +102,4 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark); } -} +} \ No newline at end of file diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 0ad8b4d..379214c 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -1,13 +1,13 @@ +use crate::actions::Request; use crate::benchmark::Benchmark; use crate::interpolator::INTERPOLATION_REGEX; +use crate::reader; +use super::pick; use rand::seq::SliceRandom; use rand::thread_rng; use std::path::Path; use yaml_rust::Yaml; -use crate::actions::Request; -use crate::reader; - pub fn is_that_you(item: &Yaml) -> bool { item["request"].as_hash().is_some() && (item["with_items_from_file"].as_str().is_some() || item["with_items_from_file"].as_hash().is_some()) } @@ -35,7 +35,8 @@ pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { } } - for (index, with_item) in with_items_file.iter().enumerate() { + let pick = pick(item, &with_items_file); + for (index, with_item) in with_items_file.iter().take(pick).enumerate() { let index = index as u32; benchmark.push(Box::new(Request::new(item, Some(with_item.clone()), Some(index)))); @@ -58,4 +59,30 @@ mod test { assert_eq!(is_that_you(doc), true); assert_eq!(benchmark.len(), 3); } -} + + #[test] + fn expand_multi_should_limit_requests_using_the_pick_option() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items_from_file: ./fixtures/texts.txt"; + let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let doc = &docs[0]; + let mut benchmark: Benchmark = Benchmark::new(); + + expand("example/benchmark.yml", doc, &mut benchmark); + + assert_eq!(is_that_you(doc), true); + assert_eq!(benchmark.len(), 2); + } + + #[test] + fn expand_multi_should_work_with_pick_and_shuffle() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 1\nshuffle: true\nwith_items_from_file: ./fixtures/texts.txt"; + let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let doc = &docs[0]; + let mut benchmark: Benchmark = Benchmark::new(); + + expand("example/benchmark.yml", doc, &mut benchmark); + + assert_eq!(is_that_you(doc), true); + assert_eq!(benchmark.len(), 1); + } +} \ No newline at end of file diff --git a/src/expandable/multi_request.rs b/src/expandable/multi_request.rs index 2491167..b5f6ead 100644 --- a/src/expandable/multi_request.rs +++ b/src/expandable/multi_request.rs @@ -2,10 +2,10 @@ use rand::seq::SliceRandom; use rand::thread_rng; use yaml_rust::Yaml; -use crate::interpolator::INTERPOLATION_REGEX; - use crate::actions::Request; use crate::benchmark::Benchmark; +use crate::interpolator::INTERPOLATION_REGEX; +use super::pick; pub fn is_that_you(item: &Yaml) -> bool { item["request"].as_hash().is_some() && item["with_items"].as_vec().is_some() @@ -22,7 +22,8 @@ pub fn expand(item: &Yaml, benchmark: &mut Benchmark) { } } - for (index, with_item) in with_items_list.iter().enumerate() { + let pick = pick(item, &with_items_list); + for (index, with_item) in with_items_list.iter().take(pick).enumerate() { let index = index as u32; let value: &str = with_item.as_str().unwrap_or(""); @@ -53,6 +54,32 @@ mod tests { assert_eq!(benchmark.len(), 3); } + #[test] + fn expand_multi_should_limit_requests_using_the_pick_option() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items:\n - 1\n - 2\n - 3"; + let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let doc = &docs[0]; + let mut benchmark: Benchmark = Benchmark::new(); + + expand(doc, &mut benchmark); + + assert_eq!(is_that_you(doc), true); + assert_eq!(benchmark.len(), 2); + } + + #[test] + fn expand_multi_should_work_with_pick_and_shuffle() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 1\nshuffle: true\nwith_items:\n - 1\n - 2\n - 3"; + let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let doc = &docs[0]; + let mut benchmark: Benchmark = Benchmark::new(); + + expand(doc, &mut benchmark); + + assert_eq!(is_that_you(doc), true); + assert_eq!(benchmark.len(), 1); + } + #[test] #[should_panic] fn runtime_expand() { @@ -63,4 +90,4 @@ mod tests { expand(doc, &mut benchmark); } -} +} \ No newline at end of file From 3012159b6eff847ab1763d50c72bffe4eff10d8e Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Tue, 19 Jul 2022 15:04:57 +0000 Subject: [PATCH 11/75] Fix formatting --- src/actions/request.rs | 2 +- src/expandable/include.rs | 2 +- src/expandable/mod.rs | 2 +- src/expandable/multi_csv_request.rs | 4 ++-- src/expandable/multi_file_request.rs | 4 ++-- src/expandable/multi_request.rs | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/actions/request.rs b/src/actions/request.rs index 8eeb72b..108f19b 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -360,4 +360,4 @@ fn log_response(log_message_response: String, body: &Option) { write!(message, " {} {:?}", "BODY:".bold(), body).unwrap() } println!("{}", message); -} \ No newline at end of file +} diff --git a/src/expandable/include.rs b/src/expandable/include.rs index fbd4814..2579b49 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -94,4 +94,4 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark, &Tags::new(None, None)); } -} \ No newline at end of file +} diff --git a/src/expandable/mod.rs b/src/expandable/mod.rs index 5d78418..4ce5a47 100644 --- a/src/expandable/mod.rs +++ b/src/expandable/mod.rs @@ -18,7 +18,7 @@ pub fn pick(item: &Yaml, with_items: &Vec) -> usize { value as usize } } - None => with_items.len() + None => with_items.len(), } } diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index e73cf12..e5a24fd 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -3,11 +3,11 @@ use rand::thread_rng; use std::path::Path; use yaml_rust::Yaml; +use super::pick; use crate::actions::Request; use crate::benchmark::Benchmark; use crate::interpolator::INTERPOLATION_REGEX; use crate::reader; -use super::pick; pub fn is_that_you(item: &Yaml) -> bool { item["request"].as_hash().is_some() && (item["with_items_from_csv"].as_str().is_some() || item["with_items_from_csv"].as_hash().is_some()) @@ -102,4 +102,4 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark); } -} \ No newline at end of file +} diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 379214c..3e2d4d2 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -1,8 +1,8 @@ +use super::pick; use crate::actions::Request; use crate::benchmark::Benchmark; use crate::interpolator::INTERPOLATION_REGEX; use crate::reader; -use super::pick; use rand::seq::SliceRandom; use rand::thread_rng; use std::path::Path; @@ -85,4 +85,4 @@ mod test { assert_eq!(is_that_you(doc), true); assert_eq!(benchmark.len(), 1); } -} \ No newline at end of file +} diff --git a/src/expandable/multi_request.rs b/src/expandable/multi_request.rs index b5f6ead..c827068 100644 --- a/src/expandable/multi_request.rs +++ b/src/expandable/multi_request.rs @@ -2,10 +2,10 @@ use rand::seq::SliceRandom; use rand::thread_rng; use yaml_rust::Yaml; +use super::pick; use crate::actions::Request; use crate::benchmark::Benchmark; use crate::interpolator::INTERPOLATION_REGEX; -use super::pick; pub fn is_that_you(item: &Yaml) -> bool { item["request"].as_hash().is_some() && item["with_items"].as_vec().is_some() @@ -90,4 +90,4 @@ mod tests { expand(doc, &mut benchmark); } -} \ No newline at end of file +} From 79e426e4af0f6554491986debfb6ab9116ee615c Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Tue, 19 Jul 2022 15:07:06 +0000 Subject: [PATCH 12/75] Check CI on pull request --- .github/workflows/general.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 22105fa..bfb681f 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -1,6 +1,6 @@ name: Rust -on: [push] +on: [pull_request, push] env: CARGO_TERM_COLOR: always From 6bcd0a656eb51335441688a9ff236bcadedc3b6b Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Thu, 28 Jul 2022 11:00:42 +0000 Subject: [PATCH 13/75] Release workflow --- .github/workflows/release.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..17583fb --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,31 @@ +name: Release + +on: + release: + types: [published] + +jobs: + release: + name: release ${{ matrix.target }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - target: x86_64-unknown-linux-musl + archive: tar.gz + + # TODO: Enable more platforms in the future + # - target: x86_64-apple-darwin + # archive: zip + # - target: x86_64-pc-windows-gnu + # archive: zip + steps: + - uses: actions/checkout@master + - name: Compile and release + uses: rust-build/rust-build.action@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUSTTARGET: ${{ matrix.target }} + EXTRA_FILES: "README.md" + ARCHIVE_TYPES: ${{ matrix.archive }} From de193ed7007f23d4794f7dec1f52e3371d24249f Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Thu, 28 Jul 2022 11:00:42 +0000 Subject: [PATCH 14/75] Release workflow --- .github/workflows/release.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..17583fb --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,31 @@ +name: Release + +on: + release: + types: [published] + +jobs: + release: + name: release ${{ matrix.target }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - target: x86_64-unknown-linux-musl + archive: tar.gz + + # TODO: Enable more platforms in the future + # - target: x86_64-apple-darwin + # archive: zip + # - target: x86_64-pc-windows-gnu + # archive: zip + steps: + - uses: actions/checkout@master + - name: Compile and release + uses: rust-build/rust-build.action@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUSTTARGET: ${{ matrix.target }} + EXTRA_FILES: "README.md" + ARCHIVE_TYPES: ${{ matrix.archive }} From e8533d29c4330cfd88ab067305fc34a2bc524ea5 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Thu, 28 Jul 2022 15:25:29 +0000 Subject: [PATCH 15/75] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c7085e2..a00940b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,7 +236,7 @@ checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" [[package]] name = "drill" -version = "0.8.0" +version = "0.8.1" dependencies = [ "async-trait", "clap", diff --git a/Cargo.toml b/Cargo.toml index 4a8c390..a7a21d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drill" -version = "0.8.0" +version = "0.8.1" authors = ["Ferran Basora "] description = "Drill is a HTTP load testing application written in Rust inspired by Ansible syntax" repository = "https://github.com/fcsonline/drill" From 55e7a6278854b8c07d3de42c304ab7a19620235d Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Fri, 29 Jul 2022 06:50:21 +0000 Subject: [PATCH 16/75] Update README.md --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6018425..b1bd1c7 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,13 @@ If you want to know more about the benchmark file syntax, [read this](./SYNTAX.m ## Install -The easiest way right now is to install with [cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html): +Right now, the easiest way to get `drill` is to go to the +[latest release](https://github.com/fcsonline/drill/releases/latest) +page and download the binary file for your platform. + + +Another way to install `drill`, if you have [Rust](https://rustup.rs/) available in +your system, is with [cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html): ``` cargo install drill @@ -257,7 +263,7 @@ production environments. Full list of cli options, which is available under `drill --help` ``` -drill 0.8.0 +drill 0.8.1 HTTP load testing application written in Rust inspired by Ansible syntax USAGE: From 91b7a4255486971fea874af464f451df28b58d60 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Fri, 29 Jul 2022 07:20:03 +0000 Subject: [PATCH 17/75] Update documentation --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index b1bd1c7..50f0e00 100644 --- a/README.md +++ b/README.md @@ -296,6 +296,12 @@ OPTIONS: - Complete and improve the interpolation engine - Add writing to a file support +## Donations + +If you appreciate all the job done in this project, a small donation is always welcome: + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/fcsonline) + ## Contribute This project started as a side project to learn Rust, so I'm sure that is full From 322a332c0d2c9744977203b13fca32104a17e353 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 17 Dec 2022 22:31:35 +0000 Subject: [PATCH 18/75] Fix some clippy offenses --- src/checker.rs | 2 +- src/expandable/mod.rs | 2 +- src/reader.rs | 6 +++--- src/writer.rs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/checker.rs b/src/checker.rs index 9ee3009..66216ce 100644 --- a/src/checker.rs +++ b/src/checker.rs @@ -18,7 +18,7 @@ pub fn compare(list_reports: &[Vec], filepath: &str, threshold: &str) -> let display = path.display(); // Open the path in read-only mode, returns `io::Result` - let mut file = match File::open(&path) { + let mut file = match File::open(path) { Err(why) => panic!("couldn't open {}: {}", display, why), Ok(file) => file, }; diff --git a/src/expandable/mod.rs b/src/expandable/mod.rs index 4ce5a47..927697a 100644 --- a/src/expandable/mod.rs +++ b/src/expandable/mod.rs @@ -7,7 +7,7 @@ mod multi_request; use yaml_rust::Yaml; -pub fn pick(item: &Yaml, with_items: &Vec) -> usize { +pub fn pick(item: &Yaml, with_items: &[Yaml]) -> usize { match item["pick"].as_i64() { Some(value) => { if value.is_negative() { diff --git a/src/reader.rs b/src/reader.rs index 6e2f2d0..c568854 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -8,7 +8,7 @@ pub fn read_file(filepath: &str) -> String { let display = path.display(); // Open the path in read-only mode, returns `io::Result` - let mut file = match File::open(&path) { + let mut file = match File::open(path) { Err(why) => panic!("couldn't open {}: {}", display, why), Ok(file) => file, }; @@ -46,7 +46,7 @@ pub fn read_file_as_yml_array(filepath: &str) -> yaml_rust::yaml::Array { let path = Path::new(filepath); let display = path.display(); - let file = match File::open(&path) { + let file = match File::open(path) { Err(why) => panic!("couldn't open {}: {}", display, why), Ok(file) => file, }; @@ -72,7 +72,7 @@ pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> yaml_rust::yaml::Array let display = path.display(); // Open the path in read-only mode, returns `io::Result` - let file = match File::open(&path) { + let file = match File::open(path) { Err(why) => panic!("couldn't open {}: {}", display, why), Ok(file) => file, }; diff --git a/src/writer.rs b/src/writer.rs index d7be9c8..8f79c11 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -6,7 +6,7 @@ pub fn write_file(filepath: &str, content: String) { let path = Path::new(filepath); let display = path.display(); - let mut file = match File::create(&path) { + let mut file = match File::create(path) { Err(why) => panic!("couldn't create {}: {:?}", display, why), Ok(file) => file, }; From c6aeabf2573e5e4014bc244508551e63719786fd Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 17 Dec 2022 22:32:02 +0000 Subject: [PATCH 19/75] Update deps --- Cargo.lock | 686 +++++++++++++++++++++++++++++------------------------ 1 file changed, 377 insertions(+), 309 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a00940b..5f1d914 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,27 +10,27 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] [[package]] name = "ansi_term" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ "winapi", ] [[package]] name = "async-trait" -version = "0.1.50" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" +checksum = "677d1d8ab452a3936018a687b20e6f7cf5363d713b732b8884001317b0e48aa3" dependencies = [ "proc-macro2", "quote", @@ -56,21 +56,21 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bstr" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "lazy_static", "memchr", @@ -80,9 +80,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.0" +version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] name = "byteorder" @@ -92,15 +92,15 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.0.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" [[package]] name = "cc" -version = "1.0.68" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" +checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" [[package]] name = "cfg-if" @@ -110,9 +110,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "2.33.3" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", @@ -136,9 +136,9 @@ dependencies = [ [[package]] name = "cookie" -version = "0.16.0" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", "time", @@ -152,7 +152,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e4b6aa369f41f5faa04bb80c9b1f4216ea81646ed6124d76ba5c49a7aafd9cd" dependencies = [ "cookie", - "idna", + "idna 0.2.3", "log", "publicsuffix", "serde", @@ -163,9 +163,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -173,24 +173,24 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -198,12 +198,11 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ "cfg-if", - "lazy_static", ] [[package]] @@ -214,7 +213,7 @@ checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" dependencies = [ "bstr", "csv-core", - "itoa 0.4.7", + "itoa 0.4.8", "ryu", "serde", ] @@ -230,9 +229,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" [[package]] name = "drill" @@ -260,18 +259,18 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.28" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ "heck", "proc-macro2", @@ -279,15 +278,22 @@ dependencies = [ "syn", ] +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ - "cfg-if", "crc32fast", - "libc", "miniz_oxide", ] @@ -314,19 +320,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "futures" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" +checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" dependencies = [ "futures-channel", "futures-core", @@ -339,9 +344,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" dependencies = [ "futures-core", "futures-sink", @@ -349,15 +354,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" +checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" [[package]] name = "futures-executor" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" +checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" dependencies = [ "futures-core", "futures-task", @@ -366,18 +371,16 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" +checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" [[package]] name = "futures-macro" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121" +checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ - "autocfg", - "proc-macro-hack", "proc-macro2", "quote", "syn", @@ -385,23 +388,22 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" +checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" [[package]] name = "futures-task" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" [[package]] name = "futures-util" -version = "0.3.15" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" dependencies = [ - "autocfg", "futures-channel", "futures-core", "futures-io", @@ -411,27 +413,25 @@ dependencies = [ "memchr", "pin-project-lite", "pin-utils", - "proc-macro-hack", - "proc-macro-nested", "slab", ] [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "h2" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" dependencies = [ "bytes", "fnv", @@ -448,21 +448,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hdrhistogram" -version = "7.4.0" +version = "7.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6490be71f07a5f62b564bc58e36953f675833df11c7e4a0647bee7a07ca1ec5e" +checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" dependencies = [ "base64", "byteorder", @@ -480,9 +474,9 @@ checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -500,13 +494,13 @@ dependencies = [ [[package]] name = "http" -version = "0.2.4" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa 0.4.7", + "itoa 1.0.5", ] [[package]] @@ -522,9 +516,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" @@ -534,9 +528,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.20" +version = "0.14.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" +checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" dependencies = [ "bytes", "futures-channel", @@ -547,7 +541,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.2", + "itoa 1.0.5", "pin-project-lite", "socket2", "tokio", @@ -580,51 +574,70 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.6.2" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", - "hashbrown 0.9.1", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", ] [[package]] name = "ipconfig" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723519edce41262b05d4143ceb95050e4c614f483e78e9fd9e39a8275a84ad98" +checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" dependencies = [ "socket2", "widestring", "winapi", - "winreg 0.7.0", + "winreg", ] [[package]] name = "ipnet" -version = "2.3.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "js-sys" -version = "0.3.51" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" dependencies = [ "wasm-bindgen", ] @@ -637,21 +650,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg", "scopeguard", @@ -659,9 +672,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] @@ -683,15 +696,15 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" @@ -701,37 +714,36 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "minimal-lexical" -version = "0.1.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c64630dcdd71f1a64c435f54885086a0de5d6a12d104d69b165fb7d5286d677" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "wasi", + "windows-sys 0.42.0", ] [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", @@ -747,83 +759,85 @@ dependencies = [ [[package]] name = "nom" -version = "7.0.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ "memchr", "minimal-lexical", - "version_check", ] [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ "hermit-abi", "libc", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "openssl" -version = "0.10.35" +version = "0.10.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549430950c79ae24e6d02e0b7404534ecf311d94cc9f861e9e4020187d13d885" +checksum = "29d971fd5722fec23977260f6e81aa67d2f22cadbdc2aa049f1022d9a3be1566" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "once_cell", + "openssl-macros", "openssl-sys", ] +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "111.22.0+1.1.1q" +version = "111.24.0+1.1.1s" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f31f0d509d1c1ae9cada2f9539ff8f37933831fd5098879e482aa687d659853" +checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.66" +version = "0.9.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1996d2d305e561b70d1ee0c53f1542833f4e1ac6ce9a6708b6ff2738ca67dc82" +checksum = "5454462c0eced1e97f2ec09036abc8da362e66802f66fd20f86854d9d8cbcbc4" dependencies = [ "autocfg", "cc", @@ -845,28 +859,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -876,15 +890,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-hack" @@ -892,36 +906,28 @@ version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "e9d89e5dba24725ae5678020bf8f1357a9aa7ff10736b551adbcd3f8d17d766f" dependencies = [ "unicode-ident", ] [[package]] name = "psl-types" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8eda7c62d9ecaafdf8b62374c006de0adf61666ae96a96ba74a37134aa4e470" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "publicsuffix" -version = "2.1.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "292972edad6bbecc137ab84c5e36421a4a6c979ea31d3cc73540dd04315b33e1" +checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457" dependencies = [ - "byteorder", - "hashbrown 0.11.2", - "idna", + "idna 0.3.0", "psl-types", ] @@ -933,9 +939,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.9" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "556d0f47a940e895261e77dc200d5eadfc6ef644c179c6f5edfc105e3a2292c8" dependencies = [ "proc-macro2", ] @@ -963,27 +969,27 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.5.5" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", @@ -998,9 +1004,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "remove_dir_all" @@ -1013,9 +1019,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.11" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" +checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" dependencies = [ "base64", "bytes", @@ -1031,10 +1037,10 @@ dependencies = [ "hyper-tls", "ipnet", "js-sys", - "lazy_static", "log", "mime", "native-tls", + "once_cell", "percent-encoding", "pin-project-lite", "proc-macro-hack", @@ -1049,7 +1055,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.10.1", + "winreg", ] [[package]] @@ -1064,18 +1070,18 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi", + "windows-sys 0.36.1", ] [[package]] @@ -1086,9 +1092,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.3.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" dependencies = [ "bitflags", "core-foundation", @@ -1099,9 +1105,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.3.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", @@ -1109,18 +1115,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.138" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" +checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.138" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" +checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" dependencies = [ "proc-macro2", "quote", @@ -1129,11 +1135,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.82" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +checksum = "8778cc0b528968fe72abec38b5db5a20a70d148116cd9325d2bc5f5180ca3faf" dependencies = [ - "itoa 1.0.2", + "itoa 1.0.5", "ryu", "serde", ] @@ -1145,28 +1151,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.2", + "itoa 1.0.5", "ryu", "serde", ] [[package]] name = "slab" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", "winapi", @@ -1180,9 +1189,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.98" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "09ee3a69cd2c7e06684677e5629b3878b253af05e4714964204279c6bc02cf0b" dependencies = [ "proc-macro2", "quote", @@ -1191,13 +1200,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1214,18 +1223,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.25" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.25" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", @@ -1234,27 +1243,36 @@ dependencies = [ [[package]] name = "time" -version = "0.3.11" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" dependencies = [ - "itoa 1.0.2", - "libc", - "num_threads", + "itoa 1.0.5", + "serde", + "time-core", "time-macros", ] +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + [[package]] name = "time-macros" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", +] [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -1267,19 +1285,19 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.19.2" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" dependencies = [ + "autocfg", "bytes", "libc", "memchr", "mio", "num_cpus", - "once_cell", "pin-project-lite", "socket2", - "winapi", + "windows-sys 0.42.0", ] [[package]] @@ -1294,9 +1312,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" dependencies = [ "bytes", "futures-core", @@ -1308,35 +1326,47 @@ dependencies = [ [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.26" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" -version = "0.1.18" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] name = "trust-dns-proto" -version = "0.21.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" dependencies = [ "async-trait", "cfg-if", @@ -1345,35 +1375,35 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 0.2.3", "ipnet", "lazy_static", - "log", "rand", "smallvec", "thiserror", "tinyvec", "tokio", + "tracing", "url", ] [[package]] name = "trust-dns-resolver" -version = "0.21.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" dependencies = [ "cfg-if", "futures-util", "ipconfig", "lazy_static", - "log", "lru-cache", "parking_lot", "resolv-conf", "smallvec", "thiserror", "tokio", + "tracing", "trust-dns-proto", ] @@ -1385,43 +1415,39 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", - "idna", - "matches", + "idna 0.3.0", "percent-encoding", ] @@ -1439,9 +1465,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" @@ -1453,12 +1479,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1467,9 +1487,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1477,13 +1497,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -1492,9 +1512,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.24" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" +checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ "cfg-if", "js-sys", @@ -1504,9 +1524,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1514,9 +1534,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", @@ -1527,15 +1547,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" [[package]] name = "web-sys" -version = "0.3.51" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" dependencies = [ "js-sys", "wasm-bindgen", @@ -1575,37 +1595,88 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", ] +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.0", + "windows_i686_gnu 0.42.0", + "windows_i686_msvc 0.42.0", + "windows_x86_64_gnu 0.42.0", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + [[package]] name = "windows_aarch64_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + [[package]] name = "windows_i686_gnu" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + [[package]] name = "windows_i686_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + [[package]] name = "windows_x86_64_msvc" version = "0.36.1" @@ -1613,13 +1684,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] -name = "winreg" -version = "0.7.0" +name = "windows_x86_64_msvc" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" -dependencies = [ - "winapi", -] +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" [[package]] name = "winreg" From 672f206f762865a1811a3c838d82ac31a2baa563 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 22:14:23 +0000 Subject: [PATCH 20/75] Bump qs from 6.5.1 to 6.11.0 in /example/server Bumps [qs](https://github.com/ljharb/qs) from 6.5.1 to 6.11.0. - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.1...v6.11.0) --- updated-dependencies: - dependency-name: qs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- example/server/package-lock.json | 434 ++++++++++++++++++++----------- 1 file changed, 277 insertions(+), 157 deletions(-) diff --git a/example/server/package-lock.json b/example/server/package-lock.json index 77cb44a..2ff8034 100644 --- a/example/server/package-lock.json +++ b/example/server/package-lock.json @@ -5,50 +5,71 @@ "requires": true, "dependencies": { "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.16", - "negotiator": "0.6.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } } }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { "version": "0.3.1", @@ -88,65 +109,83 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.4", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.1", - "encodeurl": "~1.0.1", + "depd": "2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.0", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.2", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "~1.3.1", - "type-is": "~1.6.15", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } } }, "express-session": { @@ -166,98 +205,132 @@ } }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" } } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.52.0" } }, "ms": { @@ -266,14 +339,19 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -291,21 +369,24 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" } }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } }, "random-bytes": { "version": "1.0.0", @@ -313,74 +394,113 @@ "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.1", - "destroy": "~1.0.4", - "encodeurl": "~1.0.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.3.1" + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } } }, "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.1" + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } } }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "uid-safe": { @@ -394,7 +514,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "utils-merge": { "version": "1.0.1", @@ -404,7 +524,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" } } } From 1b5fc378857034aaf1f384feb3d09d1ea59067c4 Mon Sep 17 00:00:00 2001 From: Kian-Meng Ang Date: Wed, 21 Dec 2022 11:39:42 +0800 Subject: [PATCH 21/75] Fix typos Found via `typos --format brief` --- SYNTAX.md | 2 +- example/server/server.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SYNTAX.md b/SYNTAX.md index bb48617..a375a67 100644 --- a/SYNTAX.md +++ b/SYNTAX.md @@ -64,7 +64,7 @@ Second, it can be a hash with the following properties: [Ansible](https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html#special-tags-always-and-never)-like tags. -If you assing list of tags, e.g `[tag1, tag2]`, this item will be executed if `tag1` **OR** `tag2` is passed. +If you assign list of tags, e.g `[tag1, tag2]`, this item will be executed if `tag1` **OR** `tag2` is passed. Special tags: `always` and `never`. diff --git a/example/server/server.js b/example/server/server.js index e58c5d3..a1be21e 100644 --- a/example/server/server.js +++ b/example/server/server.js @@ -50,7 +50,7 @@ const randomFailedHandler = function(req, res) { } }; -const transactionsHander = function(req, res) { +const transactionsHandler = function(req, res) { const body = req.body if (body.a + body.b === '123') { @@ -72,7 +72,7 @@ app.get('/api/users/at/:floor/:room', logger_handler('R')); app.get('/api/account', logger_handler('A')); app.post('/api/users', randomFailedHandler); -app.post('/api/transactions', transactionsHander); +app.post('/api/transactions', transactionsHandler); // Sessions test plan app.get('/login', function(req, res){ From d26fe2abb6ce89f880baa75653e9aabd13d15aea Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Wed, 21 Dec 2022 14:15:27 +0100 Subject: [PATCH 22/75] Solve clipply offenses --- src/actions/delay.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/delay.rs b/src/actions/delay.rs index f39b8e4..0be6580 100644 --- a/src/actions/delay.rs +++ b/src/actions/delay.rs @@ -36,7 +36,7 @@ impl Delay { #[async_trait] impl Runnable for Delay { async fn execute(&self, _context: &mut Context, _reports: &mut Reports, _pool: &Pool, config: &Config) { - sleep(Duration::from_secs(self.seconds as u64)).await; + sleep(Duration::from_secs(self.seconds)).await; if !config.quiet { println!("{:width$} {}{}", self.name.green(), self.seconds.to_string().cyan().bold(), "s".magenta(), width = 25); From f1443f176fb1c7ca306076474da9039033955d2f Mon Sep 17 00:00:00 2001 From: kyle merfeld Date: Sat, 17 Dec 2022 02:25:10 +0000 Subject: [PATCH 23/75] allow interpolator to read arrays/nested --- src/benchmark.rs | 4 +-- src/interpolator.rs | 60 +++++++++++++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/benchmark.rs b/src/benchmark.rs index f77e990..bdc88b7 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -4,7 +4,7 @@ use std::time::{Duration, Instant}; use futures::stream::{self, StreamExt}; -use serde_json::{json, Value}; +use serde_json::{json, Map, Value}; use tokio::{runtime, time::sleep}; use crate::actions::{Report, Runnable}; @@ -18,7 +18,7 @@ use reqwest::Client; use colored::*; pub type Benchmark = Vec>; -pub type Context = HashMap; +pub type Context = Map; pub type Reports = Vec; pub type PoolStore = HashMap; pub type Pool = Arc>; diff --git a/src/interpolator.rs b/src/interpolator.rs index 4295415..68139cd 100644 --- a/src/interpolator.rs +++ b/src/interpolator.rs @@ -1,6 +1,7 @@ use colored::*; use lazy_static::lazy_static; use regex::{Captures, Regex}; +use serde_json::json; use crate::benchmark::Context; @@ -9,7 +10,7 @@ static INTERPOLATION_SUFFIX: &str = "}}"; lazy_static! { pub static ref INTERPOLATION_REGEX: Regex = { - let regexp = format!("{}{}{}", regex::escape(INTERPOLATION_PREFIX), r" *([a-zA-Z\-\._]+[a-zA-Z\-\._0-9]*) *", regex::escape(INTERPOLATION_SUFFIX)); + let regexp = format!("{}{}{}", regex::escape(INTERPOLATION_PREFIX), r" *([a-zA-Z\-\._\[]+[a-zA-Z\-\._0-9\]]*) *", regex::escape(INTERPOLATION_SUFFIX)); Regex::new(regexp.as_str()).unwrap() }; @@ -31,7 +32,7 @@ impl<'a> Interpolator<'a> { .replace_all(url, |caps: &Captures| { let capture = &caps[1]; - if let Some(item) = self.resolve_context_interpolation(capture.split('.').collect()) { + if let Some(item) = self.resolve_context_interpolation(capture) { return item; } @@ -57,22 +58,22 @@ impl<'a> Interpolator<'a> { } } - fn resolve_context_interpolation(&self, cap_path: Vec<&str>) -> Option { - let (cap_root, cap_tail) = cap_path.split_at(1); - - cap_tail - .iter() - .fold(self.context.get(cap_root[0]), |json, k| match json { - Some(json) => json.get(k), - _ => None, - }) - .map(|value| { - if value.is_string() { - String::from(value.as_str().unwrap()) - } else { - value.to_string() - } - }) + fn resolve_context_interpolation(&self, value: &str) -> Option { + //convert "." and "[" to "/" and "]" to "" to look like a json pointer + let val: String = format!("/{}", value.replace(".", "/").replace("[", "/").replace("]", "")); + + //force the context into a Value, and acess by pointer + if let Some(item) = json!(self.context).pointer(&val).to_owned() { + return Some(match item.to_owned() { + serde_json::Value::Null => "".to_owned(), + serde_json::Value::Bool(v) => v.to_string(), + serde_json::Value::Number(v) => v.to_string(), + serde_json::Value::String(v) => v, + serde_json::Value::Array(v) => serde_json::to_string(&v).unwrap(), + serde_json::Value::Object(v) => serde_json::to_string(&v).unwrap(), + }); + } + None } } @@ -95,6 +96,29 @@ mod tests { assert_eq!(interpolated, "http://example.com/users/12/view/12/chunked"); } + #[test] + fn interpolates_variables_nested() { + let mut context: Context = Context::new(); + + context.insert(String::from("Null"), serde_json::Value::Null); + context.insert(String::from("Bool"), json!(true)); + context.insert(String::from("Number"), json!(12)); + context.insert(String::from("String"), json!("string")); + context.insert(String::from("Array"), json!(["a", "b", "c"])); + context.insert(String::from("Object"), json!({"this": "that"})); + context.insert(String::from("Nested"), json!({"this": {"that": {"those": [{"wow": 1}, {"so": 2}, {"deee": {"eeee": "eeep"}}]}}})); + + let interpolator = Interpolator::new(&context); + + assert_eq!(interpolator.resolve("{{ Null }}", true), "".to_string()); + assert_eq!(interpolator.resolve("{{ Bool }}", true), "true".to_string()); + assert_eq!(interpolator.resolve("{{ Number }}", true), "12".to_string()); + assert_eq!(interpolator.resolve("{{ String }}", true), "string".to_string()); + assert_eq!(interpolator.resolve("{{ Array }}", true), "[\"a\",\"b\",\"c\"]".to_string()); + assert_eq!(interpolator.resolve("{{ Object }}", true), "{\"this\":\"that\"}".to_string()); + assert_eq!(interpolator.resolve("{{ Nested.this.that.those[2].deee.eeee }}", true), "eeep".to_string()); + } + #[test] #[should_panic] fn interpolates_missing_variable() { From a00b30c6d85bfe0be83d21ca6bab9afc1894c68a Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Wed, 21 Dec 2022 18:04:01 +0000 Subject: [PATCH 24/75] Fix some interpolator cases Added some extra code to cover more cases in the new interpolator mechanism. Also, fixing some clippy offenses too. --- example/benchmark.yml | 10 ++++++++++ src/interpolator.rs | 10 ++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/example/benchmark.yml b/example/benchmark.yml index 8fb9811..ff8f661 100644 --- a/example/benchmark.yml +++ b/example/benchmark.yml @@ -141,3 +141,13 @@ plan: - 75 shuffle: true pick: 1 + + - name: Complex access + request: + url: /api/users.json + assign: complex + + - name: Assert request response code + assert: + key: complex.body[1].phones[1] + value: '+44 2345678' diff --git a/src/interpolator.rs b/src/interpolator.rs index 68139cd..09cf236 100644 --- a/src/interpolator.rs +++ b/src/interpolator.rs @@ -10,7 +10,7 @@ static INTERPOLATION_SUFFIX: &str = "}}"; lazy_static! { pub static ref INTERPOLATION_REGEX: Regex = { - let regexp = format!("{}{}{}", regex::escape(INTERPOLATION_PREFIX), r" *([a-zA-Z\-\._\[]+[a-zA-Z\-\._0-9\]]*) *", regex::escape(INTERPOLATION_SUFFIX)); + let regexp = format!("{}{}{}", regex::escape(INTERPOLATION_PREFIX), r" *([a-zA-Z]+[a-zA-Z\-\._0-9\[\]]*) *", regex::escape(INTERPOLATION_SUFFIX)); Regex::new(regexp.as_str()).unwrap() }; @@ -59,10 +59,10 @@ impl<'a> Interpolator<'a> { } fn resolve_context_interpolation(&self, value: &str) -> Option { - //convert "." and "[" to "/" and "]" to "" to look like a json pointer - let val: String = format!("/{}", value.replace(".", "/").replace("[", "/").replace("]", "")); + // convert "." and "[" to "/" and "]" to "" to look like a json pointer + let val: String = format!("/{}", value.replace(['.', '['], "/").replace(']', "")); - //force the context into a Value, and acess by pointer + // force the context into a Value, and acess by pointer if let Some(item) = json!(self.context).pointer(&val).to_owned() { return Some(match item.to_owned() { serde_json::Value::Null => "".to_owned(), @@ -107,6 +107,7 @@ mod tests { context.insert(String::from("Array"), json!(["a", "b", "c"])); context.insert(String::from("Object"), json!({"this": "that"})); context.insert(String::from("Nested"), json!({"this": {"that": {"those": [{"wow": 1}, {"so": 2}, {"deee": {"eeee": "eeep"}}]}}})); + context.insert(String::from("ArrayNested"), json!([{"a": [{}, {"aa": 2, "aaa": [{"aaaa": 123 }]}]}])); let interpolator = Interpolator::new(&context); @@ -117,6 +118,7 @@ mod tests { assert_eq!(interpolator.resolve("{{ Array }}", true), "[\"a\",\"b\",\"c\"]".to_string()); assert_eq!(interpolator.resolve("{{ Object }}", true), "{\"this\":\"that\"}".to_string()); assert_eq!(interpolator.resolve("{{ Nested.this.that.those[2].deee.eeee }}", true), "eeep".to_string()); + assert_eq!(interpolator.resolve("{{ ArrayNested[0].a[1].aaa[0].aaaa }}", true), "123".to_string()); } #[test] From f7627bfd005a599638fe6c77963df2c45c00b5dc Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Wed, 21 Dec 2022 18:57:14 +0000 Subject: [PATCH 25/75] Fix some extra clippy offenses --- src/expandable/include.rs | 2 +- src/expandable/multi_csv_request.rs | 6 +++--- src/expandable/multi_file_request.rs | 6 +++--- src/expandable/multi_iter_request.rs | 2 +- src/expandable/multi_request.rs | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/expandable/include.rs b/src/expandable/include.rs index 2579b49..78fbee1 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -80,7 +80,7 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark, &Tags::new(None, None)); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 2); } diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index e5a24fd..cb1f8db 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -62,7 +62,7 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 2); } @@ -75,7 +75,7 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 2); } @@ -88,7 +88,7 @@ mod tests { expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 1); } diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 3e2d4d2..08ce26b 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -56,7 +56,7 @@ mod test { expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 3); } @@ -69,7 +69,7 @@ mod test { expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 2); } @@ -82,7 +82,7 @@ mod test { expand("example/benchmark.yml", doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 1); } } diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index 2a9cefc..4e2f345 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -76,7 +76,7 @@ mod tests { expand(doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 10); } diff --git a/src/expandable/multi_request.rs b/src/expandable/multi_request.rs index c827068..ddf413b 100644 --- a/src/expandable/multi_request.rs +++ b/src/expandable/multi_request.rs @@ -50,7 +50,7 @@ mod tests { expand(doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 3); } @@ -63,7 +63,7 @@ mod tests { expand(doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 2); } @@ -76,7 +76,7 @@ mod tests { expand(doc, &mut benchmark); - assert_eq!(is_that_you(doc), true); + assert!(is_that_you(doc)); assert_eq!(benchmark.len(), 1); } From 528720c9ff5dfc8387a0b68d301bf17b40e2b9d4 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Wed, 1 Feb 2023 22:12:07 +0000 Subject: [PATCH 26/75] Fix tags for included files It seems that items that were included with the `include` directive and contains tags, they are ignored. Trying to fix this. Issue: https://github.com/fcsonline/drill/issues/164 --- example/subtags.yml | 9 +++++++++ example/tags.yml | 14 ++++++++++++++ src/expandable/include.rs | 8 ++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 example/subtags.yml create mode 100644 example/tags.yml diff --git a/example/subtags.yml b/example/subtags.yml new file mode 100644 index 0000000..64685aa --- /dev/null +++ b/example/subtags.yml @@ -0,0 +1,9 @@ +# Example of a included file + +--- +- name: Fetch comments + request: + url: /api/comments.json + tags: + - tag_user + diff --git a/example/tags.yml b/example/tags.yml new file mode 100644 index 0000000..ca5b714 --- /dev/null +++ b/example/tags.yml @@ -0,0 +1,14 @@ +--- +base: 'http://localhost:9000' +iterations: 1 +concurrency: 1 + +plan: + - name: Include comments + include: subtags.yml + + - name: Tagged user request + request: + url: /api/users/70 + tags: + - tag_user diff --git a/src/expandable/include.rs b/src/expandable/include.rs index 78fbee1..e288283 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -32,6 +32,12 @@ pub fn expand_from_filepath(parent_path: &str, benchmark: &mut Benchmark, access let items = reader::read_yaml_doc_accessor(&docs[0], accessor); for item in items { + if include::is_that_you(item) { + include::expand(parent_path, item, benchmark, tags); + + continue; + } + if tags.should_skip_item(item) { continue; } @@ -44,8 +50,6 @@ pub fn expand_from_filepath(parent_path: &str, benchmark: &mut Benchmark, access multi_csv_request::expand(parent_path, item, benchmark); } else if multi_file_request::is_that_you(item) { multi_file_request::expand(parent_path, item, benchmark); - } else if include::is_that_you(item) { - include::expand(parent_path, item, benchmark, tags); } else if actions::Delay::is_that_you(item) { benchmark.push(Box::new(actions::Delay::new(item, None))); } else if actions::Exec::is_that_you(item) { From 9728ea3765ed95158ce82047aa89ab0599173519 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 6 Feb 2023 16:47:07 +0000 Subject: [PATCH 27/75] Autofix clippy --- src/actions/request.rs | 8 ++++---- src/config.rs | 6 +++--- src/main.rs | 4 ++-- src/reader.rs | 6 +++--- src/tags.rs | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/actions/request.rs b/src/actions/request.rs index 108f19b..e81f427 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -122,7 +122,7 @@ impl Request { match context.get("base") { Some(value) => { if let Some(vs) = value.as_str() { - format!("{}{}", vs, interpolated_url) + format!("{vs}{interpolated_url}") } else { panic!("{} Wrong type 'base' variable!", "WARNING!".yellow().bold()); } @@ -173,7 +173,7 @@ impl Request { if let Some(cookies) = context.get("cookies") { let cookies: Map = serde_json::from_value(cookies.clone()).unwrap(); - let cookie = cookies.iter().map(|(key, value)| format!("{}={}", key, value)).collect::>().join(";"); + let cookie = cookies.iter().map(|(key, value)| format!("{key}={value}")).collect::>().join(";"); headers.insert(header::COOKIE, HeaderValue::from_str(&cookie).unwrap()); } @@ -334,7 +334,7 @@ fn log_request(request: &reqwest::Request) { write!(message, " {} {},", "URL:".bold(), request.url()).unwrap(); write!(message, " {} {},", "METHOD:".bold(), request.method()).unwrap(); write!(message, " {} {:?}", "HEADERS:".bold(), request.headers()).unwrap(); - println!("{}", message); + println!("{message}"); } fn log_message_response(response: &Option, duration_ms: f64) -> String { @@ -359,5 +359,5 @@ fn log_response(log_message_response: String, body: &Option) { if let Some(body) = body.as_ref() { write!(message, " {} {:?}", "BODY:".bold(), body).unwrap() } - println!("{}", message); + println!("{message}"); } diff --git a/src/config.rs b/src/config.rs index edfd2f2..baebd61 100644 --- a/src/config.rs +++ b/src/config.rs @@ -65,7 +65,7 @@ fn read_str_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp } None => { if config_doc[name].as_str().is_some() { - println!("Invalid {} value!", name); + println!("Invalid {name} value!"); } default.to_owned() @@ -85,7 +85,7 @@ fn read_i64_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp match value { Some(value) => { if value < 0 { - println!("Invalid negative {} value!", name); + println!("Invalid negative {name} value!"); default } else { @@ -94,7 +94,7 @@ fn read_i64_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp } None => { if config_doc[name].as_str().is_some() { - println!("Invalid {} value!", name); + println!("Invalid {name} value!"); } default diff --git a/src/main.rs b/src/main.rs index b43101d..a02f88b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -168,11 +168,11 @@ fn show_stats(list_reports: &[Vec], stats_option: bool, nanosec: bool, d let requests_per_second = global_stats.total_requests as f64 / duration; println!(); - println!("{:width2$} {} {}", "Time taken for tests".yellow(), format!("{:.1}", duration).purple(), "seconds".purple(), width2 = 25); + println!("{:width2$} {} {}", "Time taken for tests".yellow(), format!("{duration:.1}").purple(), "seconds".purple(), width2 = 25); println!("{:width2$} {}", "Total requests".yellow(), global_stats.total_requests.to_string().purple(), width2 = 25); println!("{:width2$} {}", "Successful requests".yellow(), global_stats.successful_requests.to_string().purple(), width2 = 25); println!("{:width2$} {}", "Failed requests".yellow(), global_stats.failed_requests.to_string().purple(), width2 = 25); - println!("{:width2$} {} {}", "Requests per second".yellow(), format!("{:.2}", requests_per_second).purple(), "[#/sec]".purple(), width2 = 25); + println!("{:width2$} {} {}", "Requests per second".yellow(), format!("{requests_per_second:.2}").purple(), "[#/sec]".purple(), width2 = 25); println!("{:width2$} {}", "Median time per request".yellow(), format_time(global_stats.median_duration(), nanosec).purple(), width2 = 25); println!("{:width2$} {}", "Average time per request".yellow(), format_time(global_stats.mean_duration(), nanosec).purple(), width2 = 25); println!("{:width2$} {}", "Sample standard deviation".yellow(), format_time(global_stats.stdev_duration(), nanosec).purple(), width2 = 25); diff --git a/src/reader.rs b/src/reader.rs index c568854..38d335e 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -32,7 +32,7 @@ pub fn read_yaml_doc_accessor<'a>(doc: &'a yaml_rust::Yaml, accessor: Option<&st match doc[accessor_id].as_vec() { Some(items) => items, None => { - println!("Node missing on config: {}", accessor_id); + println!("Node missing on config: {accessor_id}"); println!("Exiting."); std::process::exit(1) } @@ -58,7 +58,7 @@ pub fn read_file_as_yml_array(filepath: &str) -> yaml_rust::yaml::Array { Ok(text) => { items.push(yaml_rust::Yaml::String(text)); } - Err(e) => println!("error parsing line: {:?}", e), + Err(e) => println!("error parsing line: {e:?}"), } } @@ -100,7 +100,7 @@ pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> yaml_rust::yaml::Array items.push(yaml_rust::Yaml::Hash(linked_hash_map)); } - Err(e) => println!("error parsing header: {:?}", e), + Err(e) => println!("error parsing header: {e:?}"), } } diff --git a/src/tags.rs b/src/tags.rs index 22825a1..5f6028e 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -84,7 +84,7 @@ pub fn list_benchmark_file_tasks(benchmark_file: &str, tags: &Tags) { let mut out_str = String::new(); let mut emitter = YamlEmitter::new(&mut out_str); emitter.dump(item).unwrap(); - println!("{}", out_str); + println!("{out_str}"); } } From 30f95d9a9ee79a85aa57f8894d149317362f4b3d Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 6 Feb 2023 16:52:54 +0000 Subject: [PATCH 28/75] Fix tarpaulin --- .github/workflows/general.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index bfb681f..4eb9f97 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -64,6 +64,7 @@ jobs: override: true - name: Run cargo-tarpaulin - uses: actions-rs/tarpaulin@v0.1 + uses: actions-rs/tarpaulin@v0.1.3 with: + version: '0.15.0' args: '--ignore-tests' From 8ef2e256d4a7645c97bb395d6630118ab64e6d94 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Tue, 7 Feb 2023 18:16:32 +0000 Subject: [PATCH 29/75] Bump version 0.8.2 --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5f1d914..3c8a860 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -235,7 +235,7 @@ checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" [[package]] name = "drill" -version = "0.8.1" +version = "0.8.2" dependencies = [ "async-trait", "clap", diff --git a/Cargo.toml b/Cargo.toml index a7a21d8..5d42031 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drill" -version = "0.8.1" +version = "0.8.2" authors = ["Ferran Basora "] description = "Drill is a HTTP load testing application written in Rust inspired by Ansible syntax" repository = "https://github.com/fcsonline/drill" diff --git a/README.md b/README.md index 50f0e00..3b7a0ba 100644 --- a/README.md +++ b/README.md @@ -263,7 +263,7 @@ production environments. Full list of cli options, which is available under `drill --help` ``` -drill 0.8.1 +drill 0.8.2 HTTP load testing application written in Rust inspired by Ansible syntax USAGE: From e7b2cb3e7a38030a203ed333f10615a0af8651d8 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 15 Apr 2023 10:04:30 +0200 Subject: [PATCH 30/75] Fix release process --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 17583fb..232bc0a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@master - name: Compile and release - uses: rust-build/rust-build.action@latest + uses: rust-build/rust-build.action@v1.4.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} RUSTTARGET: ${{ matrix.target }} From f56d89a25fc5838da57727a75ec3340758c30318 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 15 Apr 2023 10:06:52 +0200 Subject: [PATCH 31/75] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3c8a860..9c685e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -235,7 +235,7 @@ checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" [[package]] name = "drill" -version = "0.8.2" +version = "0.8.3" dependencies = [ "async-trait", "clap", diff --git a/Cargo.toml b/Cargo.toml index 5d42031..7263a5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drill" -version = "0.8.2" +version = "0.8.3" authors = ["Ferran Basora "] description = "Drill is a HTTP load testing application written in Rust inspired by Ansible syntax" repository = "https://github.com/fcsonline/drill" diff --git a/README.md b/README.md index 3b7a0ba..a5542d2 100644 --- a/README.md +++ b/README.md @@ -263,7 +263,7 @@ production environments. Full list of cli options, which is available under `drill --help` ``` -drill 0.8.2 +drill 0.8.3 HTTP load testing application written in Rust inspired by Ansible syntax USAGE: From e15e6a0a33badba42dea114b381136d9f43ca11b Mon Sep 17 00:00:00 2001 From: Pieter E Smit Date: Sun, 16 Apr 2023 23:10:56 +1200 Subject: [PATCH 32/75] add example/server/docker-compose.yml --- .gitignore | 3 +++ example/server/Dockerfile-example-server | 6 ++++++ example/server/docker-compose.yml | 14 ++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 example/server/Dockerfile-example-server create mode 100644 example/server/docker-compose.yml diff --git a/.gitignore b/.gitignore index 8b00285..defe2ea 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ # Example server example/server/node_modules + +# Editor temp files +.vscode diff --git a/example/server/Dockerfile-example-server b/example/server/Dockerfile-example-server new file mode 100644 index 0000000..bfeefe6 --- /dev/null +++ b/example/server/Dockerfile-example-server @@ -0,0 +1,6 @@ +FROM node +WORKDIR /app +COPY package.json ./ +RUN npm install +COPY . . +CMD node server.js diff --git a/example/server/docker-compose.yml b/example/server/docker-compose.yml new file mode 100644 index 0000000..b0a6041 --- /dev/null +++ b/example/server/docker-compose.yml @@ -0,0 +1,14 @@ +version: "3.9" +services: + drill-server: + ports: + - "9000:9000" + image: drill-example-server:latest + build: + context: ./ + dockerfile: Dockerfile-example-server + #args: + # buildno: 1 + environment: + OUTPUT: 0 + DELAY_MS: 100 From 9636e9c5b4c1701506497d0b39924324ffb7880b Mon Sep 17 00:00:00 2001 From: hypr2771 Date: Thu, 27 Apr 2023 23:11:19 +0200 Subject: [PATCH 33/75] fix: Remove unnecessary `into_iter()` after a `split()` --- src/tags.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tags.rs b/src/tags.rs index 5f6028e..7fa269e 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -11,8 +11,8 @@ pub struct Tags<'a> { impl<'a> Tags<'a> { pub fn new(tags_option: Option<&'a str>, skip_tags_option: Option<&'a str>) -> Self { - let tags: Option> = tags_option.map(|m| m.split(',').into_iter().map(|s| s.trim()).collect()); - let skip_tags: Option> = skip_tags_option.map(|m| m.split(',').into_iter().map(|s| s.trim()).collect()); + let tags: Option> = tags_option.map(|m| m.split(',').map(|s| s.trim()).collect()); + let skip_tags: Option> = skip_tags_option.map(|m| m.split(',').map(|s| s.trim()).collect()); if let (Some(t), Some(s)) = (&tags, &skip_tags) { if !t.is_disjoint(s) { From 1ff56ea6232f6ad920f4b5e8cd06d7a0e399304a Mon Sep 17 00:00:00 2001 From: hypr2771 Date: Wed, 26 Apr 2023 00:51:54 +0200 Subject: [PATCH 34/75] fix: Allow `$` prefixed key during interpollation --- src/interpolator.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/interpolator.rs b/src/interpolator.rs index 09cf236..f9f6ddd 100644 --- a/src/interpolator.rs +++ b/src/interpolator.rs @@ -10,7 +10,7 @@ static INTERPOLATION_SUFFIX: &str = "}}"; lazy_static! { pub static ref INTERPOLATION_REGEX: Regex = { - let regexp = format!("{}{}{}", regex::escape(INTERPOLATION_PREFIX), r" *([a-zA-Z]+[a-zA-Z\-\._0-9\[\]]*) *", regex::escape(INTERPOLATION_SUFFIX)); + let regexp = format!("{}{}{}", regex::escape(INTERPOLATION_PREFIX), r" *([a-zA-Z]+[a-zA-Z\-\._\$0-9\[\]]*) *", regex::escape(INTERPOLATION_SUFFIX)); Regex::new(regexp.as_str()).unwrap() }; @@ -107,7 +107,7 @@ mod tests { context.insert(String::from("Array"), json!(["a", "b", "c"])); context.insert(String::from("Object"), json!({"this": "that"})); context.insert(String::from("Nested"), json!({"this": {"that": {"those": [{"wow": 1}, {"so": 2}, {"deee": {"eeee": "eeep"}}]}}})); - context.insert(String::from("ArrayNested"), json!([{"a": [{}, {"aa": 2, "aaa": [{"aaaa": 123 }]}]}])); + context.insert(String::from("ArrayNested"), json!([{"a": [{}, {"aa": 2, "aaa": [{"aaaa": 123, "$aaaa": "$123"}]}]}])); let interpolator = Interpolator::new(&context); @@ -119,6 +119,7 @@ mod tests { assert_eq!(interpolator.resolve("{{ Object }}", true), "{\"this\":\"that\"}".to_string()); assert_eq!(interpolator.resolve("{{ Nested.this.that.those[2].deee.eeee }}", true), "eeep".to_string()); assert_eq!(interpolator.resolve("{{ ArrayNested[0].a[1].aaa[0].aaaa }}", true), "123".to_string()); + assert_eq!(interpolator.resolve("{{ ArrayNested[0].a[1].aaa[0].$aaaa }}", true), "$123".to_string()); } #[test] From dfd5548c8d4269d5fa8b73e81d616572e9a9d445 Mon Sep 17 00:00:00 2001 From: Renee Gyllensvaan Date: Tue, 9 May 2023 15:39:00 +0000 Subject: [PATCH 35/75] Don't overwrite old cookies on Set-Cookie When handling Set-Cookie headers, each request would previously replace the entire `context->"cookie"` object. This would cause consecutive responses with Set-Cookie headers to overwrite all existing cookies in the context. --- src/actions/request.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/actions/request.rs b/src/actions/request.rs index e81f427..b7bb270 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -284,14 +284,9 @@ impl Runnable for Request { status, }); - if response.cookies().count() > 0 { - let mut cookies = Map::new(); - - for cookie in response.cookies() { - cookies.insert(cookie.name().to_string(), json!(cookie.value().to_string())); - } - - context.insert("cookies".to_string(), json!(cookies)); + for cookie in response.cookies() { + let cookies = context.entry("cookies").or_insert_with(|| json!({})).as_object_mut().unwrap(); + cookies.insert(cookie.name().to_string(), json!(cookie.value().to_string())); } let data = if let Some(ref key) = self.assign { From 753e9a6a78f798d68c8a9346c5f1e3813afaa159 Mon Sep 17 00:00:00 2001 From: Daniel Haarhoff Date: Mon, 6 Mar 2023 08:12:17 +0000 Subject: [PATCH 36/75] Write failing test for pick on with_items_range --- src/expandable/multi_iter_request.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index 4e2f345..46d8de5 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -80,6 +80,20 @@ mod tests { assert_eq!(benchmark.len(), 10); } + #[test] + #[should_panic] + fn expand_multi_range_should_limit_requests_using_the_pick_option() { + let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 3\nwith_items_range:\n start: 2\n step: 2\n stop: 20"; + let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let doc = &docs[0]; + let mut benchmark: Benchmark = Benchmark::new(); + + expand(doc, &mut benchmark); + + assert!(is_that_you(doc)); + assert_eq!(benchmark.len(), 3); + } + #[test] #[should_panic] fn invalid_expand() { From 4dd9fd5398fdd1177f44340ded7a416e02fdc980 Mon Sep 17 00:00:00 2001 From: Daniel Haarhoff Date: Mon, 6 Mar 2023 08:24:56 +0000 Subject: [PATCH 37/75] with_items_range respects pick --- src/expandable/multi_iter_request.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index 46d8de5..8d3a565 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -1,3 +1,5 @@ +use std::convert::TryInto; + use rand::seq::SliceRandom; use rand::thread_rng; use yaml_rust::Yaml; @@ -54,6 +56,10 @@ pub fn expand(item: &Yaml, benchmark: &mut Benchmark) { } } + if let Some(pick) = item["pick"].as_i64() { + with_items.truncate(pick.try_into().expect("pick can't be larger than size of range")) + } + for (index, value) in with_items.iter().enumerate() { let index = index as u32; @@ -81,7 +87,6 @@ mod tests { } #[test] - #[should_panic] fn expand_multi_range_should_limit_requests_using_the_pick_option() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 3\nwith_items_range:\n start: 2\n step: 2\n stop: 20"; let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); From da4bd88ce194aeac66cef7788e0bedf34e9c16e9 Mon Sep 17 00:00:00 2001 From: Daniel Haarhoff Date: Tue, 21 Mar 2023 08:55:22 +0000 Subject: [PATCH 38/75] Extend documentation to better explain usage of with_items_range, shuffle, pick --- README.md | 9 +++++++++ SYNTAX.md | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a5542d2..1b5b2f2 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,15 @@ plan: - 75 shuffle: true pick: 1 + + - name: Three requests with random items from a range + request: + url: /api/users/{{ item }} + with_items_range: + start: 1 + stop: 1000 + shuffle: true + pick: 3 ``` As you can see, you can play with interpolations in different ways. This diff --git a/SYNTAX.md b/SYNTAX.md index a375a67..353d645 100644 --- a/SYNTAX.md +++ b/SYNTAX.md @@ -46,8 +46,10 @@ All those three items can be combined with `name` property to be show in logs. - `method`: HTTP method in the requests. Valid methods are GET, POST, PUT, PATCH, HEAD or DELETE. (default: GET) - `body`: Request body for methods like POST, PUT or PATCH. - `with_items`: List of items to be interpolated in the given request url. -- `with_items_range`: Generates items from an iterator from start, step, stop. +- `with_items_range`: Generates items from an iterator from start, step (optional, default: 1), stop. - `with_items_from_csv`: Read the given CSV values and go through all of them as items. +- `shuffle`: Shuffle given items randomly (default: false). +- `pick`: Number of items to pick and perform requests with. - `assign`: Save the response in the context to be interpolated later. - `tags`: List of tags for that item. From 7f26be2e670d8368e4721ac5ea22be459d487c97 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 09:35:33 +0100 Subject: [PATCH 39/75] Update rust syntax --- src/benchmark.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/benchmark.rs b/src/benchmark.rs index bdc88b7..b1005cf 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -17,7 +17,7 @@ use reqwest::Client; use colored::*; -pub type Benchmark = Vec>; +pub type Benchmark = Vec>; pub type Context = Map; pub type Reports = Vec; pub type PoolStore = HashMap; From 4a2a28c1f68382c5c916d5a16faf6fa40038bfaa Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 09:37:20 +0100 Subject: [PATCH 40/75] Update dependencies --- Cargo.lock | 1457 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 975 insertions(+), 482 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c685e5..53eab8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,18 +1,18 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -28,9 +28,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.60" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d1d8ab452a3936018a687b20e6f7cf5363d713b732b8884001317b0e48aa3" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -43,22 +43,22 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" @@ -67,46 +67,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bstr" -version = "0.2.17" +name = "bitflags" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata", - "serde", -] +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.3.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.0.78" +version = "1.2.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" +dependencies = [ + "find-msvc-tools", + "shlex", +] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "clap" @@ -116,7 +114,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim", "textwrap", "unicode-width", @@ -125,20 +123,19 @@ dependencies = [ [[package]] name = "colored" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ - "atty", "lazy_static", - "winapi", + "windows-sys 0.59.0", ] [[package]] name = "cookie" -version = "0.16.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" dependencies = [ "percent-encoding", "time", @@ -147,15 +144,16 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.16.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4b6aa369f41f5faa04bb80c9b1f4216ea81646ed6124d76ba5c49a7aafd9cd" +checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6" dependencies = [ "cookie", - "idna 0.2.3", + "idna 0.3.0", "log", "publicsuffix", "serde", + "serde_derive", "serde_json", "time", "url", @@ -163,9 +161,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -173,65 +171,80 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "csv" -version = "1.1.6" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ - "bstr", "csv-core", - "itoa 0.4.8", + "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "deranged" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "drill" @@ -259,18 +272,18 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ "heck", "proc-macro2", @@ -279,19 +292,38 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "1.8.0" +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "instant", + "libc", + "windows-sys 0.61.2", ] +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" + [[package]] name = "flate2" -version = "1.0.25" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -320,18 +352,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -344,9 +376,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -354,15 +386,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -371,15 +403,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -388,21 +420,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -418,20 +450,32 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", "wasi", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "h2" -version = "0.3.15" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -448,15 +492,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "hdrhistogram" -version = "7.5.2" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ "base64", "byteorder", @@ -468,9 +512,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -482,32 +526,72 @@ dependencies = [ ] [[package]] -name = "hostname" -version = "0.3.1" +name = "hermit-abi" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hickory-proto" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" dependencies = [ - "libc", - "match_cfg", - "winapi", + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 1.1.0", + "ipnet", + "once_cell", + "rand", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", ] [[package]] name = "http" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.5", + "itoa", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -516,21 +600,21 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -541,9 +625,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.5", + "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -564,14 +648,84 @@ dependencies = [ ] [[package]] -name = "idna" -version = "0.2.3" +name = "icu_collections" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", ] [[package]] @@ -585,74 +739,81 @@ dependencies = [ ] [[package]] -name = "indexmap" -version = "1.9.2" +name = "idna" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "autocfg", - "hashbrown", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "instant" -version = "0.1.12" +name = "idna_adapter" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "cfg-if", + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", ] [[package]] name = "ipconfig" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2", + "socket2 0.5.10", "widestring", - "winapi", + "windows-sys 0.48.0", "winreg", ] [[package]] name = "ipnet" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" - -[[package]] -name = "itoa" -version = "0.4.8" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.138" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "linked-hash-map" @@ -660,24 +821,32 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.17" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru-cache" @@ -688,29 +857,17 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -720,32 +877,31 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler", + "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "0.8.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.42.0", + "windows-sys 0.61.2", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -759,46 +915,52 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.14.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi", + "hermit-abi 0.5.2", "libc", ] [[package]] name = "once_cell" -version = "1.16.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.44" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d971fd5722fec23977260f6e81aa67d2f22cadbdc2aa049f1022d9a3be1566" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags", + "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", @@ -809,9 +971,9 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", @@ -820,26 +982,25 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "111.24.0+1.1.1s" +version = "300.5.4+3.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd" +checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.79" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5454462c0eced1e97f2ec09036abc8da362e66802f66fd20f86854d9d8cbcbc4" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ - "autocfg", "cc", "libc", "openssl-src", @@ -849,9 +1010,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -859,28 +1020,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.42.0", + "windows-link", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -890,27 +1051,39 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] -name = "ppv-lite86" -version = "0.2.17" +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "proc-macro-hack" -version = "0.5.19" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.48" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d89e5dba24725ae5678020bf8f1357a9aa7ff10736b551adbcd3f8d17d766f" +checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" dependencies = [ "unicode-ident", ] @@ -923,29 +1096,29 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "publicsuffix" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" dependencies = [ - "idna 0.3.0", + "idna 1.1.0", "psl-types", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" -version = "1.0.22" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d0f47a940e895261e77dc200d5eadfc6ef644c179c6f5edfc105e3a2292c8" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -973,55 +1146,52 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.10.0", ] [[package]] name = "regex" -version = "1.7.0" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", + "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] name = "regex-syntax" -version = "0.6.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.11.13" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64", "bytes", @@ -1031,6 +1201,7 @@ dependencies = [ "futures-core", "futures-util", "h2", + "hickory-resolver", "http", "http-body", "hyper", @@ -1043,14 +1214,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "proc-macro-hack", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", "tower-service", - "trust-dns-resolver", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -1060,43 +1232,66 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "hostname", - "quick-error", + "base64", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "lazy_static", - "windows-sys 0.36.1", + "windows-sys 0.61.2", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.7.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -1105,9 +1300,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -1115,18 +1310,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.151" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.151" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1135,13 +1340,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.90" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8778cc0b528968fe72abec38b5db5a20a70d148116cd9325d2bc5f5180ca3faf" +checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da" dependencies = [ - "itoa 1.0.5", - "ryu", + "itoa", + "memchr", "serde", + "serde_core", + "zmij", ] [[package]] @@ -1151,36 +1358,61 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.5", + "itoa", "ryu", "serde", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + [[package]] name = "slab" -version = "0.4.7" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.10.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.4.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "strsim" version = "0.8.0" @@ -1189,27 +1421,64 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.106" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ee3a69cd2c7e06684677e5629b3878b253af05e4714964204279c6bc02cf0b" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" -version = "3.3.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ - "cfg-if", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", ] [[package]] @@ -1223,18 +1492,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", @@ -1243,11 +1512,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ - "itoa 1.0.5", + "deranged", + "itoa", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -1255,56 +1527,64 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ + "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.23.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "autocfg", "bytes", "libc", - "memchr", "mio", - "num_cpus", "pin-project-lite", - "socket2", - "windows-sys 0.42.0", + "socket2 0.6.1", + "windows-sys 0.61.2", ] [[package]] name = "tokio-native-tls" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", @@ -1312,31 +1592,29 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.4" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1344,9 +1622,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -1355,102 +1633,64 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] -[[package]] -name = "trust-dns-proto" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "rand", - "smallvec", - "thiserror", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" -dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "lru-cache", - "parking_lot", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "tracing", - "trust-dns-proto", -] - [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "url" -version = "2.3.1" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna 1.1.0", "percent-encoding", + "serde", ] +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "vcpkg" version = "0.2.15" @@ -1465,68 +1705,65 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasm-bindgen" -version = "0.2.83" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" +name = "wasm-bindgen" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ - "bumpalo", - "log", + "cfg-if", "once_cell", - "proc-macro2", - "quote", - "syn", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1534,28 +1771,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -1563,9 +1803,9 @@ dependencies = [ [[package]] name = "widestring" -version = "0.5.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi" @@ -1589,115 +1829,265 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + [[package]] name = "yaml-rust" version = "0.4.5" @@ -1706,3 +2096,106 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d6085d62852e35540689d1f97ad663e3971fc19cf5eceab364d62c646ea167" From ac76e25da79aac1e785b28e40b226fb9bf0a6c13 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 09:50:39 +0100 Subject: [PATCH 41/75] Upgrade rust editon --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 7263a5c..858470f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ description = "Drill is a HTTP load testing application written in Rust inspired repository = "https://github.com/fcsonline/drill" keywords = ["performance", "http", "ansible", "jmeter"] license = "GPL-3.0" -edition = "2018" +edition = "2021" [dependencies] clap = "2.32.0" From 3845abfae211e642c0f7add4b947458288c41541 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 10:35:51 +0100 Subject: [PATCH 42/75] Replace yaml-rust with serde_yaml --- Cargo.lock | 30 ++++++--- Cargo.toml | 2 +- src/actions/assert.rs | 13 ++-- src/actions/assign.rs | 13 ++-- src/actions/delay.rs | 11 ++-- src/actions/exec.rs | 11 ++-- src/actions/mod.rs | 18 +++--- src/actions/request.rs | 80 ++++++++++++++---------- src/checker.rs | 28 ++------- src/config.rs | 20 +++--- src/expandable/include.rs | 18 +++--- src/expandable/mod.rs | 22 +++---- src/expandable/multi_csv_request.rs | 27 ++++---- src/expandable/multi_file_request.rs | 18 +++--- src/expandable/multi_iter_request.rs | 38 ++++++------ src/expandable/multi_request.rs | 20 +++--- src/reader.rs | 92 +++++++++++++++++++++++----- src/tags.rs | 24 ++++---- 18 files changed, 274 insertions(+), 211 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 53eab8b..16154ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -265,9 +265,9 @@ dependencies = [ "reqwest", "serde", "serde_json", + "serde_yaml", "tokio", "url", - "yaml-rust", ] [[package]] @@ -1363,6 +1363,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1673,6 +1686,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "url" version = "2.5.7" @@ -2088,15 +2107,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - [[package]] name = "yoke" version = "0.8.1" diff --git a/Cargo.toml b/Cargo.toml index 858470f..b196871 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ csv = "1.0.5" regex = "1.5.5" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.39" -yaml-rust = "0.4.3" +serde_yaml = "0.9" url = "2.1.1" linked-hash-map = "0.5.3" tokio = { version = "1.19.2", features = ["time", "net"] } diff --git a/src/actions/assert.rs b/src/actions/assert.rs index 584a62e..440ff03 100644 --- a/src/actions/assert.rs +++ b/src/actions/assert.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use colored::*; use serde_json::json; -use yaml_rust::Yaml; +use serde_yaml::Value; use crate::actions::extract; use crate::actions::Runnable; @@ -17,14 +17,15 @@ pub struct Assert { } impl Assert { - pub fn is_that_you(item: &Yaml) -> bool { - item["assert"].as_hash().is_some() + pub fn is_that_you(item: &Value) -> bool { + item.get("assert").and_then(|v| v.as_mapping()).is_some() } - pub fn new(item: &Yaml, _with_item: Option) -> Assert { + pub fn new(item: &Value, _with_item: Option) -> Assert { let name = extract(item, "name"); - let key = extract(&item["assert"], "key"); - let value = extract(&item["assert"], "value"); + let assert_val = item.get("assert").expect("assert field is required"); + let key = extract(assert_val, "key"); + let value = extract(assert_val, "value"); Assert { name, diff --git a/src/actions/assign.rs b/src/actions/assign.rs index 7588485..ea7c458 100644 --- a/src/actions/assign.rs +++ b/src/actions/assign.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use colored::*; use serde_json::json; -use yaml_rust::Yaml; +use serde_yaml::Value; use crate::actions::extract; use crate::actions::Runnable; @@ -16,14 +16,15 @@ pub struct Assign { } impl Assign { - pub fn is_that_you(item: &Yaml) -> bool { - item["assign"].as_hash().is_some() + pub fn is_that_you(item: &Value) -> bool { + item.get("assign").and_then(|v| v.as_mapping()).is_some() } - pub fn new(item: &Yaml, _with_item: Option) -> Assign { + pub fn new(item: &Value, _with_item: Option) -> Assign { let name = extract(item, "name"); - let key = extract(&item["assign"], "key"); - let value = extract(&item["assign"], "value"); + let assign_val = item.get("assign").expect("assign field is required"); + let key = extract(assign_val, "key"); + let value = extract(assign_val, "value"); Assign { name, diff --git a/src/actions/delay.rs b/src/actions/delay.rs index 0be6580..e5c372f 100644 --- a/src/actions/delay.rs +++ b/src/actions/delay.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use colored::*; use tokio::time::sleep; -use yaml_rust::Yaml; +use serde_yaml::Value; use crate::actions::extract; use crate::actions::Runnable; @@ -18,13 +18,14 @@ pub struct Delay { } impl Delay { - pub fn is_that_you(item: &Yaml) -> bool { - item["delay"].as_hash().is_some() + pub fn is_that_you(item: &Value) -> bool { + item.get("delay").and_then(|v| v.as_mapping()).is_some() } - pub fn new(item: &Yaml, _with_item: Option) -> Delay { + pub fn new(item: &Value, _with_item: Option) -> Delay { let name = extract(item, "name"); - let seconds = u64::try_from(item["delay"]["seconds"].as_i64().unwrap()).expect("Invalid number of seconds"); + let delay_val = item.get("delay").expect("delay field is required"); + let seconds = u64::try_from(delay_val.get("seconds").and_then(|v| v.as_i64()).expect("Invalid number of seconds")).expect("Invalid number of seconds"); Delay { name, diff --git a/src/actions/exec.rs b/src/actions/exec.rs index 2c32e03..bf107f7 100644 --- a/src/actions/exec.rs +++ b/src/actions/exec.rs @@ -2,7 +2,7 @@ use async_trait::async_trait; use colored::*; use serde_json::json; use std::process::Command; -use yaml_rust::Yaml; +use serde_yaml::Value; use crate::actions::Runnable; use crate::actions::{extract, extract_optional}; @@ -18,13 +18,14 @@ pub struct Exec { } impl Exec { - pub fn is_that_you(item: &Yaml) -> bool { - item["exec"].as_hash().is_some() + pub fn is_that_you(item: &Value) -> bool { + item.get("exec").and_then(|v| v.as_mapping()).is_some() } - pub fn new(item: &Yaml, _with_item: Option) -> Exec { + pub fn new(item: &Value, _with_item: Option) -> Exec { let name = extract(item, "name"); - let command = extract(&item["exec"], "command"); + let exec_val = item.get("exec").expect("exec field is required"); + let command = extract(exec_val, "command"); let assign = extract_optional(item, "assign"); Exec { diff --git a/src/actions/mod.rs b/src/actions/mod.rs index 46c9d9e..14a661c 100644 --- a/src/actions/mod.rs +++ b/src/actions/mod.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use yaml_rust::Yaml; +use serde_yaml::Value; mod assert; mod assign; @@ -42,24 +42,24 @@ impl fmt::Display for Report { } } -pub fn extract_optional<'a>(item: &'a Yaml, attr: &'a str) -> Option { - if let Some(s) = item[attr].as_str() { +pub fn extract_optional<'a>(item: &'a Value, attr: &'a str) -> Option { + if let Some(s) = item.get(attr).and_then(|v| v.as_str()) { Some(s.to_string()) - } else if item[attr].as_hash().is_some() { + } else if item.get(attr).and_then(|v| v.as_mapping()).is_some() { panic!("`{}` needs to be a string. Try adding quotes", attr); } else { None } } -pub fn extract<'a>(item: &'a Yaml, attr: &'a str) -> String { - if let Some(s) = item[attr].as_i64() { +pub fn extract<'a>(item: &'a Value, attr: &'a str) -> String { + if let Some(s) = item.get(attr).and_then(|v| v.as_i64()) { s.to_string() - } else if let Some(s) = item[attr].as_str() { + } else if let Some(s) = item.get(attr).and_then(|v| v.as_str()) { s.to_string() - } else if item[attr].as_hash().is_some() { + } else if item.get(attr).and_then(|v| v.as_mapping()).is_some() { panic!("`{}` is required needs to be a string. Try adding quotes", attr); } else { - panic!("Unknown node `{}` => {:?}", attr, item[attr]); + panic!("Unknown node `{}` => {:?}", attr, item.get(attr)); } } diff --git a/src/actions/request.rs b/src/actions/request.rs index b7bb270..be20abe 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -9,7 +9,7 @@ use reqwest::{ }; use std::fmt::Write; use url::Url; -use yaml_rust::Yaml; +use serde_yaml::Value as YamlValue; use serde::{Deserialize, Serialize}; use serde_json::{json, Map, Value}; @@ -32,7 +32,7 @@ pub struct Request { method: String, headers: HashMap, pub body: Option, - pub with_item: Option, + pub with_item: Option, pub index: Option, pub assign: Option, } @@ -45,16 +45,17 @@ struct AssignedRequest { } impl Request { - pub fn is_that_you(item: &Yaml) -> bool { - item["request"].as_hash().is_some() + pub fn is_that_you(item: &YamlValue) -> bool { + item.get("request").and_then(|v| v.as_mapping()).is_some() } - pub fn new(item: &Yaml, with_item: Option, index: Option) -> Request { + pub fn new(item: &YamlValue, with_item: Option, index: Option) -> Request { let name = extract(item, "name"); - let url = extract(&item["request"], "url"); + let request_val = item.get("request").expect("request field is required"); + let url = extract(request_val, "url"); let assign = extract_optional(item, "assign"); - let method = if let Some(v) = extract_optional(&item["request"], "method") { + let method = if let Some(v) = extract_optional(request_val, "method") { v.to_uppercase() } else { "GET".to_string() @@ -62,17 +63,21 @@ impl Request { let body_verbs = vec!["POST", "PATCH", "PUT"]; let body = if body_verbs.contains(&method.as_str()) { - Some(extract(&item["request"], "body")) + Some(extract(request_val, "body")) } else { None }; let mut headers = HashMap::new(); - if let Some(hash) = item["request"]["headers"].as_hash() { - for (key, val) in hash.iter() { + if let Some(mapping) = request_val.get("headers").and_then(|v| v.as_mapping()) { + for (key, val) in mapping.iter() { if let Some(vs) = val.as_str() { - headers.insert(key.as_str().unwrap().to_string(), vs.to_string()); + if let Some(key_str) = key.as_str() { + headers.insert(key_str.to_string(), vs.to_string()); + } else { + panic!("{} Header keys must be strings!!", "WARNING!".yellow().bold()); + } } else { panic!("{} Headers must be strings!!", "WARNING!".yellow().bold()); } @@ -222,31 +227,38 @@ impl Request { } } -fn yaml_to_json(data: Yaml) -> Value { - if let Some(b) = data.as_bool() { - json!(b) - } else if let Some(i) = data.as_i64() { - json!(i) - } else if let Some(s) = data.as_str() { - json!(s) - } else if let Some(h) = data.as_hash() { - let mut map = Map::new(); - - for (key, value) in h.iter() { - map.entry(key.as_str().unwrap()).or_insert(yaml_to_json(value.clone())); +fn yaml_to_json(data: YamlValue) -> Value { + match data { + YamlValue::Bool(b) => json!(b), + YamlValue::Number(n) => { + if let Some(i) = n.as_i64() { + json!(i) + } else if let Some(f) = n.as_f64() { + json!(f) + } else { + // Fallback: convert to string representation + json!(n.to_string()) + } } - - json!(map) - } else if let Some(v) = data.as_vec() { - let mut array = Vec::new(); - - for value in v.iter() { - array.push(yaml_to_json(value.clone())); + YamlValue::String(s) => json!(s), + YamlValue::Mapping(m) => { + let mut map = Map::new(); + for (key, value) in m.iter() { + if let Some(key_str) = key.as_str() { + map.insert(key_str.to_string(), yaml_to_json(value.clone())); + } + } + json!(map) } - - json!(array) - } else { - panic!("Unknown Yaml node") + YamlValue::Sequence(v) => { + let mut array = Vec::new(); + for value in v.iter() { + array.push(yaml_to_json(value.clone())); + } + json!(array) + } + YamlValue::Null => json!(null), + _ => panic!("Unknown Yaml node") } } diff --git a/src/checker.rs b/src/checker.rs index 66216ce..af6136f 100644 --- a/src/checker.rs +++ b/src/checker.rs @@ -1,11 +1,7 @@ -use std::fs::File; -use std::io::prelude::*; -use std::path::Path; - use colored::*; -use yaml_rust::YamlLoader; use crate::actions::Report; +use crate::reader; pub fn compare(list_reports: &[Vec], filepath: &str, threshold: &str) -> Result<(), i32> { let threshold_value = match threshold.parse::() { @@ -13,32 +9,16 @@ pub fn compare(list_reports: &[Vec], filepath: &str, threshold: &str) -> _ => panic!("arrrgh"), }; - // Create a path to the desired file - let path = Path::new(filepath); - let display = path.display(); - - // Open the path in read-only mode, returns `io::Result` - let mut file = match File::open(path) { - Err(why) => panic!("couldn't open {}: {}", display, why), - Ok(file) => file, - }; - - // Read the file contents into a string, returns `io::Result` - let mut content = String::new(); - if let Err(why) = file.read_to_string(&mut content) { - panic!("couldn't read {}: {}", display, why); - } - - let docs = YamlLoader::load_from_str(content.as_str()).unwrap(); + let docs = reader::read_file_as_yml(filepath); let doc = &docs[0]; - let items = doc.as_vec().unwrap(); + let items = doc.as_sequence().unwrap(); let mut slow_counter = 0; println!(); for report in list_reports { for (i, report_item) in report.iter().enumerate() { - let recorded_duration = items[i]["duration"].as_f64().unwrap(); + let recorded_duration = items[i].get("duration").and_then(|v| v.as_f64()).unwrap(); let delta_ms = report_item.duration - recorded_duration; if delta_ms > threshold_value { diff --git a/src/config.rs b/src/config.rs index baebd61..38cce2f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -use yaml_rust::{Yaml, YamlLoader}; +use serde_yaml::Value; use crate::benchmark::Context; use crate::interpolator; @@ -22,9 +22,7 @@ pub struct Config { impl Config { pub fn new(path: &str, relaxed_interpolations: bool, no_check_certificate: bool, quiet: bool, nanosec: bool, timeout: u64, verbose: bool) -> Config { - let config_file = reader::read_file(path); - - let config_docs = YamlLoader::load_from_str(config_file.as_str()).unwrap(); + let config_docs = reader::read_file_as_yml(path); let config_doc = &config_docs[0]; let context: Context = Context::new(); @@ -54,8 +52,8 @@ impl Config { } } -fn read_str_configuration(config_doc: &Yaml, interpolator: &interpolator::Interpolator, name: &str, default: &str) -> String { - match config_doc[name].as_str() { +fn read_str_configuration(config_doc: &Value, interpolator: &interpolator::Interpolator, name: &str, default: &str) -> String { + match config_doc.get(name).and_then(|v| v.as_str()) { Some(value) => { if value.contains('{') { interpolator.resolve(value, true) @@ -64,7 +62,7 @@ fn read_str_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp } } None => { - if config_doc[name].as_str().is_some() { + if config_doc.get(name).and_then(|v| v.as_str()).is_some() { println!("Invalid {name} value!"); } @@ -73,10 +71,10 @@ fn read_str_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp } } -fn read_i64_configuration(config_doc: &Yaml, interpolator: &interpolator::Interpolator, name: &str, default: i64) -> i64 { - let value = if let Some(value) = config_doc[name].as_i64() { +fn read_i64_configuration(config_doc: &Value, interpolator: &interpolator::Interpolator, name: &str, default: i64) -> i64 { + let value = if let Some(value) = config_doc.get(name).and_then(|v| v.as_i64()) { Some(value) - } else if let Some(key) = config_doc[name].as_str() { + } else if let Some(key) = config_doc.get(name).and_then(|v| v.as_str()) { interpolator.resolve(key, false).parse::().ok() } else { None @@ -93,7 +91,7 @@ fn read_i64_configuration(config_doc: &Yaml, interpolator: &interpolator::Interp } } None => { - if config_doc[name].as_str().is_some() { + if config_doc.get(name).and_then(|v| v.as_str()).is_some() { println!("Invalid {name} value!"); } diff --git a/src/expandable/include.rs b/src/expandable/include.rs index e288283..9092218 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -1,5 +1,5 @@ use std::path::Path; -use yaml_rust::{Yaml, YamlEmitter}; +use serde_yaml::Value; use crate::interpolator::INTERPOLATION_REGEX; @@ -10,12 +10,12 @@ use crate::tags::Tags; use crate::reader; -pub fn is_that_you(item: &Yaml) -> bool { - item["include"].as_str().is_some() +pub fn is_that_you(item: &Value) -> bool { + item.get("include").and_then(|v| v.as_str()).is_some() } -pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark, tags: &Tags) { - let include_path = item["include"].as_str().unwrap(); +pub fn expand(parent_path: &str, item: &Value, benchmark: &mut Benchmark, tags: &Tags) { + let include_path = item.get("include").and_then(|v| v.as_str()).unwrap(); if INTERPOLATION_REGEX.is_match(include_path) { panic!("Interpolations not supported in 'include' property!"); @@ -61,9 +61,7 @@ pub fn expand_from_filepath(parent_path: &str, benchmark: &mut Benchmark, access } else if actions::Request::is_that_you(item) { benchmark.push(Box::new(actions::Request::new(item, None, None))); } else { - let mut out_str = String::new(); - let mut emitter = YamlEmitter::new(&mut out_str); - emitter.dump(item).unwrap(); + let out_str = serde_yaml::to_string(item).unwrap(); panic!("Unknown node:\n\n{}\n\n", out_str); } } @@ -78,7 +76,7 @@ mod tests { #[test] fn expand_include() { let text = "---\nname: Include comment\ninclude: comments.yml"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -92,7 +90,7 @@ mod tests { #[should_panic] fn invalid_expand() { let text = "---\nname: Include comment\ninclude: {{ memory }}.yml"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); diff --git a/src/expandable/mod.rs b/src/expandable/mod.rs index 927697a..139d86c 100644 --- a/src/expandable/mod.rs +++ b/src/expandable/mod.rs @@ -5,10 +5,10 @@ mod multi_file_request; mod multi_iter_request; mod multi_request; -use yaml_rust::Yaml; +use serde_yaml::Value; -pub fn pick(item: &Yaml, with_items: &[Yaml]) -> usize { - match item["pick"].as_i64() { +pub fn pick(item: &Value, with_items: &[Value]) -> usize { + match item.get("pick").and_then(|v| v.as_i64()) { Some(value) => { if value.is_negative() { panic!("pick option should not be negative, but was {}", value); @@ -32,8 +32,8 @@ mod tests { #[test] fn should_return_the_configured_value() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items:\n - 1\n - 2\n - 3"; - let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; - let pick = pick(item, item["with_items"].as_vec().unwrap()); + let item = &crate::reader::read_file_as_yml_from_str(text)[0]; + let pick = pick(item, item.get("with_items").and_then(|v| v.as_sequence()).unwrap()); assert_eq!(pick, 2); } @@ -41,8 +41,8 @@ mod tests { #[test] fn should_return_the_with_items_length_if_unset() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\nwith_items:\n - 1\n - 2\n - 3"; - let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; - let pick = pick(item, item["with_items"].as_vec().unwrap()); + let item = &crate::reader::read_file_as_yml_from_str(text)[0]; + let pick = pick(item, item.get("with_items").and_then(|v| v.as_sequence()).unwrap()); assert_eq!(pick, 3); } @@ -51,16 +51,16 @@ mod tests { #[should_panic(expected = "pick option should not be negative, but was -1")] fn should_panic_for_negative_values() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: -1\nwith_items:\n - 1\n - 2\n - 3"; - let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; - pick(item, item["with_items"].as_vec().unwrap()); + let item = &crate::reader::read_file_as_yml_from_str(text)[0]; + pick(item, item.get("with_items").and_then(|v| v.as_sequence()).unwrap()); } #[test] #[should_panic(expected = "pick option should not be greater than the provided items, but was 4")] fn should_panic_for_values_greater_than_the_items_list() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 4\nwith_items:\n - 1\n - 2\n - 3"; - let item = &yaml_rust::YamlLoader::load_from_str(text).unwrap()[0]; - pick(item, item["with_items"].as_vec().unwrap()); + let item = &crate::reader::read_file_as_yml_from_str(text)[0]; + pick(item, item.get("with_items").and_then(|v| v.as_sequence()).unwrap()); } } } diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index cb1f8db..414d560 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -1,7 +1,7 @@ use rand::seq::SliceRandom; use rand::thread_rng; use std::path::Path; -use yaml_rust::Yaml; +use serde_yaml::Value; use super::pick; use crate::actions::Request; @@ -9,16 +9,17 @@ use crate::benchmark::Benchmark; use crate::interpolator::INTERPOLATION_REGEX; use crate::reader; -pub fn is_that_you(item: &Yaml) -> bool { - item["request"].as_hash().is_some() && (item["with_items_from_csv"].as_str().is_some() || item["with_items_from_csv"].as_hash().is_some()) +pub fn is_that_you(item: &Value) -> bool { + item.get("request").and_then(|v| v.as_mapping()).is_some() && (item.get("with_items_from_csv").and_then(|v| v.as_str()).is_some() || item.get("with_items_from_csv").and_then(|v| v.as_mapping()).is_some()) } -pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { - let (with_items_path, quote_char) = if let Some(with_items_path) = item["with_items_from_csv"].as_str() { +pub fn expand(parent_path: &str, item: &Value, benchmark: &mut Benchmark) { + let (with_items_path, quote_char) = if let Some(with_items_path) = item.get("with_items_from_csv").and_then(|v| v.as_str()) { (with_items_path, b'\"') - } else if let Some(_with_items_hash) = item["with_items_from_csv"].as_hash() { - let with_items_path = item["with_items_from_csv"]["file_name"].as_str().expect("Expected a file_name"); - let quote_char = item["with_items_from_csv"]["quote_char"].as_str().unwrap_or("\"").bytes().next().unwrap(); + } else if let Some(_with_items_hash) = item.get("with_items_from_csv").and_then(|v| v.as_mapping()) { + let csv_val = item.get("with_items_from_csv").unwrap(); + let with_items_path = csv_val.get("file_name").and_then(|v| v.as_str()).expect("Expected a file_name"); + let quote_char = csv_val.get("quote_char").and_then(|v| v.as_str()).unwrap_or("\"").bytes().next().unwrap(); (with_items_path, quote_char) } else { @@ -34,7 +35,7 @@ pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { let mut with_items_file = reader::read_csv_file_as_yml(final_path, quote_char); - if let Some(shuffle) = item["shuffle"].as_bool() { + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { let mut rng = thread_rng(); with_items_file.shuffle(&mut rng); @@ -56,7 +57,7 @@ mod tests { #[test] fn expand_multi() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item.id }}\nwith_items_from_csv: ./fixtures/users.csv"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -69,7 +70,7 @@ mod tests { #[test] fn expand_multi_should_limit_requests_using_the_pick_option() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items_from_csv: ./fixtures/users.csv"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -82,7 +83,7 @@ mod tests { #[test] fn expand_multi_should_work_with_pick_and_shuffle() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 1\nshuffle: true\nwith_items_from_csv: ./fixtures/users.csv"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -96,7 +97,7 @@ mod tests { #[should_panic] fn runtime_expand() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item.id }}\nwith_items_from_csv: ./fixtures/{{ memory }}.csv"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 08ce26b..4f19452 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -6,14 +6,14 @@ use crate::reader; use rand::seq::SliceRandom; use rand::thread_rng; use std::path::Path; -use yaml_rust::Yaml; +use serde_yaml::Value; -pub fn is_that_you(item: &Yaml) -> bool { - item["request"].as_hash().is_some() && (item["with_items_from_file"].as_str().is_some() || item["with_items_from_file"].as_hash().is_some()) +pub fn is_that_you(item: &Value) -> bool { + item.get("request").and_then(|v| v.as_mapping()).is_some() && (item.get("with_items_from_file").and_then(|v| v.as_str()).is_some() || item.get("with_items_from_file").and_then(|v| v.as_mapping()).is_some()) } -pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { - let with_items_path = if let Some(with_items_path) = item["with_items_from_file"].as_str() { +pub fn expand(parent_path: &str, item: &Value, benchmark: &mut Benchmark) { + let with_items_path = if let Some(with_items_path) = item.get("with_items_from_file").and_then(|v| v.as_str()) { with_items_path } else { unreachable!(); @@ -28,7 +28,7 @@ pub fn expand(parent_path: &str, item: &Yaml, benchmark: &mut Benchmark) { let mut with_items_file = reader::read_file_as_yml_array(final_path); - if let Some(shuffle) = item["shuffle"].as_bool() { + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { let mut rng = thread_rng(); with_items_file.shuffle(&mut rng); @@ -50,7 +50,7 @@ mod test { #[test] fn expand_multi() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item.id }}\nwith_items_from_file: ./fixtures/texts.txt"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -63,7 +63,7 @@ mod test { #[test] fn expand_multi_should_limit_requests_using_the_pick_option() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items_from_file: ./fixtures/texts.txt"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -76,7 +76,7 @@ mod test { #[test] fn expand_multi_should_work_with_pick_and_shuffle() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 1\nshuffle: true\nwith_items_from_file: ./fixtures/texts.txt"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index 8d3a565..5457195 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -2,27 +2,27 @@ use std::convert::TryInto; use rand::seq::SliceRandom; use rand::thread_rng; -use yaml_rust::Yaml; +use serde_yaml::{Value, Number}; use crate::interpolator::INTERPOLATION_REGEX; use crate::actions::Request; use crate::benchmark::Benchmark; -pub fn is_that_you(item: &Yaml) -> bool { - item["request"].as_hash().is_some() && item["with_items_range"].as_hash().is_some() +pub fn is_that_you(item: &Value) -> bool { + item.get("request").and_then(|v| v.as_mapping()).is_some() && item.get("with_items_range").and_then(|v| v.as_mapping()).is_some() } -pub fn expand(item: &Yaml, benchmark: &mut Benchmark) { - if let Some(with_iter_items) = item["with_items_range"].as_hash() { - let init = Yaml::Integer(1); - let lstart = Yaml::String("start".into()); - let lstep = Yaml::String("step".into()); - let lstop = Yaml::String("stop".into()); +pub fn expand(item: &Value, benchmark: &mut Benchmark) { + if let Some(with_iter_items) = item.get("with_items_range").and_then(|v| v.as_mapping()) { + let lstart = Value::String("start".into()); + let lstep = Value::String("step".into()); + let lstop = Value::String("stop".into()); - let vstart: &Yaml = with_iter_items.get(&lstart).expect("Start property is mandatory"); - let vstep: &Yaml = with_iter_items.get(&lstep).unwrap_or(&init); - let vstop: &Yaml = with_iter_items.get(&lstop).expect("Stop property is mandatory"); + let vstart = with_iter_items.get(&lstart).expect("Start property is mandatory"); + let default_step = Value::Number(Number::from(1)); + let vstep = with_iter_items.get(&lstep).unwrap_or(&default_step); + let vstop = with_iter_items.get(&lstop).expect("Stop property is mandatory"); let start: &str = vstart.as_str().unwrap_or(""); let step: &str = vstep.as_str().unwrap_or(""); @@ -49,21 +49,21 @@ pub fn expand(item: &Yaml, benchmark: &mut Benchmark) { if stop > start && start > 0 { let mut with_items: Vec = (start..stop).step_by(step as usize).collect(); - if let Some(shuffle) = item["shuffle"].as_bool() { + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { let mut rng = thread_rng(); with_items.shuffle(&mut rng); } } - if let Some(pick) = item["pick"].as_i64() { + if let Some(pick) = item.get("pick").and_then(|v| v.as_i64()) { with_items.truncate(pick.try_into().expect("pick can't be larger than size of range")) } for (index, value) in with_items.iter().enumerate() { let index = index as u32; - benchmark.push(Box::new(Request::new(item, Some(Yaml::Integer(*value)), Some(index)))); + benchmark.push(Box::new(Request::new(item, Some(Value::Number(Number::from(*value))), Some(index)))); } } } @@ -76,7 +76,7 @@ mod tests { #[test] fn expand_multi_range() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\nwith_items_range:\n start: 2\n step: 2\n stop: 20"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -89,7 +89,7 @@ mod tests { #[test] fn expand_multi_range_should_limit_requests_using_the_pick_option() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 3\nwith_items_range:\n start: 2\n step: 2\n stop: 20"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -103,7 +103,7 @@ mod tests { #[should_panic] fn invalid_expand() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\nwith_items_range:\n start: 1\n step: 2\n stop: foo"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -114,7 +114,7 @@ mod tests { #[should_panic] fn runtime_expand() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\nwith_items_range:\n start: 1\n step: 2\n stop: \"{{ memory }}\""; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); diff --git a/src/expandable/multi_request.rs b/src/expandable/multi_request.rs index ddf413b..4824f8f 100644 --- a/src/expandable/multi_request.rs +++ b/src/expandable/multi_request.rs @@ -1,21 +1,21 @@ use rand::seq::SliceRandom; use rand::thread_rng; -use yaml_rust::Yaml; +use serde_yaml::Value; use super::pick; use crate::actions::Request; use crate::benchmark::Benchmark; use crate::interpolator::INTERPOLATION_REGEX; -pub fn is_that_you(item: &Yaml) -> bool { - item["request"].as_hash().is_some() && item["with_items"].as_vec().is_some() +pub fn is_that_you(item: &Value) -> bool { + item.get("request").and_then(|v| v.as_mapping()).is_some() && item.get("with_items").and_then(|v| v.as_sequence()).is_some() } -pub fn expand(item: &Yaml, benchmark: &mut Benchmark) { - if let Some(with_items) = item["with_items"].as_vec() { +pub fn expand(item: &Value, benchmark: &mut Benchmark) { + if let Some(with_items) = item.get("with_items").and_then(|v| v.as_sequence()) { let mut with_items_list = with_items.clone(); - if let Some(shuffle) = item["shuffle"].as_bool() { + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { let mut rng = thread_rng(); with_items_list.shuffle(&mut rng); @@ -44,7 +44,7 @@ mod tests { #[test] fn expand_multi() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\nwith_items:\n - 1\n - 2\n - 3"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -57,7 +57,7 @@ mod tests { #[test] fn expand_multi_should_limit_requests_using_the_pick_option() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 2\nwith_items:\n - 1\n - 2\n - 3"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -70,7 +70,7 @@ mod tests { #[test] fn expand_multi_should_work_with_pick_and_shuffle() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\npick: 1\nshuffle: true\nwith_items:\n - 1\n - 2\n - 3"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); @@ -84,7 +84,7 @@ mod tests { #[should_panic] fn runtime_expand() { let text = "---\nname: foobar\nrequest:\n url: /api/{{ item }}\nwith_items:\n - 1\n - 2\n - foo{{ memory }}"; - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); + let docs = crate::reader::read_file_as_yml_from_str(text); let doc = &docs[0]; let mut benchmark: Benchmark = Benchmark::new(); diff --git a/src/reader.rs b/src/reader.rs index 38d335e..93ce8ba 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,6 +1,7 @@ use std::fs::File; use std::io::{prelude::*, BufReader}; use std::path::Path; +use serde_yaml::{Value, Mapping}; pub fn read_file(filepath: &str) -> String { // Create a path to the desired file @@ -22,14 +23,75 @@ pub fn read_file(filepath: &str) -> String { content } -pub fn read_file_as_yml(filepath: &str) -> Vec { +fn parse_yaml_content(content: &str) -> Vec { + // serde_yaml doesn't support multiple documents natively, so we split by "---\n" and parse each + let mut docs = Vec::new(); + let trimmed_content = content.trim(); + + // Handle multi-document YAML (separated by "---\n") + if trimmed_content.contains("\n---\n") || (trimmed_content.starts_with("---\n") && trimmed_content.matches("---\n").count() > 1) { + let parts: Vec<&str> = trimmed_content.split("---\n").collect(); + for doc_str in parts { + let trimmed = doc_str.trim(); + // Skip empty parts and parts that are only comments + if !trimmed.is_empty() && !trimmed.chars().all(|c| c == '#' || c.is_whitespace() || c == '\n') { + match serde_yaml::from_str::(trimmed) { + Ok(doc) => { + // Skip Null documents (which can result from comments-only content) + if !matches!(doc, Value::Null) { + docs.push(doc); + } + } + Err(e) => { + eprintln!("Error parsing YAML document: {}", e); + panic!("Failed to parse YAML: {}", e); + } + } + } + } + } + + // If no documents were found (empty file or no "---"), try parsing the whole content + if docs.is_empty() { + // Remove leading "---\n" if present for single-document files + let content_to_parse = if trimmed_content.starts_with("---\n") { + &trimmed_content[4..] + } else { + trimmed_content + }; + match serde_yaml::from_str::(content_to_parse.trim()) { + Ok(doc) => { + if !matches!(doc, Value::Null) { + docs.push(doc); + } + } + Err(e) => { + eprintln!("Error parsing YAML content: {}", e); + panic!("Failed to parse YAML: {}", e); + } + } + } + + // If still empty, return a single Null document to maintain compatibility + if docs.is_empty() { + docs.push(Value::Null); + } + + docs +} + +pub fn read_file_as_yml(filepath: &str) -> Vec { let content = read_file(filepath); - yaml_rust::YamlLoader::load_from_str(content.as_str()).unwrap() + parse_yaml_content(&content) +} + +pub fn read_file_as_yml_from_str(content: &str) -> Vec { + parse_yaml_content(content) } -pub fn read_yaml_doc_accessor<'a>(doc: &'a yaml_rust::Yaml, accessor: Option<&str>) -> &'a Vec { +pub fn read_yaml_doc_accessor<'a>(doc: &'a Value, accessor: Option<&str>) -> &'a Vec { if let Some(accessor_id) = accessor { - match doc[accessor_id].as_vec() { + match doc.get(accessor_id).and_then(|v| v.as_sequence()) { Some(items) => items, None => { println!("Node missing on config: {accessor_id}"); @@ -38,11 +100,11 @@ pub fn read_yaml_doc_accessor<'a>(doc: &'a yaml_rust::Yaml, accessor: Option<&st } } } else { - doc.as_vec().unwrap() + doc.as_sequence().expect(&format!("Expected document to be a sequence, got: {:?}", doc)) } } -pub fn read_file_as_yml_array(filepath: &str) -> yaml_rust::yaml::Array { +pub fn read_file_as_yml_array(filepath: &str) -> Vec { let path = Path::new(filepath); let display = path.display(); @@ -52,11 +114,11 @@ pub fn read_file_as_yml_array(filepath: &str) -> yaml_rust::yaml::Array { }; let reader = BufReader::new(file); - let mut items = yaml_rust::yaml::Array::new(); + let mut items = Vec::new(); for line in reader.lines() { match line { Ok(text) => { - items.push(yaml_rust::Yaml::String(text)); + items.push(Value::String(text)); } Err(e) => println!("error parsing line: {e:?}"), } @@ -66,7 +128,7 @@ pub fn read_file_as_yml_array(filepath: &str) -> yaml_rust::yaml::Array { } // TODO: Try to split this fn into two -pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> yaml_rust::yaml::Array { +pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> Vec { // Create a path to the desired file let path = Path::new(filepath); let display = path.display(); @@ -79,7 +141,7 @@ pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> yaml_rust::yaml::Array let mut rdr = csv::ReaderBuilder::new().has_headers(true).quote(quote).from_reader(file); - let mut items = yaml_rust::yaml::Array::new(); + let mut items = Vec::new(); let headers = match rdr.headers() { Err(why) => panic!("error parsing header: {:?}", why), @@ -89,16 +151,16 @@ pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> yaml_rust::yaml::Array for result in rdr.records() { match result { Ok(record) => { - let mut linked_hash_map = linked_hash_map::LinkedHashMap::new(); + let mut mapping = Mapping::new(); for (i, header) in headers.iter().enumerate() { - let item_key = yaml_rust::Yaml::String(header.to_string()); - let item_value = yaml_rust::Yaml::String(record.get(i).unwrap().to_string()); + let item_key = Value::String(header.to_string()); + let item_value = Value::String(record.get(i).unwrap().to_string()); - linked_hash_map.insert(item_key, item_value); + mapping.insert(item_key, item_value); } - items.push(yaml_rust::Yaml::Hash(linked_hash_map)); + items.push(Value::Mapping(mapping)); } Err(e) => println!("error parsing header: {e:?}"), } diff --git a/src/tags.rs b/src/tags.rs index 7fa269e..12bf6a7 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -1,7 +1,7 @@ use crate::reader; use colored::*; use std::collections::HashSet; -use yaml_rust::{Yaml, YamlEmitter}; +use serde_yaml::Value; #[derive(Debug)] pub struct Tags<'a> { @@ -26,10 +26,10 @@ impl<'a> Tags<'a> { } } - pub fn should_skip_item(&self, item: &Yaml) -> bool { - match item["tags"].as_vec() { + pub fn should_skip_item(&self, item: &Value) -> bool { + match item.get("tags").and_then(|v| v.as_sequence()) { Some(item_tags_raw) => { - let item_tags: HashSet<&str> = item_tags_raw.iter().map(|t| t.as_str().unwrap()).collect(); + let item_tags: HashSet<&str> = item_tags_raw.iter().filter_map(|t| t.as_str()).collect(); if let Some(s) = &self.skip_tags { if !s.is_disjoint(&item_tags) { return true; @@ -81,9 +81,7 @@ pub fn list_benchmark_file_tasks(benchmark_file: &str, tags: &Tags) { } for item in items { - let mut out_str = String::new(); - let mut emitter = YamlEmitter::new(&mut out_str); - emitter.dump(item).unwrap(); + let out_str = serde_yaml::to_string(item).unwrap(); println!("{out_str}"); } } @@ -100,8 +98,8 @@ pub fn list_benchmark_file_tags(benchmark_file: &str) { } let mut tags: HashSet<&str> = HashSet::new(); for item in items { - if let Some(item_tags_raw) = item["tags"].as_vec() { - tags.extend(item_tags_raw.iter().map(|t| t.as_str().unwrap())); + if let Some(item_tags_raw) = item.get("tags").and_then(|v| v.as_sequence()) { + tags.extend(item_tags_raw.iter().filter_map(|t| t.as_str())); } } @@ -114,12 +112,12 @@ pub fn list_benchmark_file_tags(benchmark_file: &str) { mod tests { use super::*; - fn str_to_yaml(text: &str) -> Yaml { - let mut docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); - docs.remove(0) + fn str_to_yaml(text: &str) -> Value { + let docs = crate::reader::read_file_as_yml_from_str(text); + docs[0].clone() } - fn prepare_default_item() -> Yaml { + fn prepare_default_item() -> Value { str_to_yaml("---\nname: foo\nrequest:\n url: /\ntags:\n - tag1\n - tag2") } From 9d7ebcf3d787d8a0eeb8436296912844edfd5061 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 10:43:46 +0100 Subject: [PATCH 43/75] Fix some clippy warnings --- src/actions/assert.rs | 2 +- src/actions/exec.rs | 2 +- src/actions/mod.rs | 4 ++-- src/actions/request.rs | 2 +- src/expandable/include.rs | 2 +- src/expandable/mod.rs | 4 ++-- src/reader.rs | 20 ++++++++++---------- src/writer.rs | 4 ++-- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/actions/assert.rs b/src/actions/assert.rs index 440ff03..7cb3032 100644 --- a/src/actions/assert.rs +++ b/src/actions/assert.rs @@ -48,7 +48,7 @@ impl Runnable for Assert { let assertion = json!(self.value.to_owned()); if !stored.eq(&assertion) { - panic!("Assertion mismatched: {} != {}", stored, assertion); + panic!("Assertion mismatched: {stored} != {assertion}"); } } } diff --git a/src/actions/exec.rs b/src/actions/exec.rs index bf107f7..bdfb89d 100644 --- a/src/actions/exec.rs +++ b/src/actions/exec.rs @@ -45,7 +45,7 @@ impl Runnable for Exec { let final_command = interpolator::Interpolator::new(context).resolve(&self.command, !config.relaxed_interpolations); - let args = vec!["bash", "-c", "--", final_command.as_str()]; + let args = ["bash", "-c", "--", final_command.as_str()]; let execution = Command::new(args[0]).args(&args[1..]).output().expect("Couldn't run it"); diff --git a/src/actions/mod.rs b/src/actions/mod.rs index 14a661c..e3c142c 100644 --- a/src/actions/mod.rs +++ b/src/actions/mod.rs @@ -46,7 +46,7 @@ pub fn extract_optional<'a>(item: &'a Value, attr: &'a str) -> Option { if let Some(s) = item.get(attr).and_then(|v| v.as_str()) { Some(s.to_string()) } else if item.get(attr).and_then(|v| v.as_mapping()).is_some() { - panic!("`{}` needs to be a string. Try adding quotes", attr); + panic!("`{attr}` needs to be a string. Try adding quotes"); } else { None } @@ -58,7 +58,7 @@ pub fn extract<'a>(item: &'a Value, attr: &'a str) -> String { } else if let Some(s) = item.get(attr).and_then(|v| v.as_str()) { s.to_string() } else if item.get(attr).and_then(|v| v.as_mapping()).is_some() { - panic!("`{}` is required needs to be a string. Try adding quotes", attr); + panic!("`{attr}` is required needs to be a string. Try adding quotes"); } else { panic!("Unknown node `{}` => {:?}", attr, item.get(attr)); } diff --git a/src/actions/request.rs b/src/actions/request.rs index be20abe..ee95989 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -61,7 +61,7 @@ impl Request { "GET".to_string() }; - let body_verbs = vec!["POST", "PATCH", "PUT"]; + let body_verbs = ["POST", "PATCH", "PUT"]; let body = if body_verbs.contains(&method.as_str()) { Some(extract(request_val, "body")) } else { diff --git a/src/expandable/include.rs b/src/expandable/include.rs index 9092218..560ddc8 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -62,7 +62,7 @@ pub fn expand_from_filepath(parent_path: &str, benchmark: &mut Benchmark, access benchmark.push(Box::new(actions::Request::new(item, None, None))); } else { let out_str = serde_yaml::to_string(item).unwrap(); - panic!("Unknown node:\n\n{}\n\n", out_str); + panic!("Unknown node:\n\n{out_str}\n\n"); } } } diff --git a/src/expandable/mod.rs b/src/expandable/mod.rs index 139d86c..1b044b4 100644 --- a/src/expandable/mod.rs +++ b/src/expandable/mod.rs @@ -11,9 +11,9 @@ pub fn pick(item: &Value, with_items: &[Value]) -> usize { match item.get("pick").and_then(|v| v.as_i64()) { Some(value) => { if value.is_negative() { - panic!("pick option should not be negative, but was {}", value); + panic!("pick option should not be negative, but was {value}"); } else if value as usize > with_items.len() { - panic!("pick option should not be greater than the provided items, but was {}", value); + panic!("pick option should not be greater than the provided items, but was {value}"); } else { value as usize } diff --git a/src/reader.rs b/src/reader.rs index 93ce8ba..58b5e97 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -10,14 +10,14 @@ pub fn read_file(filepath: &str) -> String { // Open the path in read-only mode, returns `io::Result` let mut file = match File::open(path) { - Err(why) => panic!("couldn't open {}: {}", display, why), + Err(why) => panic!("couldn't open {display}: {why}"), Ok(file) => file, }; // Read the file contents into a string, returns `io::Result` let mut content = String::new(); if let Err(why) = file.read_to_string(&mut content) { - panic!("couldn't read {}: {}", display, why); + panic!("couldn't read {display}: {why}"); } content @@ -43,8 +43,8 @@ fn parse_yaml_content(content: &str) -> Vec { } } Err(e) => { - eprintln!("Error parsing YAML document: {}", e); - panic!("Failed to parse YAML: {}", e); + eprintln!("Error parsing YAML document: {e}"); + panic!("Failed to parse YAML: {e}"); } } } @@ -66,8 +66,8 @@ fn parse_yaml_content(content: &str) -> Vec { } } Err(e) => { - eprintln!("Error parsing YAML content: {}", e); - panic!("Failed to parse YAML: {}", e); + eprintln!("Error parsing YAML content: {e}"); + panic!("Failed to parse YAML: {e}"); } } } @@ -100,7 +100,7 @@ pub fn read_yaml_doc_accessor<'a>(doc: &'a Value, accessor: Option<&str>) -> &'a } } } else { - doc.as_sequence().expect(&format!("Expected document to be a sequence, got: {:?}", doc)) + doc.as_sequence().unwrap_or_else(|| panic!("Expected document to be a sequence, got: {doc:?}")) } } @@ -109,7 +109,7 @@ pub fn read_file_as_yml_array(filepath: &str) -> Vec { let display = path.display(); let file = match File::open(path) { - Err(why) => panic!("couldn't open {}: {}", display, why), + Err(why) => panic!("couldn't open {display}: {why}"), Ok(file) => file, }; @@ -135,7 +135,7 @@ pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> Vec { // Open the path in read-only mode, returns `io::Result` let file = match File::open(path) { - Err(why) => panic!("couldn't open {}: {}", display, why), + Err(why) => panic!("couldn't open {display}: {why}"), Ok(file) => file, }; @@ -144,7 +144,7 @@ pub fn read_csv_file_as_yml(filepath: &str, quote: u8) -> Vec { let mut items = Vec::new(); let headers = match rdr.headers() { - Err(why) => panic!("error parsing header: {:?}", why), + Err(why) => panic!("error parsing header: {why:?}"), Ok(h) => h.clone(), }; diff --git a/src/writer.rs b/src/writer.rs index 8f79c11..ddde44e 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -7,11 +7,11 @@ pub fn write_file(filepath: &str, content: String) { let display = path.display(); let mut file = match File::create(path) { - Err(why) => panic!("couldn't create {}: {:?}", display, why), + Err(why) => panic!("couldn't create {display}: {why:?}"), Ok(file) => file, }; if let Err(why) = file.write_all(content.as_bytes()) { - panic!("couldn't write to {}: {:?}", display, why); + panic!("couldn't write to {display}: {why:?}"); } } From ea455a3c59d46446928d40c30041594063379b42 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 10:44:42 +0100 Subject: [PATCH 44/75] fmt --- src/actions/delay.rs | 2 +- src/actions/exec.rs | 2 +- src/actions/request.rs | 4 ++-- src/expandable/include.rs | 2 +- src/expandable/multi_csv_request.rs | 2 +- src/expandable/multi_file_request.rs | 2 +- src/expandable/multi_iter_request.rs | 2 +- src/reader.rs | 10 +++++----- src/tags.rs | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/actions/delay.rs b/src/actions/delay.rs index e5c372f..aa2d9c9 100644 --- a/src/actions/delay.rs +++ b/src/actions/delay.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use colored::*; -use tokio::time::sleep; use serde_yaml::Value; +use tokio::time::sleep; use crate::actions::extract; use crate::actions::Runnable; diff --git a/src/actions/exec.rs b/src/actions/exec.rs index bdfb89d..c3f25bf 100644 --- a/src/actions/exec.rs +++ b/src/actions/exec.rs @@ -1,8 +1,8 @@ use async_trait::async_trait; use colored::*; use serde_json::json; -use std::process::Command; use serde_yaml::Value; +use std::process::Command; use crate::actions::Runnable; use crate::actions::{extract, extract_optional}; diff --git a/src/actions/request.rs b/src/actions/request.rs index ee95989..09bcf42 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -7,9 +7,9 @@ use reqwest::{ header::{self, HeaderMap, HeaderName, HeaderValue}, ClientBuilder, Method, Response, }; +use serde_yaml::Value as YamlValue; use std::fmt::Write; use url::Url; -use serde_yaml::Value as YamlValue; use serde::{Deserialize, Serialize}; use serde_json::{json, Map, Value}; @@ -258,7 +258,7 @@ fn yaml_to_json(data: YamlValue) -> Value { json!(array) } YamlValue::Null => json!(null), - _ => panic!("Unknown Yaml node") + _ => panic!("Unknown Yaml node"), } } diff --git a/src/expandable/include.rs b/src/expandable/include.rs index 560ddc8..91576fb 100644 --- a/src/expandable/include.rs +++ b/src/expandable/include.rs @@ -1,5 +1,5 @@ -use std::path::Path; use serde_yaml::Value; +use std::path::Path; use crate::interpolator::INTERPOLATION_REGEX; diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index 414d560..35bb550 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -1,7 +1,7 @@ use rand::seq::SliceRandom; use rand::thread_rng; -use std::path::Path; use serde_yaml::Value; +use std::path::Path; use super::pick; use crate::actions::Request; diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 4f19452..86c8093 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -5,8 +5,8 @@ use crate::interpolator::INTERPOLATION_REGEX; use crate::reader; use rand::seq::SliceRandom; use rand::thread_rng; -use std::path::Path; use serde_yaml::Value; +use std::path::Path; pub fn is_that_you(item: &Value) -> bool { item.get("request").and_then(|v| v.as_mapping()).is_some() && (item.get("with_items_from_file").and_then(|v| v.as_str()).is_some() || item.get("with_items_from_file").and_then(|v| v.as_mapping()).is_some()) diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index 5457195..6a4aa18 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -2,7 +2,7 @@ use std::convert::TryInto; use rand::seq::SliceRandom; use rand::thread_rng; -use serde_yaml::{Value, Number}; +use serde_yaml::{Number, Value}; use crate::interpolator::INTERPOLATION_REGEX; diff --git a/src/reader.rs b/src/reader.rs index 58b5e97..934b934 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,7 +1,7 @@ +use serde_yaml::{Mapping, Value}; use std::fs::File; use std::io::{prelude::*, BufReader}; use std::path::Path; -use serde_yaml::{Value, Mapping}; pub fn read_file(filepath: &str) -> String { // Create a path to the desired file @@ -27,7 +27,7 @@ fn parse_yaml_content(content: &str) -> Vec { // serde_yaml doesn't support multiple documents natively, so we split by "---\n" and parse each let mut docs = Vec::new(); let trimmed_content = content.trim(); - + // Handle multi-document YAML (separated by "---\n") if trimmed_content.contains("\n---\n") || (trimmed_content.starts_with("---\n") && trimmed_content.matches("---\n").count() > 1) { let parts: Vec<&str> = trimmed_content.split("---\n").collect(); @@ -50,7 +50,7 @@ fn parse_yaml_content(content: &str) -> Vec { } } } - + // If no documents were found (empty file or no "---"), try parsing the whole content if docs.is_empty() { // Remove leading "---\n" if present for single-document files @@ -71,12 +71,12 @@ fn parse_yaml_content(content: &str) -> Vec { } } } - + // If still empty, return a single Null document to maintain compatibility if docs.is_empty() { docs.push(Value::Null); } - + docs } diff --git a/src/tags.rs b/src/tags.rs index 12bf6a7..7c28571 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -1,7 +1,7 @@ use crate::reader; use colored::*; -use std::collections::HashSet; use serde_yaml::Value; +use std::collections::HashSet; #[derive(Debug)] pub struct Tags<'a> { From 0937216ce240de347703813f4dd0a8d1026d9dce Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 11:04:36 +0100 Subject: [PATCH 45/75] Fix clippy warnings --- src/reader.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/reader.rs b/src/reader.rs index 934b934..b1aa1c5 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -54,11 +54,7 @@ fn parse_yaml_content(content: &str) -> Vec { // If no documents were found (empty file or no "---"), try parsing the whole content if docs.is_empty() { // Remove leading "---\n" if present for single-document files - let content_to_parse = if trimmed_content.starts_with("---\n") { - &trimmed_content[4..] - } else { - trimmed_content - }; + let content_to_parse = trimmed_content.strip_prefix("---\n").unwrap_or(trimmed_content); match serde_yaml::from_str::(content_to_parse.trim()) { Ok(doc) => { if !matches!(doc, Value::Null) { @@ -85,6 +81,7 @@ pub fn read_file_as_yml(filepath: &str) -> Vec { parse_yaml_content(&content) } +#[cfg(test)] pub fn read_file_as_yml_from_str(content: &str) -> Vec { parse_yaml_content(content) } From ab5d60c157f2b50470da475b49415fdb307d3a3a Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 11:06:23 +0100 Subject: [PATCH 46/75] Fix CI: replace deprecated actions-rs/tarpaulin with modern alternative --- .github/workflows/general.yml | 46 +++++++++++++---------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 4eb9f97..484ab65 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -10,42 +10,31 @@ jobs: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable with: - profile: minimal - toolchain: stable - override: true - - uses: actions-rs/cargo@v1 - with: - command: test + components: rustfmt, clippy + - run: cargo test fmt: name: Rustfmt runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable with: - toolchain: stable - override: true components: rustfmt - - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check + - run: cargo fmt --all -- --check clippy: name: Clippy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable with: - toolchain: stable - override: true components: clippy - - uses: actions-rs/clippy-check@v1 + - uses: clippy-rs/clippy-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} args: -- -D warnings @@ -55,16 +44,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install stable toolchain - uses: actions-rs/toolchain@v1 + uses: dtolnay/rust-toolchain@stable with: - toolchain: stable - override: true + components: rustfmt, clippy + + - name: Install cargo-tarpaulin + uses: taiki-e/install-action@cargo-tarpaulin - name: Run cargo-tarpaulin - uses: actions-rs/tarpaulin@v0.1.3 - with: - version: '0.15.0' - args: '--ignore-tests' + run: cargo tarpaulin --out Xml --ignore-tests From d69bd496e5cc28db9cab282ff16862ebd5fa1f9e Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 11:07:29 +0100 Subject: [PATCH 47/75] Fix clippy action: use direct cargo clippy command --- .github/workflows/general.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 484ab65..5ac5f64 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -34,10 +34,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: components: clippy - - uses: clippy-rs/clippy-action@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - args: -- -D warnings + - run: cargo clippy -- -D warnings coverage: name: Code coverage From e5c70463dd27a1d5eac7682fcb70990b069946b1 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Mon, 21 Oct 2024 02:49:26 +0000 Subject: [PATCH 48/75] Support file and hex request body types --- Cargo.lock | 12 ++++++++-- Cargo.toml | 2 ++ README.md | 15 +++++++++++++ SYNTAX.md | 12 ++++++++++ src/actions/request.rs | 51 +++++++++++++++++++++++++++++------------- 5 files changed, 74 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c685e5..af091b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -243,8 +243,10 @@ dependencies = [ "csv", "futures", "hdrhistogram", + "hex", "lazy_static", "linked-hash-map", + "nom", "num_cpus", "openssl-sys", "rand", @@ -481,6 +483,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hostname" version = "0.3.1" @@ -759,9 +767,9 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", diff --git a/Cargo.toml b/Cargo.toml index 7263a5c..cad0400 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,8 @@ hdrhistogram = "7.4.0" # Add openssl-sys as a direct dependency so it can be cross compiled to # x86_64-unknown-linux-musl using the "vendored" feature below openssl-sys = "0.9.66" +nom = "7.1.3" +hex = "0.4.3" [features] # Force openssl-sys to statically link in the openssl library. Necessary when diff --git a/README.md b/README.md index 1b5b2f2..8ad7444 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,21 @@ plan: method: POST body: foo=bar&arg={{ bar }} + + - name: Support for hex-encoded request body + request: + url: /api/blob + method: POST + body: + hex: 65 78 61 6D 70 6C 65 + + - name: Support request body loaded from a file + request: + url: /api/blob + method: POST + body: + file: ./image.png + - name: Login user request: url: /login?user=example&password=3x4mpl3 diff --git a/SYNTAX.md b/SYNTAX.md index 353d645..99549ef 100644 --- a/SYNTAX.md +++ b/SYNTAX.md @@ -61,6 +61,18 @@ Second, it can be a hash with the following properties: - `file_name`: csv file containing the records to be used as items - `quote_char`: character to use as quote in csv parsing. Defaults to `"\""`, but can be set to `"\'"`. If your csv file has quoted strings that contain commas and that causes parse errors, make sure this value is set correctly. +#### body item properties + +The `body` property can be specified in different ways depending on the type of data you want to send in the request. Here are three variants: + +1. `body: "string with {{ templates }}"` + - This variant allows you to use a string with templates that can be interpolated with values from the context. + +2. `body: { hex: 65 78 61 6D 70 6C 65 }` + - This variant allows you to send a raw byte string value in the request body. + +3. `body: { file: path/to/file.txt }` + - This variant allows you to specify a file path, and the content of the file will be used as the request body. #### tags item properties diff --git a/src/actions/request.rs b/src/actions/request.rs index b7bb270..3a52284 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -1,28 +1,35 @@ use std::collections::HashMap; use std::time::{Duration, Instant}; +use crate::actions::{extract, extract_optional}; +use crate::benchmark::{Context, Pool, Reports}; +use crate::config::Config; +use crate::interpolator; use async_trait::async_trait; use colored::Colorize; +use hex; use reqwest::{ header::{self, HeaderMap, HeaderName, HeaderValue}, ClientBuilder, Method, Response, }; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Map, Value}; use std::fmt::Write; +use std::fs::File; +use std::io::Read; use url::Url; use yaml_rust::Yaml; -use serde::{Deserialize, Serialize}; -use serde_json::{json, Map, Value}; - -use crate::actions::{extract, extract_optional}; -use crate::benchmark::{Context, Pool, Reports}; -use crate::config::Config; -use crate::interpolator; - use crate::actions::{Report, Runnable}; static USER_AGENT: &str = "drill"; +#[derive(Clone)] +pub enum Body { + Template(String), + Binary(Vec), +} + #[derive(Clone)] #[allow(dead_code)] pub struct Request { @@ -31,7 +38,7 @@ pub struct Request { time: f64, method: String, headers: HashMap, - pub body: Option, + pub body: Option, pub with_item: Option, pub index: Option, pub assign: Option, @@ -62,7 +69,18 @@ impl Request { let body_verbs = vec!["POST", "PATCH", "PUT"]; let body = if body_verbs.contains(&method.as_str()) { - Some(extract(&item["request"], "body")) + if let Some(body) = item["request"]["body"].as_str() { + Some(Body::Template(body.to_string())) + } else if let Some(file_path) = item["request"]["body"]["file"].as_str() { + let mut file = File::open(file_path).expect("Unable to open file"); + let mut buffer = Vec::new(); + file.read_to_end(&mut buffer).expect("Unable to read file"); + Some(Body::Binary(buffer)) + } else if let Some(hex_str) = item["request"]["body"]["hex"].as_str() { + Some(Body::Binary(hex::decode(hex_str).expect("Invalid hex string"))) + } else { + panic!("{} Body must be string, file or hex!!", "WARNING!".yellow().bold()); + } } else { None }; @@ -156,12 +174,13 @@ impl Request { let mut pool2 = pool.lock().unwrap(); let client = pool2.entry(domain).or_insert_with(|| ClientBuilder::default().danger_accept_invalid_certs(config.no_check_certificate).build().unwrap()); - let request = if let Some(body) = self.body.as_ref() { - interpolated_body = uninterpolator.get_or_insert(interpolator::Interpolator::new(context)).resolve(body, !config.relaxed_interpolations); - - client.request(method, interpolated_base_url.as_str()).body(interpolated_body) - } else { - client.request(method, interpolated_base_url.as_str()) + let request = match self.body.as_ref() { + Some(Body::Template(template_body)) => { + interpolated_body = uninterpolator.get_or_insert(interpolator::Interpolator::new(context)).resolve(template_body, !config.relaxed_interpolations); + client.request(method, interpolated_base_url.as_str()).body(interpolated_body) + } + Some(Body::Binary(binary_body)) => client.request(method, interpolated_base_url.as_str()).body(binary_body.clone()), + None => client.request(method, interpolated_base_url.as_str()), }; (client.clone(), request) From 08b824b20cb644c0e7c630b6c83e020e62321236 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Mon, 21 Oct 2024 02:56:41 +0000 Subject: [PATCH 49/75] fixup! Support file and hex request body types --- Cargo.lock | 1039 +++++++++++++++++++++++----------------- Cargo.toml | 3 +- README.md | 1 - src/actions/request.rs | 14 +- 4 files changed, 621 insertions(+), 436 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af091b0..3add013 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,16 +3,25 @@ version = 3 [[package]] -name = "adler" -version = "1.0.2" +name = "addr2line" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -28,9 +37,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.60" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d1d8ab452a3936018a687b20e6f7cf5363d713b732b8884001317b0e48aa3" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -43,22 +52,37 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" @@ -67,40 +91,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bstr" -version = "0.2.17" +name = "bitflags" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata", - "serde", -] +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.3.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.0.78" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -116,7 +137,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim", "textwrap", "unicode-width", @@ -125,20 +146,19 @@ dependencies = [ [[package]] name = "colored" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "atty", "lazy_static", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "cookie" -version = "0.16.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" dependencies = [ "percent-encoding", "time", @@ -147,15 +167,16 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.16.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4b6aa369f41f5faa04bb80c9b1f4216ea81646ed6124d76ba5c49a7aafd9cd" +checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6" dependencies = [ "cookie", - "idna 0.2.3", + "idna 0.3.0", "log", "publicsuffix", "serde", + "serde_derive", "serde_json", "time", "url", @@ -163,9 +184,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -173,65 +194,69 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "csv" -version = "1.1.6" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ - "bstr", "csv-core", - "itoa 0.4.8", + "itoa", "ryu", "serde", ] [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] [[package]] name = "drill" @@ -246,7 +271,6 @@ dependencies = [ "hex", "lazy_static", "linked-hash-map", - "nom", "num_cpus", "openssl-sys", "rand", @@ -261,18 +285,18 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ "heck", "proc-macro2", @@ -281,19 +305,32 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "1.8.0" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ - "instant", + "libc", + "windows-sys 0.52.0", ] +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -322,18 +359,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -346,9 +383,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -356,15 +393,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -373,15 +410,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -390,21 +427,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -420,20 +457,26 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", "wasi", ] +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + [[package]] name = "h2" -version = "0.3.15" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -450,15 +493,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "hdrhistogram" -version = "7.5.2" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ "base64", "byteorder", @@ -470,9 +513,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -483,12 +526,63 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-proto" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "hostname" version = "0.3.1" @@ -502,20 +596,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.5", + "itoa", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -524,21 +618,21 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -549,7 +643,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.5", + "itoa", "pin-project-lite", "socket2", "tokio", @@ -573,94 +667,88 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] -name = "indexmap" -version = "1.9.2" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "autocfg", - "hashbrown", + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ - "cfg-if", + "equivalent", + "hashbrown", ] [[package]] name = "ipconfig" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ "socket2", "widestring", - "winapi", + "windows-sys 0.48.0", "winreg", ] [[package]] name = "ipnet" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" - -[[package]] -name = "itoa" -version = "0.4.8" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.138" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "linked-hash-map" @@ -668,11 +756,17 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -680,12 +774,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru-cache" @@ -702,23 +793,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -728,32 +813,31 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.5" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", - "log", "wasi", - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -775,38 +859,53 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.14.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.16.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.44" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d971fd5722fec23977260f6e81aa67d2f22cadbdc2aa049f1022d9a3be1566" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -817,9 +916,9 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", @@ -834,20 +933,19 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "111.24.0+1.1.1s" +version = "300.3.2+3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd" +checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.79" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5454462c0eced1e97f2ec09036abc8da362e66802f66fd20f86854d9d8cbcbc4" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ - "autocfg", "cc", "libc", "openssl-src", @@ -857,9 +955,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -867,28 +965,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.42.0", + "windows-targets 0.52.6", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -898,27 +996,30 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] -name = "ppv-lite86" -version = "0.2.17" +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "proc-macro-hack" -version = "0.5.19" +name = "ppv-lite86" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.48" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d89e5dba24725ae5678020bf8f1357a9aa7ff10736b551adbcd3f8d17d766f" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] @@ -947,9 +1048,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.22" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d0f47a940e895261e77dc200d5eadfc6ef644c179c6f5edfc105e3a2292c8" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -986,50 +1087,47 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.7.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", + "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.11.13" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64", "bytes", @@ -1039,6 +1137,7 @@ dependencies = [ "futures-core", "futures-util", "h2", + "hickory-resolver", "http", "http-body", "hyper", @@ -1051,14 +1150,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "proc-macro-hack", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", "tower-service", - "trust-dns-resolver", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -1076,35 +1176,62 @@ dependencies = [ "quick-error", ] +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "lazy_static", - "windows-sys 0.36.1", + "windows-sys 0.59.0", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.7.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -1113,9 +1240,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -1123,18 +1250,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.151" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.151" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1143,11 +1270,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.90" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8778cc0b528968fe72abec38b5db5a20a70d148116cd9325d2bc5f5180ca3faf" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ - "itoa 1.0.5", + "itoa", + "memchr", "ryu", "serde", ] @@ -1159,34 +1287,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.5", + "itoa", "ryu", "serde", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "slab" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.4.7" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -1197,27 +1331,53 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.106" +version = "2.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ee3a69cd2c7e06684677e5629b3878b253af05e4714964204279c6bc02cf0b" +checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" -version = "3.3.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -1231,18 +1391,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", @@ -1251,11 +1411,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ - "itoa 1.0.5", + "deranged", + "itoa", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -1263,56 +1426,55 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.23.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", - "num_cpus", "pin-project-lite", "socket2", - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-native-tls" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", @@ -1320,31 +1482,29 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.4" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1352,9 +1512,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -1363,99 +1523,54 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] -[[package]] -name = "trust-dns-proto" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "rand", - "smallvec", - "thiserror", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" -dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "lru-cache", - "parking_lot", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "tracing", - "trust-dns-proto", -] - [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "url" -version = "2.3.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna 0.5.0", "percent-encoding", ] @@ -1473,17 +1588,16 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1495,19 +1609,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -1520,9 +1635,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -1532,9 +1647,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1542,9 +1657,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -1555,15 +1670,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -1571,9 +1686,9 @@ dependencies = [ [[package]] name = "widestring" -version = "0.5.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -1599,111 +1714,160 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] @@ -1714,3 +1878,24 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index cad0400..de0b2d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,12 +26,11 @@ lazy_static = "1.4.0" num_cpus = "1.13.0" rand = "0.8.5" hdrhistogram = "7.4.0" +hex = "0.4.3" # Add openssl-sys as a direct dependency so it can be cross compiled to # x86_64-unknown-linux-musl using the "vendored" feature below openssl-sys = "0.9.66" -nom = "7.1.3" -hex = "0.4.3" [features] # Force openssl-sys to statically link in the openssl library. Necessary when diff --git a/README.md b/README.md index 8ad7444..cffbb7a 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,6 @@ plan: method: POST body: foo=bar&arg={{ bar }} - - name: Support for hex-encoded request body request: url: /api/blob diff --git a/src/actions/request.rs b/src/actions/request.rs index 3a52284..5820a9e 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -1,10 +1,6 @@ use std::collections::HashMap; use std::time::{Duration, Instant}; -use crate::actions::{extract, extract_optional}; -use crate::benchmark::{Context, Pool, Reports}; -use crate::config::Config; -use crate::interpolator; use async_trait::async_trait; use colored::Colorize; use hex; @@ -12,14 +8,20 @@ use reqwest::{ header::{self, HeaderMap, HeaderName, HeaderValue}, ClientBuilder, Method, Response, }; -use serde::{Deserialize, Serialize}; -use serde_json::{json, Map, Value}; use std::fmt::Write; use std::fs::File; use std::io::Read; use url::Url; use yaml_rust::Yaml; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Map, Value}; + +use crate::actions::{extract, extract_optional}; +use crate::benchmark::{Context, Pool, Reports}; +use crate::config::Config; +use crate::interpolator; + use crate::actions::{Report, Runnable}; static USER_AGENT: &str = "drill"; From 5402c1d26d669f30711b38c33c1a94612602cd7c Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Mon, 21 Oct 2024 05:01:27 +0200 Subject: [PATCH 50/75] Update SYNTAX.md --- SYNTAX.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SYNTAX.md b/SYNTAX.md index 99549ef..398092a 100644 --- a/SYNTAX.md +++ b/SYNTAX.md @@ -61,6 +61,7 @@ Second, it can be a hash with the following properties: - `file_name`: csv file containing the records to be used as items - `quote_char`: character to use as quote in csv parsing. Defaults to `"\""`, but can be set to `"\'"`. If your csv file has quoted strings that contain commas and that causes parse errors, make sure this value is set correctly. + #### body item properties The `body` property can be specified in different ways depending on the type of data you want to send in the request. Here are three variants: From 895a3bae193b87538a995e44ebe149176551f2a5 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 15:54:27 +0100 Subject: [PATCH 51/75] Add tests for body/hex body/file --- Cargo.lock | 1 + Cargo.toml | 3 + src/actions/request.rs | 313 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 317 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 4d53be1..0f0479b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -279,6 +279,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", + "tempfile", "tokio", "url", ] diff --git a/Cargo.toml b/Cargo.toml index b78413d..d8ea103 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,3 +36,6 @@ openssl-sys = "0.9.66" # Force openssl-sys to statically link in the openssl library. Necessary when # cross compiling to x86_64-unknown-linux-musl. vendored = ["openssl-sys/vendored"] + +[dev-dependencies] +tempfile = "3.8" diff --git a/src/actions/request.rs b/src/actions/request.rs index f3963bb..1071a49 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -389,3 +389,316 @@ fn log_response(log_message_response: String, body: &Option) { } println!("{message}"); } + +#[cfg(test)] +mod tests { + use super::*; + use serde_yaml::Value as YamlValue; + use std::io::Write; + use tempfile::NamedTempFile; + + fn create_yaml_request_with_string_body(body_content: &str) -> YamlValue { + let yaml_str = format!( + r#" +name: test_request +request: + url: http://example.com + method: POST + body: "{}" +"#, + body_content + ); + serde_yaml::from_str(&yaml_str).unwrap() + } + + fn create_yaml_request_with_hex_body(hex_content: &str) -> YamlValue { + let yaml_str = format!( + r#" +name: test_request +request: + url: http://example.com + method: POST + body: + hex: "{}" +"#, + hex_content + ); + serde_yaml::from_str(&yaml_str).unwrap() + } + + fn create_yaml_request_with_file_body(file_path: &str) -> YamlValue { + let yaml_str = format!( + r#" +name: test_request +request: + url: http://example.com + method: POST + body: + file: "{}" +"#, + file_path + ); + serde_yaml::from_str(&yaml_str).unwrap() + } + + #[test] + fn test_body_template_string() { + let yaml = create_yaml_request_with_string_body("Hello, World!"); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Template(content)) => { + assert_eq!(content, "Hello, World!"); + } + _ => panic!("Expected Body::Template"), + } + } + + #[test] + fn test_body_hex() { + // "Hello" in hex is "48656c6c6f" + let yaml = create_yaml_request_with_hex_body("48656c6c6f"); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, b"Hello"); + } + _ => panic!("Expected Body::Binary"), + } + } + + #[test] + fn test_body_hex_empty() { + let yaml = create_yaml_request_with_hex_body(""); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, b""); + } + _ => panic!("Expected Body::Binary with empty data"), + } + } + + #[test] + fn test_body_hex_complex() { + // "Hello, World!" in hex + let yaml = create_yaml_request_with_hex_body("48656c6c6f2c20576f726c6421"); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, b"Hello, World!"); + } + _ => panic!("Expected Body::Binary"), + } + } + + #[test] + fn test_body_file() { + // Create a temporary file with test content + let mut temp_file = NamedTempFile::new().unwrap(); + let test_content = b"Test file content"; + temp_file.write_all(test_content).unwrap(); + temp_file.flush().unwrap(); + + let file_path = temp_file.path().to_str().unwrap(); + let yaml = create_yaml_request_with_file_body(file_path); + + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, test_content); + } + _ => panic!("Expected Body::Binary"), + } + } + + #[test] + fn test_body_file_empty() { + // Create an empty temporary file + let temp_file = NamedTempFile::new().unwrap(); + let file_path = temp_file.path().to_str().unwrap(); + + let yaml = create_yaml_request_with_file_body(file_path); + + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, b""); + } + _ => panic!("Expected Body::Binary with empty data"), + } + } + + #[test] + fn test_body_file_binary_data() { + // Create a file with binary data (not UTF-8) + let mut temp_file = NamedTempFile::new().unwrap(); + let binary_content = vec![0x00, 0x01, 0x02, 0xFF, 0xFE, 0xFD]; + temp_file.write_all(&binary_content).unwrap(); + temp_file.flush().unwrap(); + + let file_path = temp_file.path().to_str().unwrap(); + let yaml = create_yaml_request_with_file_body(file_path); + + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, binary_content); + } + _ => panic!("Expected Body::Binary"), + } + } + + #[test] + fn test_body_file_large_content() { + // Create a file with larger content + let mut temp_file = NamedTempFile::new().unwrap(); + let large_content: Vec = (0..10000).map(|i| (i % 256) as u8).collect(); + temp_file.write_all(&large_content).unwrap(); + temp_file.flush().unwrap(); + + let file_path = temp_file.path().to_str().unwrap(); + let yaml = create_yaml_request_with_file_body(file_path); + + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data.len(), 10000); + assert_eq!(data, large_content); + } + _ => panic!("Expected Body::Binary"), + } + } + + #[test] + fn test_body_none_for_get() { + let yaml_str = r#" +name: test_request +request: + url: http://example.com + method: GET +"#; + let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); + let request = Request::new(&yaml, None, None); + + assert!(request.body.is_none()); + } + + #[test] + fn test_body_none_for_delete() { + let yaml_str = r#" +name: test_request +request: + url: http://example.com + method: DELETE +"#; + let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); + let request = Request::new(&yaml, None, None); + + assert!(request.body.is_none()); + } + + #[test] + fn test_body_hex_uppercase() { + // Test that hex decoding works with uppercase letters + let yaml = create_yaml_request_with_hex_body("48656C6C6F"); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, b"Hello"); + } + _ => panic!("Expected Body::Binary"), + } + } + + #[test] + fn test_body_hex_mixed_case() { + // Test that hex decoding works with mixed case + let yaml = create_yaml_request_with_hex_body("48656c6C6F"); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, b"Hello"); + } + _ => panic!("Expected Body::Binary"), + } + } + + #[test] + #[should_panic(expected = "Invalid hex string")] + fn test_body_hex_invalid() { + let yaml = create_yaml_request_with_hex_body("InvalidHexString!"); + Request::new(&yaml, None, None); + } + + #[test] + #[should_panic(expected = "Unable to open file")] + fn test_body_file_not_found() { + let yaml = create_yaml_request_with_file_body("/nonexistent/path/to/file.txt"); + Request::new(&yaml, None, None); + } + + #[test] + fn test_body_priority_string_over_hex() { + // When body is a string, it should be treated as Template, not hex + let yaml = create_yaml_request_with_string_body("48656c6c6f"); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Template(content)) => { + assert_eq!(content, "48656c6c6f"); + } + _ => panic!("Expected Body::Template when body is a string"), + } + } + + #[test] + fn test_body_put_method() { + let yaml_str = r#" +name: test_request +request: + url: http://example.com + method: PUT + body: "PUT body content" +"#; + let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Template(content)) => { + assert_eq!(content, "PUT body content"); + } + _ => panic!("Expected Body::Template"), + } + } + + #[test] + fn test_body_patch_method() { + let yaml_str = r#" +name: test_request +request: + url: http://example.com + method: PATCH + body: + hex: "5061746368" +"#; + let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); + let request = Request::new(&yaml, None, None); + + match request.body { + Some(Body::Binary(data)) => { + assert_eq!(data, b"Patch"); + } + _ => panic!("Expected Body::Binary"), + } + } +} From 719a75bbad8e820eb638cfff7720c016cee56c96 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 15:55:35 +0100 Subject: [PATCH 52/75] Format --- src/actions/request.rs | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/actions/request.rs b/src/actions/request.rs index 1071a49..59ed898 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -445,7 +445,7 @@ request: fn test_body_template_string() { let yaml = create_yaml_request_with_string_body("Hello, World!"); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Template(content)) => { assert_eq!(content, "Hello, World!"); @@ -459,7 +459,7 @@ request: // "Hello" in hex is "48656c6c6f" let yaml = create_yaml_request_with_hex_body("48656c6c6f"); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, b"Hello"); @@ -472,7 +472,7 @@ request: fn test_body_hex_empty() { let yaml = create_yaml_request_with_hex_body(""); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, b""); @@ -486,7 +486,7 @@ request: // "Hello, World!" in hex let yaml = create_yaml_request_with_hex_body("48656c6c6f2c20576f726c6421"); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, b"Hello, World!"); @@ -502,12 +502,12 @@ request: let test_content = b"Test file content"; temp_file.write_all(test_content).unwrap(); temp_file.flush().unwrap(); - + let file_path = temp_file.path().to_str().unwrap(); let yaml = create_yaml_request_with_file_body(file_path); - + let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, test_content); @@ -521,11 +521,11 @@ request: // Create an empty temporary file let temp_file = NamedTempFile::new().unwrap(); let file_path = temp_file.path().to_str().unwrap(); - + let yaml = create_yaml_request_with_file_body(file_path); - + let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, b""); @@ -541,12 +541,12 @@ request: let binary_content = vec![0x00, 0x01, 0x02, 0xFF, 0xFE, 0xFD]; temp_file.write_all(&binary_content).unwrap(); temp_file.flush().unwrap(); - + let file_path = temp_file.path().to_str().unwrap(); let yaml = create_yaml_request_with_file_body(file_path); - + let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, binary_content); @@ -562,12 +562,12 @@ request: let large_content: Vec = (0..10000).map(|i| (i % 256) as u8).collect(); temp_file.write_all(&large_content).unwrap(); temp_file.flush().unwrap(); - + let file_path = temp_file.path().to_str().unwrap(); let yaml = create_yaml_request_with_file_body(file_path); - + let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data.len(), 10000); @@ -587,7 +587,7 @@ request: "#; let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); let request = Request::new(&yaml, None, None); - + assert!(request.body.is_none()); } @@ -601,7 +601,7 @@ request: "#; let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); let request = Request::new(&yaml, None, None); - + assert!(request.body.is_none()); } @@ -610,7 +610,7 @@ request: // Test that hex decoding works with uppercase letters let yaml = create_yaml_request_with_hex_body("48656C6C6F"); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, b"Hello"); @@ -624,7 +624,7 @@ request: // Test that hex decoding works with mixed case let yaml = create_yaml_request_with_hex_body("48656c6C6F"); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, b"Hello"); @@ -652,7 +652,7 @@ request: // When body is a string, it should be treated as Template, not hex let yaml = create_yaml_request_with_string_body("48656c6c6f"); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Template(content)) => { assert_eq!(content, "48656c6c6f"); @@ -672,7 +672,7 @@ request: "#; let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Template(content)) => { assert_eq!(content, "PUT body content"); @@ -693,7 +693,7 @@ request: "#; let yaml: YamlValue = serde_yaml::from_str(yaml_str).unwrap(); let request = Request::new(&yaml, None, None); - + match request.body { Some(Body::Binary(data)) => { assert_eq!(data, b"Patch"); From 7abf85b344e0dd48dbff1ff208aa2f74ab103b30 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 28 Dec 2025 09:56:09 +0100 Subject: [PATCH 53/75] More fixes --- src/interpolator.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/interpolator.rs b/src/interpolator.rs index f9f6ddd..04161c9 100644 --- a/src/interpolator.rs +++ b/src/interpolator.rs @@ -171,7 +171,8 @@ mod tests { #[test] fn interpolates_environment_variables() { - std::env::set_var("FOO", "BAR"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("FOO", "BAR") }; let context: Context = Context::new(); let interpolator = Interpolator::new(&context); From f7ec7e8a863e7d0e2679a0c93d15496e8e57bed3 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 29 Dec 2025 16:27:11 +0100 Subject: [PATCH 54/75] Remove clppy warning --- src/actions/request.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/actions/request.rs b/src/actions/request.rs index 59ed898..7200990 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -3,7 +3,6 @@ use std::time::{Duration, Instant}; use async_trait::async_trait; use colored::Colorize; -use hex; use reqwest::{ header::{self, HeaderMap, HeaderName, HeaderValue}, ClientBuilder, Method, Response, From 6ac18403f33b2e7d09ab06e03a986cbca3d16651 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:31:05 +0000 Subject: [PATCH 55/75] Bump hashbrown from 0.15.0 to 0.15.5 Bumps [hashbrown](https://github.com/rust-lang/hashbrown) from 0.15.0 to 0.15.5. - [Release notes](https://github.com/rust-lang/hashbrown/releases) - [Changelog](https://github.com/rust-lang/hashbrown/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/hashbrown/compare/v0.15.0...v0.15.5) --- updated-dependencies: - dependency-name: hashbrown dependency-version: 0.15.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f0479b..b05d03b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -494,9 +494,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "hdrhistogram" From 0ca89a71d87d0f61b0ed1d64e21bc9a870a73d3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:30:33 +0000 Subject: [PATCH 56/75] Bump hickory-proto from 0.24.1 to 0.24.4 Bumps [hickory-proto](https://github.com/hickory-dns/hickory-dns) from 0.24.1 to 0.24.4. - [Release notes](https://github.com/hickory-dns/hickory-dns/releases) - [Changelog](https://github.com/hickory-dns/hickory-dns/blob/main/CHANGELOG.md) - [Commits](https://github.com/hickory-dns/hickory-dns/compare/v0.24.1...v0.24.4) --- updated-dependencies: - dependency-name: hickory-proto dependency-version: 0.24.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Cargo.lock | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 243 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b05d03b..039705d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -258,6 +258,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "drill" version = "0.8.3" @@ -541,9 +552,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hickory-proto" -version = "0.24.1" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" dependencies = [ "async-trait", "cfg-if", @@ -552,7 +563,7 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna 0.4.0", + "idna 1.1.0", "ipnet", "once_cell", "rand", @@ -666,6 +677,87 @@ dependencies = [ "tokio-native-tls", ] +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "idna" version = "0.3.0" @@ -678,9 +770,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -688,12 +780,23 @@ dependencies = [ [[package]] name = "idna" -version = "0.5.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -763,6 +866,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + [[package]] name = "lock_api" version = "0.4.12" @@ -1001,6 +1110,15 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1337,6 +1455,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "strsim" version = "0.8.0" @@ -1360,6 +1484,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -1454,6 +1589,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -1594,6 +1739,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "vcpkg" version = "0.2.15" @@ -1890,6 +2041,35 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -1910,3 +2090,57 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] From dbdc13f24598bc5f83852d2fff8f916429699cbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:36:05 +0000 Subject: [PATCH 57/75] Bump tokio from 1.40.0 to 1.43.1 Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.40.0 to 1.43.1. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.40.0...tokio-1.43.1) --- updated-dependencies: - dependency-name: tokio dependency-version: 1.43.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 039705d..5fb54b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -850,9 +850,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "linked-hash-map" @@ -1616,9 +1616,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" dependencies = [ "backtrace", "bytes", diff --git a/Cargo.toml b/Cargo.toml index d8ea103..1951ecf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ serde_json = "1.0.39" serde_yaml = "0.9" url = "2.1.1" linked-hash-map = "0.5.3" -tokio = { version = "1.19.2", features = ["time", "net"] } +tokio = { version = "1.43.1", features = ["time", "net"] } reqwest = { version = "0.11.11", features = ["cookies", "trust-dns"] } async-trait = "0.1.30" futures = "0.3.5" From 7addd7d4dce50ec6b484f354b4b83451ff7a9555 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:35:55 +0000 Subject: [PATCH 58/75] Bump cookie, cookie-parser, express and express-session Bumps [cookie](https://github.com/jshttp/cookie) to 0.7.2 and updates ancestor dependencies [cookie](https://github.com/jshttp/cookie), [cookie-parser](https://github.com/expressjs/cookie-parser), [express](https://github.com/expressjs/express) and [express-session](https://github.com/expressjs/session). These dependencies need to be updated together. Updates `cookie` from 0.3.1 to 0.7.2 - [Release notes](https://github.com/jshttp/cookie/releases) - [Commits](https://github.com/jshttp/cookie/compare/v0.3.1...v0.7.2) Updates `cookie-parser` from 1.4.3 to 1.4.7 - [Release notes](https://github.com/expressjs/cookie-parser/releases) - [Changelog](https://github.com/expressjs/cookie-parser/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/cookie-parser/compare/1.4.3...1.4.7) Updates `express` from 4.18.2 to 4.22.1 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...v4.22.1) Updates `express-session` from 1.15.6 to 1.18.2 - [Release notes](https://github.com/expressjs/session/releases) - [Changelog](https://github.com/expressjs/session/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/session/compare/v1.15.6...v1.18.2) --- updated-dependencies: - dependency-name: cookie dependency-version: 0.7.2 dependency-type: indirect - dependency-name: cookie-parser dependency-version: 1.4.7 dependency-type: direct:production - dependency-name: express dependency-version: 4.22.1 dependency-type: direct:production - dependency-name: express-session dependency-version: 1.18.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- example/server/package-lock.json | 961 +++++++++++++++++++++---------- 1 file changed, 655 insertions(+), 306 deletions(-) diff --git a/example/server/package-lock.json b/example/server/package-lock.json index 2ff8034..1350e89 100644 --- a/example/server/package-lock.json +++ b/example/server/package-lock.json @@ -1,530 +1,879 @@ { "name": "server", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "accepts": { + "packages": { + "": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cookie-parser": "^1.4.3", + "express": "^4.16.2", + "express-session": "^1.15.6" + } + }, + "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { + "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "array-flatten": { + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "bytes": { + "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "call-bind": { + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "content-disposition": { + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { + "dependencies": { "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", - "requires": { - "cookie": "0.3.1", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "crc": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" - }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "ee-first": { + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "escape-html": { + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, - "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - } + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "express-session": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", - "integrity": "sha1-R7QWDIj0KrcP6KUI4xy/92dXqwo=", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "crc": "3.4.4", + "node_modules/express-session": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.7", "debug": "2.6.9", - "depd": "~1.1.1", - "on-headers": "~1.0.1", - "parseurl": "~1.3.2", - "uid-safe": "~2.1.5", - "utils-merge": "1.0.1" + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - } + "engines": { + "node": ">= 0.8" } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { + "license": "MIT", + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { + "license": "MIT", + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "random-bytes": { + "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "engines": { + "node": ">= 0.8" + } }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "engines": { + "node": ">= 0.8.0" } }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "~0.19.1" }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - } + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { + "license": "MIT", + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "uid-safe": { + "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", "integrity": "sha1-Kz1cckDo/C5Y+Komnl7knAhXvTo=", - "requires": { + "dependencies": { "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } } } } From 86d9a7fd010ee602770a4aa22df86caf513c1598 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:36:24 +0000 Subject: [PATCH 59/75] Bump crossbeam-channel from 0.5.13 to 0.5.15 Bumps [crossbeam-channel](https://github.com/crossbeam-rs/crossbeam) from 0.5.13 to 0.5.15. - [Release notes](https://github.com/crossbeam-rs/crossbeam/releases) - [Changelog](https://github.com/crossbeam-rs/crossbeam/blob/master/CHANGELOG.md) - [Commits](https://github.com/crossbeam-rs/crossbeam/compare/crossbeam-channel-0.5.13...crossbeam-channel-0.5.15) --- updated-dependencies: - dependency-name: crossbeam-channel dependency-version: 0.5.15 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5fb54b2..ad4cba4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -209,9 +209,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] From da03fd6e915c0b3659af1087f68b7a8b1f7aeac6 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 29 Dec 2025 20:55:04 +0100 Subject: [PATCH 60/75] Update more deps + audit --- Cargo.lock | 727 +++++++++++++++++++++++++---------------------- Cargo.toml | 2 +- src/benchmark.rs | 2 +- 3 files changed, 389 insertions(+), 342 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad4cba4..2b6ec38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,6 +46,12 @@ dependencies = [ "syn", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -84,6 +90,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bitflags" version = "1.3.2" @@ -116,10 +128,11 @@ checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -156,9 +169,9 @@ dependencies = [ [[package]] name = "cookie" -version = "0.17.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" dependencies = [ "percent-encoding", "time", @@ -167,12 +180,13 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.20.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6" +checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" dependencies = [ "cookie", - "idna 0.3.0", + "document-features", + "idna", "log", "publicsuffix", "serde", @@ -243,12 +257,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - [[package]] name = "deranged" version = "0.3.11" @@ -269,6 +277,15 @@ dependencies = [ "syn", ] +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + [[package]] name = "drill" version = "0.8.3" @@ -304,18 +321,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -338,6 +343,12 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +[[package]] +name = "find-msvc-tools" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" + [[package]] name = "flate2" version = "1.0.34" @@ -486,15 +497,15 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" -version = "0.3.26" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap", "slab", @@ -515,7 +526,7 @@ version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64", + "base64 0.21.7", "byteorder", "crossbeam-channel", "flate2", @@ -523,12 +534,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - [[package]] name = "hermit-abi" version = "0.1.19" @@ -551,80 +556,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "hickory-proto" -version = "0.24.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 1.1.0", - "ipnet", - "once_cell", - "rand", - "thiserror", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "hickory-resolver" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "lru-cache", - "once_cell", - "parking_lot", - "rand", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "hostname" -version = "0.3.1" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "libc", - "match_cfg", - "winapi", + "bytes", + "itoa", ] [[package]] -name = "http" -version = "0.2.12" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "fnv", - "itoa", + "http", ] [[package]] -name = "http-body" -version = "0.4.6" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", + "futures-core", "http", + "http-body", "pin-project-lite", ] @@ -634,47 +594,84 @@ version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.31" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", "futures-core", - "futures-util", "h2", "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", - "socket2", + "pin-utils", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", + "http-body-util", "hyper", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.1", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", ] [[package]] @@ -758,26 +755,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "1.1.0" @@ -809,24 +786,22 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "ipconfig" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" -dependencies = [ - "socket2", - "widestring", - "windows-sys 0.48.0", - "winreg", -] - [[package]] name = "ipnet" version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "itoa" version = "1.0.11" @@ -835,10 +810,11 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -873,14 +849,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] -name = "lock_api" -version = "0.4.12" +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "log" @@ -888,21 +860,6 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" -[[package]] -name = "lru-cache" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "memchr" version = "2.7.4" @@ -1011,9 +968,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -1052,9 +1009,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -1063,29 +1020,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -1151,20 +1085,14 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "publicsuffix" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" dependencies = [ - "idna 0.3.0", + "idna", "psl-types", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" version = "1.0.37" @@ -1204,15 +1132,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags 2.6.0", -] - [[package]] name = "regex" version = "1.11.0" @@ -1244,55 +1163,58 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "cookie", "cookie_store", "encoding_rs", "futures-core", - "futures-util", "h2", - "hickory-resolver", "http", "http-body", + "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", - "ipnet", + "hyper-util", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", + "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", ] [[package]] -name = "resolv-conf" -version = "0.7.0" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "hostname", - "quick-error", + "cc", + "cfg-if", + "getrandom", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] @@ -1315,14 +1237,44 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "1.0.4" +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ - "base64", + "ring", + "rustls-pki-types", + "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.18" @@ -1338,12 +1290,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "security-framework" version = "2.11.1" @@ -1455,6 +1401,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -1467,6 +1423,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.82" @@ -1480,9 +1442,12 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -1538,26 +1503,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "thiserror" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "time" version = "0.3.36" @@ -1599,21 +1544,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.43.1" @@ -1625,7 +1555,7 @@ dependencies = [ "libc", "mio", "pin-project-lite", - "socket2", + "socket2 0.5.7", "windows-sys 0.52.0", ] @@ -1639,6 +1569,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.12" @@ -1652,6 +1592,45 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.6.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -1665,21 +1644,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", - "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "tracing-core" version = "0.1.32" @@ -1695,27 +1662,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-width" version = "0.1.14" @@ -1728,14 +1680,20 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", ] @@ -1780,27 +1738,14 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", "wasm-bindgen-shared", ] @@ -1818,9 +1763,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1828,22 +1773,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" @@ -1855,12 +1803,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "widestring" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" - [[package]] name = "winapi" version = "0.3.9" @@ -1883,6 +1825,41 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -1910,6 +1887,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -1934,13 +1920,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -1953,6 +1956,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -1965,6 +1974,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -1977,12 +1992,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -1995,6 +2022,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2007,6 +2040,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -2019,6 +2058,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2032,14 +2077,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "winreg" -version = "0.50.0" +name = "windows_x86_64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "writeable" @@ -2112,6 +2153,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index 1951ecf..028c53d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ serde_yaml = "0.9" url = "2.1.1" linked-hash-map = "0.5.3" tokio = { version = "1.43.1", features = ["time", "net"] } -reqwest = { version = "0.11.11", features = ["cookies", "trust-dns"] } +reqwest = { version = "0.12.28", features = ["cookies", "trust-dns"] } async-trait = "0.1.30" futures = "0.3.5" lazy_static = "1.4.0" diff --git a/src/benchmark.rs b/src/benchmark.rs index b1005cf..368f4fa 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -70,7 +70,7 @@ pub fn execute(benchmark_path: &str, report_path_option: Option<&str>, relaxed_i println!(); let threads = std::cmp::min(num_cpus::get(), config.concurrency as usize); - let rt = runtime::Builder::new_multi_thread().enable_all().worker_threads(threads).build().unwrap(); + let rt = runtime::Builder::new_current_thread().enable_all().worker_threads(threads).build().unwrap(); rt.block_on(async { let mut benchmark: Benchmark = Benchmark::new(); From d68c1b743a1952d63abba446c3253bd454d877c9 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 29 Dec 2025 21:30:04 +0100 Subject: [PATCH 61/75] Update benchmark --- README.md | 2 +- example/benchmark.yml | 4 ++-- example/server/package-lock.json | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cffbb7a..e9f7688 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ plan: Content-Type: 'application/json' with_items_from_csv: file_name: ./fixtures/transactions.csv - quote_char: "\'" + quote_char: "\\'" - name: Fetch no relative url request: diff --git a/example/benchmark.yml b/example/benchmark.yml index ff8f661..f9d5aa8 100644 --- a/example/benchmark.yml +++ b/example/benchmark.yml @@ -109,7 +109,7 @@ plan: url: /api/users/contacts/{{ item.id }} with_items_from_csv: file_name: ./fixtures/users.csv - quote_char: "\'" + quote_char: "\\'" - name: POST some crafted JSONs stored in CSV request: @@ -120,7 +120,7 @@ plan: Content-Type: 'application/json' with_items_from_csv: file_name: ./fixtures/transactions.csv - quote_char: "\'" + quote_char: "\\'" - name: Fetch no relative url request: diff --git a/example/server/package-lock.json b/example/server/package-lock.json index 1350e89..2e56901 100644 --- a/example/server/package-lock.json +++ b/example/server/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "server", "version": "1.0.0", "license": "ISC", "dependencies": { From d393afb84a55521d027bdf642c841610d5db143c Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 29 Dec 2025 21:37:08 +0100 Subject: [PATCH 62/75] Fix release process --- .github/workflows/release.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 232bc0a..925711e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,8 @@ name: Release on: release: types: [published] + workflow_dispatch: null + push: null jobs: release: @@ -23,9 +25,10 @@ jobs: steps: - uses: actions/checkout@master - name: Compile and release - uses: rust-build/rust-build.action@v1.4.0 + uses: rust-build/rust-build.action@v1.4.5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} RUSTTARGET: ${{ matrix.target }} + TOOLCHAIN_VERSION: 1.83.0 EXTRA_FILES: "README.md" ARCHIVE_TYPES: ${{ matrix.archive }} From c4902a643adb05dfe2009ea668943ab1313592ed Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 29 Dec 2025 21:54:38 +0100 Subject: [PATCH 63/75] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9f7688..d6d9f42 100644 --- a/README.md +++ b/README.md @@ -286,7 +286,7 @@ production environments. Full list of cli options, which is available under `drill --help` ``` -drill 0.8.3 +drill 0.9.0 HTTP load testing application written in Rust inspired by Ansible syntax USAGE: From a7c6877abf2163999b78381c479092c92a7b0227 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 29 Dec 2025 22:08:48 +0100 Subject: [PATCH 64/75] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2b6ec38..883e93e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -288,7 +288,7 @@ dependencies = [ [[package]] name = "drill" -version = "0.8.3" +version = "0.9.0" dependencies = [ "async-trait", "clap", diff --git a/Cargo.toml b/Cargo.toml index 028c53d..794dee7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drill" -version = "0.8.3" +version = "0.9.0" authors = ["Ferran Basora "] description = "Drill is a HTTP load testing application written in Rust inspired by Ansible syntax" repository = "https://github.com/fcsonline/drill" From 0fce6a2f02ae85f5190a172a4b4ab310e5fc1b87 Mon Sep 17 00:00:00 2001 From: Daniel Darabos Date: Wed, 18 Sep 2024 15:07:28 +0200 Subject: [PATCH 65/75] Use 1 hour as histogram maximum instead of 3.6 seconds. --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index a02f88b..b068a85 100644 --- a/src/main.rs +++ b/src/main.rs @@ -105,7 +105,7 @@ impl DrillStats { } fn compute_stats(sub_reports: &[Report]) -> DrillStats { - let mut hist = Histogram::::new_with_bounds(1, 60 * 60 * 1000, 2).unwrap(); + let mut hist = Histogram::::new_with_bounds(1, 60 * 60 * 1_000_000, 2).unwrap(); let mut group_by_status = HashMap::new(); for req in sub_reports { From febb7fde559b9a3d8cf093d80e5c8ecd12a04c80 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 30 May 2026 10:34:47 +0200 Subject: [PATCH 66/75] Update all dependencies to their latest versions Bumps every dependency to the latest release, including four that required code changes: - clap 2 -> 4: migrate the builder API (App -> Command, Arg::with_name -> Arg::new, takes_value -> ArgAction, value_of/is_present -> get_one/get_flag). - rand 0.8 -> 0.10: thread_rng() -> rand::rng(). - colored 2 -> 3 and reqwest 0.12 -> 0.13 (drop-in). reqwest 0.13 defaults to rustls, so OpenSSL is no longer needed: the openssl-sys dependency and the `vendored` feature are removed, and the `trust-dns` feature is replaced with its successor `hickory-dns`. The README's OpenSSL build instructions are updated accordingly. Co-Authored-By: Claude Opus 4.8 --- Cargo.lock | 1577 ++++++++++++++++++++------ Cargo.toml | 45 +- README.md | 24 +- src/expandable/multi_csv_request.rs | 3 +- src/expandable/multi_file_request.rs | 3 +- src/expandable/multi_iter_request.rs | 3 +- src/expandable/multi_request.rs | 3 +- src/main.rs | 67 +- 8 files changed, 1280 insertions(+), 445 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 883e93e..c1c3a22 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.0" @@ -27,19 +18,66 @@ dependencies = [ ] [[package]] -name = "ansi_term" -version = "0.12.1" +name = "anstream" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ - "winapi", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", ] +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -52,17 +90,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.4.0" @@ -70,18 +97,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] -name = "backtrace" -version = "0.3.74" +name = "aws-lc-rs" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", ] [[package]] @@ -104,9 +138,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bumpalo" @@ -133,6 +167,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -142,29 +178,82 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.10.1", +] + [[package]] name = "clap" -version = "2.34.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", "strsim", - "textwrap", - "unicode-width", - "vec_map", ] +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + [[package]] name = "colored" -version = "2.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.60.2", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", ] [[package]] @@ -206,12 +295,31 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -221,6 +329,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -230,6 +344,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -238,14 +361,14 @@ checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "csv" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] @@ -257,6 +380,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + [[package]] name = "deranged" version = "0.3.11" @@ -300,8 +429,7 @@ dependencies = [ "lazy_static", "linked-hash-map", "num_cpus", - "openssl-sys", - "rand", + "rand 0.10.1", "regex", "reqwest", "serde", @@ -312,6 +440,18 @@ dependencies = [ "url", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -329,12 +469,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -366,34 +506,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -406,9 +543,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -416,15 +553,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -433,15 +570,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -450,21 +587,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -474,10 +611,24 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -485,15 +636,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", ] [[package]] -name = "gimli" -version = "0.31.1" +name = "getrandom" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasip2", + "wasip3", +] [[package]] name = "h2" @@ -519,6 +694,15 @@ name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hdrhistogram" @@ -535,19 +719,16 @@ dependencies = [ ] [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -555,6 +736,76 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-net" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2295ed2f9c31e471e1428a8f88a3f0e1f4b27c15049592138d1eebe9c35b183" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "futures-channel", + "futures-io", + "futures-util", + "hickory-proto", + "idna", + "ipnet", + "jni", + "rand 0.10.1", + "thiserror 2.0.18", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-proto" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bab31817bfb44672a252e97fe81cd0c18d1b2cf892108922f6818820df8c643" +dependencies = [ + "data-encoding", + "idna", + "ipnet", + "jni", + "once_cell", + "prefix-trie", + "rand 0.10.1", + "ring", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d58d28879ceecde6607729660c2667a081ccdc082e082675042793960f178c" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-net", + "hickory-proto", + "ipconfig", + "ipnet", + "jni", + "moka", + "ndk-context", + "once_cell", + "parking_lot", + "rand 0.10.1", + "resolv-conf", + "smallvec", + "system-configuration 0.7.0", + "thiserror 2.0.18", + "tokio", + "tracing", +] + [[package]] name = "http" version = "1.4.0" @@ -632,22 +883,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - [[package]] name = "hyper-util" version = "0.1.19" @@ -666,8 +901,8 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", - "system-configuration", + "socket2 0.6.4", + "system-configuration 0.5.1", "tokio", "tower-service", "tracing", @@ -755,6 +990,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "idna" version = "1.1.0" @@ -778,12 +1019,27 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "ipconfig" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +dependencies = [ + "socket2 0.6.4", + "widestring", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", ] [[package]] @@ -791,6 +1047,9 @@ name = "ipnet" version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +dependencies = [ + "serde", +] [[package]] name = "iri-string" @@ -802,6 +1061,12 @@ dependencies = [ "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itoa" version = "1.0.11" @@ -809,8 +1074,67 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] -name = "js-sys" -version = "0.3.83" +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ @@ -824,11 +1148,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" -version = "0.2.178" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "linked-hash-map" @@ -838,9 +1168,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" @@ -854,12 +1184,49 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "memchr" version = "2.7.4" @@ -889,33 +1256,40 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] -name = "native-tls" -version = "0.2.12" +name = "moka" +version = "0.12.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "loom", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "thiserror 1.0.69", + "uuid", ] +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + [[package]] name = "nom" version = "7.1.3" @@ -926,6 +1300,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -943,88 +1327,70 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] -[[package]] -name = "object" -version = "0.36.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "openssl" -version = "0.10.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "critical-section", + "portable-atomic", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] -name = "openssl-src" -version = "300.3.2+3.3.2" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "cc", + "lock_api", + "parking_lot_core", ] [[package]] -name = "openssl-sys" -version = "0.9.111" +name = "parking_lot_core" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ - "cc", + "cfg-if", "libc", - "openssl-src", - "pkg-config", - "vcpkg", + "redox_syscall", + "smallvec", + "windows-link", ] [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" @@ -1039,10 +1405,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "pkg-config" -version = "0.3.31" +name = "portable-atomic" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "potential_utf" @@ -1068,11 +1434,32 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prefix-trie" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +dependencies = [ + "either", + "ipnet", + "num-traits", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1093,6 +1480,62 @@ dependencies = [ "psl-types", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.5.7", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.7", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" version = "1.0.37" @@ -1102,59 +1545,111 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" -version = "0.8.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ - "libc", "rand_chacha", - "rand_core", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.1", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.5", ] [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "getrandom", + "bitflags 2.11.1", ] [[package]] name = "regex" -version = "1.11.0" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.14", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.5" @@ -1163,9 +1658,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.28" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64 0.22.1", "bytes", @@ -1174,26 +1669,26 @@ dependencies = [ "encoding_rs", "futures-core", "h2", + "hickory-resolver", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", - "hyper-tls", "hyper-util", "js-sys", "log", "mime", - "native-tls", + "once_cell", "percent-encoding", "pin-project-lite", + "quinn", + "rustls", "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", + "rustls-platform-verifier", "sync_wrapper", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower", "tower-http", "tower-service", @@ -1203,6 +1698,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + [[package]] name = "ring" version = "0.17.14" @@ -1211,29 +1712,38 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "untrusted", "windows-sys 0.52.0", ] [[package]] -name = "rustc-demangle" -version = "0.1.24" +name = "rustc-hash" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] [[package]] name = "rustix" -version = "0.38.37" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -1242,6 +1752,7 @@ version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ + "aws-lc-rs", "once_cell", "rustls-pki-types", "rustls-webpki", @@ -1249,21 +1760,62 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pki-types" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ + "web-time", "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.60.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -1281,6 +1833,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.26" @@ -1290,14 +1851,26 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "security-framework" -version = "2.11.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.11.1", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -1305,28 +1878,44 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" -version = "1.0.210" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1335,26 +1924,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", "serde", + "serde_core", + "zmij", ] [[package]] @@ -1370,12 +1948,37 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "slab" version = "0.4.9" @@ -1403,9 +2006,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", "windows-sys 0.60.2", @@ -1419,9 +2022,9 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" -version = "0.8.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -1431,9 +2034,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.82" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -1467,8 +2070,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.11.1", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", ] [[package]] @@ -1481,26 +2095,82 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tempfile" -version = "3.13.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.60.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "textwrap" -version = "0.11.0" +name = "thread_local" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ - "unicode-width", + "cfg-if", ] [[package]] @@ -1544,29 +2214,45 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" -version = "1.43.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ - "backtrace", "bytes", "libc", "mio", "pin-project-lite", - "socket2 0.5.7", - "windows-sys 0.52.0", + "socket2 0.6.4", + "tokio-macros", + "windows-sys 0.61.2", ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" +name = "tokio-macros" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ - "native-tls", - "tokio", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1613,7 +2299,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.11.1", "bytes", "futures-util", "http", @@ -1654,6 +2340,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -1669,10 +2385,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] -name = "unicode-width" -version = "0.1.14" +name = "unicode-xid" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" @@ -1688,13 +2404,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -1704,16 +2421,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "vcpkg" -version = "0.2.15" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] -name = "vec_map" -version = "0.8.2" +name = "uuid" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version_check" @@ -1721,6 +2449,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1736,6 +2474,24 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + [[package]] name = "wasm-bindgen" version = "0.2.106" @@ -1793,6 +2549,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" version = "0.3.72" @@ -1803,6 +2593,31 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + [[package]] name = "winapi" version = "0.3.9" @@ -1819,6 +2634,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.60.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1860,15 +2684,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -1897,18 +2712,12 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-link", ] [[package]] @@ -1944,12 +2753,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -1962,12 +2765,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -1980,12 +2777,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -2010,12 +2801,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -2028,12 +2813,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -2046,12 +2825,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -2064,12 +2837,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -2082,6 +2849,100 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + [[package]] name = "writeable" version = "0.6.2" @@ -2191,3 +3052,9 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index 794dee7..e730423 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,33 +9,24 @@ license = "GPL-3.0" edition = "2021" [dependencies] -clap = "2.32.0" -colored = "2.0.0" -csv = "1.0.5" -regex = "1.5.5" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.39" -serde_yaml = "0.9" -url = "2.1.1" -linked-hash-map = "0.5.3" -tokio = { version = "1.43.1", features = ["time", "net"] } -reqwest = { version = "0.12.28", features = ["cookies", "trust-dns"] } -async-trait = "0.1.30" -futures = "0.3.5" -lazy_static = "1.4.0" -num_cpus = "1.13.0" -rand = "0.8.5" -hdrhistogram = "7.4.0" +clap = { version = "4.6.1", features = ["cargo"] } +colored = "3.1.1" +csv = "1.4.0" +regex = "1.12.3" +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.150" +serde_yaml = "0.9.34" +url = "2.5.8" +linked-hash-map = "0.5.6" +tokio = { version = "1.52.3", features = ["time", "net"] } +reqwest = { version = "0.13.4", features = ["cookies", "hickory-dns"] } +async-trait = "0.1.89" +futures = "0.3.32" +lazy_static = "1.5.0" +num_cpus = "1.17.0" +rand = "0.10.1" +hdrhistogram = "7.5.4" hex = "0.4.3" -# Add openssl-sys as a direct dependency so it can be cross compiled to -# x86_64-unknown-linux-musl using the "vendored" feature below -openssl-sys = "0.9.66" - -[features] -# Force openssl-sys to statically link in the openssl library. Necessary when -# cross compiling to x86_64-unknown-linux-musl. -vendored = ["openssl-sys/vendored"] - [dev-dependencies] -tempfile = "3.8" +tempfile = "3.27.0" diff --git a/README.md b/README.md index d6d9f42..51d8bb8 100644 --- a/README.md +++ b/README.md @@ -225,27 +225,9 @@ cargo build --release ### Dependencies -OpenSSL is needed in order to compile Drill, whether it is through `cargo install` -or when compiling from source with `cargo build`. - -Depending on your platform, the name of the dependencies may differ. - -#### Linux - -Install `libssl-dev` and `pkg-config` packages with your favorite package manager -(if `libssl-dev` is not found, try other names like `openssl` or `openssl-devel`). - -#### macOS - -First, install the [Homebrew](https://brew.sh/) package manager. - -And then install `openssl` with Homebrew. - -#### Windows - -First, install [vcpkg](https://vcpkg.io/en/getting-started.html). - -And then run `vcpkg install openssl:x64-windows-static-md`. +Drill uses [rustls](https://github.com/rustls/rustls) for TLS, so OpenSSL is no +longer required to build or install it. A working C toolchain (and `cmake`) may +still be needed on some platforms to compile the TLS backend. ## Demo diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index 35bb550..d149e92 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -1,5 +1,4 @@ use rand::seq::SliceRandom; -use rand::thread_rng; use serde_yaml::Value; use std::path::Path; @@ -37,7 +36,7 @@ pub fn expand(parent_path: &str, item: &Value, benchmark: &mut Benchmark) { if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { - let mut rng = thread_rng(); + let mut rng = rand::rng(); with_items_file.shuffle(&mut rng); } } diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index 86c8093..d4097b4 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -4,7 +4,6 @@ use crate::benchmark::Benchmark; use crate::interpolator::INTERPOLATION_REGEX; use crate::reader; use rand::seq::SliceRandom; -use rand::thread_rng; use serde_yaml::Value; use std::path::Path; @@ -30,7 +29,7 @@ pub fn expand(parent_path: &str, item: &Value, benchmark: &mut Benchmark) { if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { - let mut rng = thread_rng(); + let mut rng = rand::rng(); with_items_file.shuffle(&mut rng); } } diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index 6a4aa18..c9ff05c 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -1,7 +1,6 @@ use std::convert::TryInto; use rand::seq::SliceRandom; -use rand::thread_rng; use serde_yaml::{Number, Value}; use crate::interpolator::INTERPOLATION_REGEX; @@ -51,7 +50,7 @@ pub fn expand(item: &Value, benchmark: &mut Benchmark) { if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { - let mut rng = thread_rng(); + let mut rng = rand::rng(); with_items.shuffle(&mut rng); } } diff --git a/src/expandable/multi_request.rs b/src/expandable/multi_request.rs index 4824f8f..86487f8 100644 --- a/src/expandable/multi_request.rs +++ b/src/expandable/multi_request.rs @@ -1,5 +1,4 @@ use rand::seq::SliceRandom; -use rand::thread_rng; use serde_yaml::Value; use super::pick; @@ -17,7 +16,7 @@ pub fn expand(item: &Value, benchmark: &mut Benchmark) { if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { if shuffle { - let mut rng = thread_rng(); + let mut rng = rand::rng(); with_items_list.shuffle(&mut rng); } } diff --git a/src/main.rs b/src/main.rs index b068a85..225d892 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,8 +9,7 @@ mod tags; mod writer; use crate::actions::Report; -use clap::crate_version; -use clap::{App, Arg}; +use clap::{crate_version, Arg, ArgAction, Command}; use colored::*; use hdrhistogram::Histogram; use linked_hash_map::LinkedHashMap; @@ -19,21 +18,21 @@ use std::process; fn main() { let matches = app_args(); - let benchmark_file = matches.value_of("benchmark").unwrap(); - let report_path_option = matches.value_of("report"); - let stats_option = matches.is_present("stats"); - let compare_path_option = matches.value_of("compare"); - let threshold_option = matches.value_of("threshold"); - let no_check_certificate = matches.is_present("no-check-certificate"); - let relaxed_interpolations = matches.is_present("relaxed-interpolations"); - let quiet = matches.is_present("quiet"); - let nanosec = matches.is_present("nanosec"); - let timeout = matches.value_of("timeout"); - let verbose = matches.is_present("verbose"); - let tags_option = matches.value_of("tags"); - let skip_tags_option = matches.value_of("skip-tags"); - let list_tags = matches.is_present("list-tags"); - let list_tasks = matches.is_present("list-tasks"); + let benchmark_file = matches.get_one::("benchmark").unwrap().as_str(); + let report_path_option = matches.get_one::("report").map(|s| s.as_str()); + let stats_option = matches.get_flag("stats"); + let compare_path_option = matches.get_one::("compare").map(|s| s.as_str()); + let threshold_option = matches.get_one::("threshold").map(|s| s.as_str()); + let no_check_certificate = matches.get_flag("no-check-certificate"); + let relaxed_interpolations = matches.get_flag("relaxed-interpolations"); + let quiet = matches.get_flag("quiet"); + let nanosec = matches.get_flag("nanosec"); + let timeout = matches.get_one::("timeout").map(|s| s.as_str()); + let verbose = matches.get_flag("verbose"); + let tags_option = matches.get_one::("tags").map(|s| s.as_str()); + let skip_tags_option = matches.get_one::("skip-tags").map(|s| s.as_str()); + let list_tags = matches.get_flag("list-tags"); + let list_tasks = matches.get_flag("list-tasks"); #[cfg(windows)] let _ = control::set_virtual_terminal(true); @@ -60,25 +59,25 @@ fn main() { process::exit(0) } -fn app_args<'a>() -> clap::ArgMatches<'a> { - App::new("drill") +fn app_args() -> clap::ArgMatches { + Command::new("drill") .version(crate_version!()) .about("HTTP load testing application written in Rust inspired by Ansible syntax") - .arg(Arg::with_name("benchmark").help("Sets the benchmark file").long("benchmark").short("b").required(true).takes_value(true)) - .arg(Arg::with_name("stats").short("s").long("stats").help("Shows request statistics").takes_value(false).conflicts_with("compare")) - .arg(Arg::with_name("report").short("r").long("report").help("Sets a report file").takes_value(true).conflicts_with("compare")) - .arg(Arg::with_name("compare").short("c").long("compare").help("Sets a compare file").takes_value(true).conflicts_with("report")) - .arg(Arg::with_name("threshold").short("t").long("threshold").help("Sets a threshold value in ms amongst the compared file").takes_value(true).conflicts_with("report")) - .arg(Arg::with_name("relaxed-interpolations").long("relaxed-interpolations").help("Do not panic if an interpolation is not present. (Not recommended)").takes_value(false)) - .arg(Arg::with_name("no-check-certificate").long("no-check-certificate").help("Disables SSL certification check. (Not recommended)").takes_value(false)) - .arg(Arg::with_name("tags").long("tags").help("Tags to include").takes_value(true)) - .arg(Arg::with_name("skip-tags").long("skip-tags").help("Tags to exclude").takes_value(true)) - .arg(Arg::with_name("list-tags").long("list-tags").help("List all benchmark tags").takes_value(false).conflicts_with_all(&["tags", "skip-tags"])) - .arg(Arg::with_name("list-tasks").long("list-tasks").help("List benchmark tasks (executes --tags/--skip-tags filter)").takes_value(false)) - .arg(Arg::with_name("quiet").short("q").long("quiet").help("Disables output").takes_value(false)) - .arg(Arg::with_name("timeout").short("o").long("timeout").help("Set timeout in seconds for all requests").takes_value(true)) - .arg(Arg::with_name("nanosec").short("n").long("nanosec").help("Shows statistics in nanoseconds").takes_value(false)) - .arg(Arg::with_name("verbose").short("v").long("verbose").help("Toggle verbose output").takes_value(false)) + .arg(Arg::new("benchmark").help("Sets the benchmark file").long("benchmark").short('b').required(true)) + .arg(Arg::new("stats").short('s').long("stats").help("Shows request statistics").action(ArgAction::SetTrue).conflicts_with("compare")) + .arg(Arg::new("report").short('r').long("report").help("Sets a report file").conflicts_with("compare")) + .arg(Arg::new("compare").short('c').long("compare").help("Sets a compare file").conflicts_with("report")) + .arg(Arg::new("threshold").short('t').long("threshold").help("Sets a threshold value in ms amongst the compared file").conflicts_with("report")) + .arg(Arg::new("relaxed-interpolations").long("relaxed-interpolations").help("Do not panic if an interpolation is not present. (Not recommended)").action(ArgAction::SetTrue)) + .arg(Arg::new("no-check-certificate").long("no-check-certificate").help("Disables SSL certification check. (Not recommended)").action(ArgAction::SetTrue)) + .arg(Arg::new("tags").long("tags").help("Tags to include")) + .arg(Arg::new("skip-tags").long("skip-tags").help("Tags to exclude")) + .arg(Arg::new("list-tags").long("list-tags").help("List all benchmark tags").action(ArgAction::SetTrue).conflicts_with_all(["tags", "skip-tags"])) + .arg(Arg::new("list-tasks").long("list-tasks").help("List benchmark tasks (executes --tags/--skip-tags filter)").action(ArgAction::SetTrue)) + .arg(Arg::new("quiet").short('q').long("quiet").help("Disables output").action(ArgAction::SetTrue)) + .arg(Arg::new("timeout").short('o').long("timeout").help("Set timeout in seconds for all requests")) + .arg(Arg::new("nanosec").short('n').long("nanosec").help("Shows statistics in nanoseconds").action(ArgAction::SetTrue)) + .arg(Arg::new("verbose").short('v').long("verbose").help("Toggle verbose output").action(ArgAction::SetTrue)) .get_matches() } From fe482e0b680b818fc3b6589182557e28f12d2ba2 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 30 May 2026 10:44:26 +0200 Subject: [PATCH 67/75] Fix clippy lint and musl release build for updated deps - request.rs: replace is_some()/unwrap() with if-let (clippy 1.96's unnecessary_unwrap fires on the newer toolchain CI uses). - release.yml: bump the release toolchain from 1.83.0 to stable; the updated deps pull in edition-2024 crates (e.g. cpufeatures 0.3.0, rust-version 1.85) that 1.83.0 cannot parse. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/release.yml | 2 +- src/actions/request.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 925711e..f7e86d6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,6 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} RUSTTARGET: ${{ matrix.target }} - TOOLCHAIN_VERSION: 1.83.0 + TOOLCHAIN_VERSION: stable EXTRA_FILES: "README.md" ARCHIVE_TYPES: ${{ matrix.archive }} diff --git a/src/actions/request.rs b/src/actions/request.rs index 7200990..f52ce1a 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -285,12 +285,12 @@ fn yaml_to_json(data: YamlValue) -> Value { #[async_trait] impl Runnable for Request { async fn execute(&self, context: &mut Context, reports: &mut Reports, pool: &Pool, config: &Config) { - if self.with_item.is_some() { - context.insert("item".to_string(), yaml_to_json(self.with_item.clone().unwrap())); + if let Some(with_item) = &self.with_item { + context.insert("item".to_string(), yaml_to_json(with_item.clone())); } - if self.index.is_some() { - context.insert("index".to_string(), json!(self.index.unwrap())); + if let Some(index) = self.index { + context.insert("index".to_string(), json!(index)); } let (res, duration_ms) = self.send_request(context, pool, config).await; From 7711ac2711fdd4a977d448f72c6be6fe12bfaaa8 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sat, 30 May 2026 17:07:48 +0200 Subject: [PATCH 68/75] Fix npm vulnerabilities in example/server Runs `npm audit fix` on the example server, resolving all 4 reported advisories (1 high, 3 moderate): - path-to-regexp 0.1.12 -> 0.1.13 (ReDoS, GHSA-37ch-88jc-xwx2) - qs 6.14.0 -> 6.15.2 (DoS, GHSA-w7fw-mjwx-w883 and others) - body-parser 1.20.4 -> 1.20.5, express 4.22.1 -> 4.22.2 `npm audit` now reports 0 vulnerabilities. Only package-lock.json changes; the version ranges in package.json already allowed the fixed releases. Supersedes the Dependabot PRs for qs and path-to-regexp (which only bumped qs to 6.14.2, still within the vulnerable range). Co-Authored-By: Claude Opus 4.8 --- example/server/package-lock.json | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/example/server/package-lock.json b/example/server/package-lock.json index 2e56901..bac2a0d 100644 --- a/example/server/package-lock.json +++ b/example/server/package-lock.json @@ -32,9 +32,9 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -45,7 +45,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -215,9 +215,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -242,14 +242,14 @@ } }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -268,7 +268,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -418,9 +418,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -597,9 +597,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/proxy-addr": { @@ -615,9 +615,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -757,13 +757,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" From ecb6d204b20f2c7aa1ab8c31200fa44eee5ebab8 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 31 May 2026 20:47:58 +0200 Subject: [PATCH 69/75] Show max time per request in statistics (#228) Add a "Max time per request" line to both the per-task and global statistics blocks. The output previously stopped at the 99.9th percentile, which hides the true worst-case latency. The value is read from the existing hdrhistogram via `max()`, so no extra bookkeeping is needed. Closes #188 Co-authored-by: Claude Opus 4.8 --- src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main.rs b/src/main.rs index 225d892..8ebae04 100644 --- a/src/main.rs +++ b/src/main.rs @@ -101,6 +101,9 @@ impl DrillStats { fn value_at_quantile(&self, quantile: f64) -> f64 { self.hist.value_at_quantile(quantile) as f64 / 1_000.0 } + fn max_duration(&self) -> f64 { + self.hist.max() as f64 / 1_000.0 + } } fn compute_stats(sub_reports: &[Report]) -> DrillStats { @@ -159,6 +162,7 @@ fn show_stats(list_reports: &[Vec], stats_option: bool, nanosec: bool, d println!("{:width$} {:width2$} {}", name.green(), "99.0'th percentile".yellow(), format_time(substats.value_at_quantile(0.99), nanosec).purple(), width = 25, width2 = 25); println!("{:width$} {:width2$} {}", name.green(), "99.5'th percentile".yellow(), format_time(substats.value_at_quantile(0.995), nanosec).purple(), width = 25, width2 = 25); println!("{:width$} {:width2$} {}", name.green(), "99.9'th percentile".yellow(), format_time(substats.value_at_quantile(0.999), nanosec).purple(), width = 25, width2 = 25); + println!("{:width$} {:width2$} {}", name.green(), "Max time per request".yellow(), format_time(substats.max_duration(), nanosec).purple(), width = 25, width2 = 25); } // compute global stats @@ -178,6 +182,7 @@ fn show_stats(list_reports: &[Vec], stats_option: bool, nanosec: bool, d println!("{:width2$} {}", "99.0'th percentile".yellow(), format_time(global_stats.value_at_quantile(0.99), nanosec).purple(), width2 = 25); println!("{:width2$} {}", "99.5'th percentile".yellow(), format_time(global_stats.value_at_quantile(0.995), nanosec).purple(), width2 = 25); println!("{:width2$} {}", "99.9'th percentile".yellow(), format_time(global_stats.value_at_quantile(0.999), nanosec).purple(), width2 = 25); + println!("{:width2$} {}", "Max time per request".yellow(), format_time(global_stats.max_duration(), nanosec).purple(), width2 = 25); } fn compare_benchmark(list_reports: &[Vec], compare_path_option: Option<&str>, threshold_option: Option<&str>) { From 4173fae8d7a71f6bebe0e72a10e67d0b10708b43 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 31 May 2026 21:06:15 +0200 Subject: [PATCH 70/75] Migrate to Rust 2024 edition (#229) * Migrate to Rust 2024 edition Bump the package edition from 2021 to 2024. `cargo fix --edition` found no source migrations were necessary, so the only changes are the edition field in Cargo.toml and rustfmt's 2024 style-edition import ordering. Building now requires Rust 1.85+ (the toolchain that stabilized the 2024 edition). CI builds on stable, well past that. Co-Authored-By: Claude Opus 4.8 * Collapse nested ifs into let-chains for edition 2024 Under edition 2024, clippy's `collapsible_if` (on current stable) flags `if let X { if cond { .. } }` because it can now be written as a single let-chain `if let X && cond { .. }`. Apply clippy's machine-applicable fix across the expandable helpers and tags, keeping behavior identical. Co-Authored-By: Claude Opus 4.8 --------- Co-authored-by: Claude Opus 4.8 --- .claude/scheduled_tasks.lock | 1 + Cargo.toml | 2 +- src/actions/assert.rs | 2 +- src/actions/assign.rs | 2 +- src/actions/delay.rs | 2 +- src/actions/request.rs | 4 ++-- src/benchmark.rs | 2 +- src/expandable/multi_csv_request.rs | 10 +++++----- src/expandable/multi_file_request.rs | 10 +++++----- src/expandable/multi_iter_request.rs | 10 +++++----- src/expandable/multi_request.rs | 10 +++++----- src/main.rs | 2 +- src/reader.rs | 2 +- src/tags.rs | 16 ++++++++-------- 14 files changed, 38 insertions(+), 37 deletions(-) create mode 100644 .claude/scheduled_tasks.lock diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000..1099240 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"fd42e16f-2f44-4135-b3d6-f462f2a2f084","pid":3616,"procStart":"Sun May 31 18:11:38 2026","acquiredAt":1780251323583} \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index e730423..17cf288 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ description = "Drill is a HTTP load testing application written in Rust inspired repository = "https://github.com/fcsonline/drill" keywords = ["performance", "http", "ansible", "jmeter"] license = "GPL-3.0" -edition = "2021" +edition = "2024" [dependencies] clap = { version = "4.6.1", features = ["cargo"] } diff --git a/src/actions/assert.rs b/src/actions/assert.rs index 7cb3032..110e758 100644 --- a/src/actions/assert.rs +++ b/src/actions/assert.rs @@ -3,8 +3,8 @@ use colored::*; use serde_json::json; use serde_yaml::Value; -use crate::actions::extract; use crate::actions::Runnable; +use crate::actions::extract; use crate::benchmark::{Context, Pool, Reports}; use crate::config::Config; use crate::interpolator; diff --git a/src/actions/assign.rs b/src/actions/assign.rs index ea7c458..ed53c34 100644 --- a/src/actions/assign.rs +++ b/src/actions/assign.rs @@ -3,8 +3,8 @@ use colored::*; use serde_json::json; use serde_yaml::Value; -use crate::actions::extract; use crate::actions::Runnable; +use crate::actions::extract; use crate::benchmark::{Context, Pool, Reports}; use crate::config::Config; diff --git a/src/actions/delay.rs b/src/actions/delay.rs index aa2d9c9..a11fca1 100644 --- a/src/actions/delay.rs +++ b/src/actions/delay.rs @@ -3,8 +3,8 @@ use colored::*; use serde_yaml::Value; use tokio::time::sleep; -use crate::actions::extract; use crate::actions::Runnable; +use crate::actions::extract; use crate::benchmark::{Context, Pool, Reports}; use crate::config::Config; diff --git a/src/actions/request.rs b/src/actions/request.rs index f52ce1a..a870b9c 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -4,8 +4,8 @@ use std::time::{Duration, Instant}; use async_trait::async_trait; use colored::Colorize; use reqwest::{ - header::{self, HeaderMap, HeaderName, HeaderValue}, ClientBuilder, Method, Response, + header::{self, HeaderMap, HeaderName, HeaderValue}, }; use serde_yaml::Value as YamlValue; use std::fmt::Write; @@ -14,7 +14,7 @@ use std::io::Read; use url::Url; use serde::{Deserialize, Serialize}; -use serde_json::{json, Map, Value}; +use serde_json::{Map, Value, json}; use crate::actions::{extract, extract_optional}; use crate::benchmark::{Context, Pool, Reports}; diff --git a/src/benchmark.rs b/src/benchmark.rs index 368f4fa..f3c10e1 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -4,7 +4,7 @@ use std::time::{Duration, Instant}; use futures::stream::{self, StreamExt}; -use serde_json::{json, Map, Value}; +use serde_json::{Map, Value, json}; use tokio::{runtime, time::sleep}; use crate::actions::{Report, Runnable}; diff --git a/src/expandable/multi_csv_request.rs b/src/expandable/multi_csv_request.rs index d149e92..504ae7a 100644 --- a/src/expandable/multi_csv_request.rs +++ b/src/expandable/multi_csv_request.rs @@ -34,11 +34,11 @@ pub fn expand(parent_path: &str, item: &Value, benchmark: &mut Benchmark) { let mut with_items_file = reader::read_csv_file_as_yml(final_path, quote_char); - if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { - if shuffle { - let mut rng = rand::rng(); - with_items_file.shuffle(&mut rng); - } + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) + && shuffle + { + let mut rng = rand::rng(); + with_items_file.shuffle(&mut rng); } let pick = pick(item, &with_items_file); diff --git a/src/expandable/multi_file_request.rs b/src/expandable/multi_file_request.rs index d4097b4..f379d3c 100644 --- a/src/expandable/multi_file_request.rs +++ b/src/expandable/multi_file_request.rs @@ -27,11 +27,11 @@ pub fn expand(parent_path: &str, item: &Value, benchmark: &mut Benchmark) { let mut with_items_file = reader::read_file_as_yml_array(final_path); - if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { - if shuffle { - let mut rng = rand::rng(); - with_items_file.shuffle(&mut rng); - } + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) + && shuffle + { + let mut rng = rand::rng(); + with_items_file.shuffle(&mut rng); } let pick = pick(item, &with_items_file); diff --git a/src/expandable/multi_iter_request.rs b/src/expandable/multi_iter_request.rs index c9ff05c..aea7c45 100644 --- a/src/expandable/multi_iter_request.rs +++ b/src/expandable/multi_iter_request.rs @@ -48,11 +48,11 @@ pub fn expand(item: &Value, benchmark: &mut Benchmark) { if stop > start && start > 0 { let mut with_items: Vec = (start..stop).step_by(step as usize).collect(); - if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { - if shuffle { - let mut rng = rand::rng(); - with_items.shuffle(&mut rng); - } + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) + && shuffle + { + let mut rng = rand::rng(); + with_items.shuffle(&mut rng); } if let Some(pick) = item.get("pick").and_then(|v| v.as_i64()) { diff --git a/src/expandable/multi_request.rs b/src/expandable/multi_request.rs index 86487f8..ee44690 100644 --- a/src/expandable/multi_request.rs +++ b/src/expandable/multi_request.rs @@ -14,11 +14,11 @@ pub fn expand(item: &Value, benchmark: &mut Benchmark) { if let Some(with_items) = item.get("with_items").and_then(|v| v.as_sequence()) { let mut with_items_list = with_items.clone(); - if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) { - if shuffle { - let mut rng = rand::rng(); - with_items_list.shuffle(&mut rng); - } + if let Some(shuffle) = item.get("shuffle").and_then(|v| v.as_bool()) + && shuffle + { + let mut rng = rand::rng(); + with_items_list.shuffle(&mut rng); } let pick = pick(item, &with_items_list); diff --git a/src/main.rs b/src/main.rs index 8ebae04..ce9183f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ mod tags; mod writer; use crate::actions::Report; -use clap::{crate_version, Arg, ArgAction, Command}; +use clap::{Arg, ArgAction, Command, crate_version}; use colored::*; use hdrhistogram::Histogram; use linked_hash_map::LinkedHashMap; diff --git a/src/reader.rs b/src/reader.rs index b1aa1c5..09ce189 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,6 +1,6 @@ use serde_yaml::{Mapping, Value}; use std::fs::File; -use std::io::{prelude::*, BufReader}; +use std::io::{BufReader, prelude::*}; use std::path::Path; pub fn read_file(filepath: &str) -> String { diff --git a/src/tags.rs b/src/tags.rs index 7c28571..16cb18f 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -14,10 +14,10 @@ impl<'a> Tags<'a> { let tags: Option> = tags_option.map(|m| m.split(',').map(|s| s.trim()).collect()); let skip_tags: Option> = skip_tags_option.map(|m| m.split(',').map(|s| s.trim()).collect()); - if let (Some(t), Some(s)) = (&tags, &skip_tags) { - if !t.is_disjoint(s) { - panic!("`tags` and `skip-tags` must not contain the same values!"); - } + if let (Some(t), Some(s)) = (&tags, &skip_tags) + && !t.is_disjoint(s) + { + panic!("`tags` and `skip-tags` must not contain the same values!"); } Tags { @@ -30,10 +30,10 @@ impl<'a> Tags<'a> { match item.get("tags").and_then(|v| v.as_sequence()) { Some(item_tags_raw) => { let item_tags: HashSet<&str> = item_tags_raw.iter().filter_map(|t| t.as_str()).collect(); - if let Some(s) = &self.skip_tags { - if !s.is_disjoint(&item_tags) { - return true; - } + if let Some(s) = &self.skip_tags + && !s.is_disjoint(&item_tags) + { + return true; } if let Some(t) = &self.tags { if item_tags.contains("never") && !t.contains("never") { From 36009ee3988467056ba9c2c2b8f8364cffc0d9cd Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Sun, 31 May 2026 21:13:00 +0200 Subject: [PATCH 71/75] Stop tracking .claude local tooling directory (#230) The .claude/scheduled_tasks.lock file was accidentally committed in #229. It is local Claude Code tooling state, not part of the project. Untrack it and add .claude to .gitignore so it is not re-added. Co-authored-by: Claude Opus 4.8 --- .claude/scheduled_tasks.lock | 1 - .gitignore | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 .claude/scheduled_tasks.lock diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock deleted file mode 100644 index 1099240..0000000 --- a/.claude/scheduled_tasks.lock +++ /dev/null @@ -1 +0,0 @@ -{"sessionId":"fd42e16f-2f44-4135-b3d6-f462f2a2f084","pid":3616,"procStart":"Sun May 31 18:11:38 2026","acquiredAt":1780251323583} \ No newline at end of file diff --git a/.gitignore b/.gitignore index defe2ea..2d92eb8 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ example/server/node_modules # Editor temp files .vscode + +# Claude Code local tooling +.claude From cd22905e7c500404b0e5f5c78131be776acdccb4 Mon Sep 17 00:00:00 2001 From: Zoo Sky <127824+zoosky@users.noreply.github.com> Date: Mon, 1 Jun 2026 19:54:03 +0200 Subject: [PATCH 72/75] Measure request latency to the last byte (read the full response body) (#227) drill stopped its timer as soon as the response headers arrived (`client.execute().await`), but reqwest streams the body lazily, so body-transfer time was never measured. The body was only read when a request used `assign`, and even then after the timer had already stopped. Endpoints serving non-trivial bodies (files, large JSON) were reported as completing far faster than they really did. Read the full response body before stopping the timer, so latency now measures time-to-last-byte, matching wrk, k6 and vegeta. Status, headers and cookies are snapshotted into an owned struct before the body stream is consumed. The body is drained one chunk at a time and only buffered when a request uses `assign` (then decoded with the response Content-Type charset, via encoding_rs, as reqwest's `text()` did); otherwise each chunk is dropped as it arrives, so peak memory stays O(chunk) rather than O(body) for large responses. Timing and keep-alive are unchanged -- the body is still read to the last byte. Adds regression tests: a server that delays its body (latency must include the delay) and a 1 MiB non-assign body (drained but not retained). Fixes #74. --- Cargo.lock | 1 + Cargo.toml | 1 + src/actions/request.rs | 279 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 255 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1c3a22..0464b84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -423,6 +423,7 @@ dependencies = [ "clap", "colored", "csv", + "encoding_rs", "futures", "hdrhistogram", "hex", diff --git a/Cargo.toml b/Cargo.toml index 17cf288..bc839d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ num_cpus = "1.17.0" rand = "0.10.1" hdrhistogram = "7.5.4" hex = "0.4.3" +encoding_rs = "0.8" [dev-dependencies] tempfile = "3.27.0" diff --git a/src/actions/request.rs b/src/actions/request.rs index a870b9c..3d9f6d5 100644 --- a/src/actions/request.rs +++ b/src/actions/request.rs @@ -3,8 +3,9 @@ use std::time::{Duration, Instant}; use async_trait::async_trait; use colored::Colorize; +use encoding_rs::{Encoding, UTF_8}; use reqwest::{ - ClientBuilder, Method, Response, + ClientBuilder, Method, StatusCode, header::{self, HeaderMap, HeaderName, HeaderValue}, }; use serde_yaml::Value as YamlValue; @@ -52,6 +53,26 @@ struct AssignedRequest { headers: Map, } +/// An owned snapshot of an HTTP response, captured before its body is consumed. +/// +/// The latency timer now spans the full body download (time-to-last-byte), which +/// means the streaming `reqwest::Response` is consumed while the clock is still +/// running. Anything that borrows the response -- status, headers, cookies, and +/// the final URL -- is therefore cloned out into this struct *before* the body is +/// drained, so callers retain access to it afterwards. +struct ResponseData { + /// Final request URL, used by verbose response logging. + url: Url, + /// HTTP status of the response. + status: StatusCode, + /// Response headers, surfaced to later plan steps through `assign`. + headers: HeaderMap, + /// `Set-Cookie` name/value pairs, materialized for the cookie jar. + cookies: Vec<(String, String)>, + /// Decoded response body, retained only when the request has an `assign`. + body: Option, +} + impl Request { pub fn is_that_you(item: &YamlValue) -> bool { item.get("request").and_then(|v| v.as_mapping()).is_some() @@ -124,7 +145,7 @@ impl Request { } } - async fn send_request(&self, context: &mut Context, pool: &Pool, config: &Config) -> (Option, f64) { + async fn send_request(&self, context: &mut Context, pool: &Pool, config: &Config) -> (Option, f64) { let mut uninterpolator = None; // Resolve the name @@ -218,35 +239,112 @@ impl Request { let begin = Instant::now(); let response_result = client.execute(request).await; - let duration_ms = begin.elapsed().as_secs_f64() * 1000.0; - match response_result { + let mut response = match response_result { Err(e) => { + let duration_ms = begin.elapsed().as_secs_f64() * 1000.0; if !config.quiet || config.verbose { println!("Error connecting '{}': {:?}", interpolated_base_url.as_str(), e); } - (None, duration_ms) + return (None, duration_ms); } - Ok(response) => { - if !config.quiet { - let status = response.status(); - let status_text = if status.is_server_error() { - status.to_string().red() - } else if status.is_client_error() { - status.to_string().purple() - } else { - status.to_string().yellow() - }; + Ok(response) => response, + }; - println!("{:width$} {} {} {}", interpolated_name.green(), interpolated_base_url.blue().bold(), status_text, Request::format_time(duration_ms, config.nanosec).cyan(), width = 25); + // Snapshot everything that borrows the response before the body stream is + // consumed below. + let url = response.url().clone(); + let status = response.status(); + let headers = response.headers().clone(); + let cookies: Vec<(String, String)> = response.cookies().map(|cookie| (cookie.name().to_string(), cookie.value().to_string())).collect(); + + // Read the full response body so the measured latency reflects + // time-to-last-byte, matching wrk, k6, vegeta and other load-testing tools. + // The timer previously stopped at the response headers, which under-reported + // any endpoint serving a non-trivial body (files, large JSON). + // + // The body is drained one chunk at a time. It is only buffered when an + // `assign` needs to decode it; otherwise each chunk is dropped immediately, + // so peak memory stays O(chunk) rather than O(body) even for large responses. + let mut body_buf = self.assign.is_some().then(Vec::new); + let drain_result = loop { + match response.chunk().await { + Ok(Some(chunk)) => { + if let Some(buf) = body_buf.as_mut() { + buf.extend_from_slice(&chunk); + } } + Ok(None) => break Ok(()), + Err(e) => break Err(e), + } + }; + let duration_ms = begin.elapsed().as_secs_f64() * 1000.0; - (Some(response), duration_ms) + if let Err(e) = drain_result { + if !config.quiet || config.verbose { + println!("Error reading body '{}': {:?}", interpolated_base_url.as_str(), e); } + return (None, duration_ms); + } + + if !config.quiet { + let status_text = if status.is_server_error() { + status.to_string().red() + } else if status.is_client_error() { + status.to_string().purple() + } else { + status.to_string().yellow() + }; + + println!("{:width$} {} {} {}", interpolated_name.green(), interpolated_base_url.blue().bold(), status_text, Request::format_time(duration_ms, config.nanosec).cyan(), width = 25); } + + // Decode the buffered body (only present for `assign`) using the response + // charset, mirroring reqwest's `Response::text`, so non-UTF-8 bodies are not + // corrupted. + let body = body_buf.map(|buf| decode_body(&headers, &buf)); + + ( + Some(ResponseData { + url, + status, + headers, + cookies, + body, + }), + duration_ms, + ) } } +/// Decodes a response body using the charset declared in the `Content-Type` +/// header, defaulting to UTF-8 when none is present or the label is unknown. +/// +/// This mirrors reqwest's `Response::text`, which drill can no longer call +/// directly: the body is drained as raw bytes inside the latency timer (so the +/// measured duration covers the full transfer), and only then decoded for the +/// `assign` path. Decoding the drained bytes here keeps charset-aware behaviour +/// for non-UTF-8 responses (e.g. `charset=iso-8859-1`). +fn decode_body(headers: &HeaderMap, bytes: &[u8]) -> String { + let encoding = headers.get(header::CONTENT_TYPE).and_then(|value| value.to_str().ok()).and_then(charset_from_content_type).and_then(|label| Encoding::for_label(label.as_bytes())).unwrap_or(UTF_8); + + encoding.decode(bytes).0.into_owned() +} + +/// Extracts the `charset` parameter value from a `Content-Type` header value, +/// e.g. `text/html; charset=iso-8859-1` -> `iso-8859-1`. Surrounding quotes are +/// stripped. Returns `None` when no `charset` parameter is present. +fn charset_from_content_type(content_type: &str) -> Option<&str> { + content_type.split(';').skip(1).find_map(|param| { + let (key, value) = param.split_once('=')?; + if key.trim().eq_ignore_ascii_case("charset") { + Some(value.trim().trim_matches('"')) + } else { + None + } + }) +} + fn yaml_to_json(data: YamlValue) -> Value { match data { YamlValue::Bool(b) => json!(b), @@ -308,7 +406,7 @@ impl Runnable for Request { status: 520u16, }), Some(response) => { - let status = response.status().as_u16(); + let status = response.status.as_u16(); reports.push(Report { name: self.name.to_owned(), @@ -316,19 +414,19 @@ impl Runnable for Request { status, }); - for cookie in response.cookies() { + for (name, value) in &response.cookies { let cookies = context.entry("cookies").or_insert_with(|| json!({})).as_object_mut().unwrap(); - cookies.insert(cookie.name().to_string(), json!(cookie.value().to_string())); + cookies.insert(name.clone(), json!(value)); } let data = if let Some(ref key) = self.assign { let mut headers = Map::new(); - response.headers().iter().for_each(|(header, value)| { + response.headers.iter().for_each(|(header, value)| { headers.insert(header.to_string(), json!(value.to_str().unwrap())); }); - let data = response.text().await.unwrap(); + let data = response.body.clone().unwrap_or_default(); let body: Value = serde_json::from_str(&data).unwrap_or(serde_json::Value::Null); @@ -364,13 +462,13 @@ fn log_request(request: &reqwest::Request) { println!("{message}"); } -fn log_message_response(response: &Option, duration_ms: f64) -> String { +fn log_message_response(response: &Option, duration_ms: f64) -> String { let mut message = String::new(); match response { Some(response) => { - write!(message, " {} {},", "URL:".bold(), response.url()).unwrap(); - write!(message, " {} {},", "STATUS:".bold(), response.status()).unwrap(); - write!(message, " {} {:?}", "HEADERS:".bold(), response.headers()).unwrap(); + write!(message, " {} {},", "URL:".bold(), response.url).unwrap(); + write!(message, " {} {},", "STATUS:".bold(), response.status).unwrap(); + write!(message, " {} {:?}", "HEADERS:".bold(), response.headers).unwrap(); write!(message, " {} {:.4} ms,", "DURATION:".bold(), duration_ms).unwrap(); } None => { @@ -700,4 +798,133 @@ request: _ => panic!("Expected Body::Binary"), } } + + fn test_config() -> Config { + Config { + base: String::new(), + concurrency: 1, + iterations: 1, + relaxed_interpolations: false, + no_check_certificate: false, + rampup: 0, + quiet: true, + nanosec: false, + timeout: 10, + verbose: false, + } + } + + #[test] + fn charset_parsed_from_content_type() { + assert_eq!(charset_from_content_type("text/html; charset=iso-8859-1"), Some("iso-8859-1")); + assert_eq!(charset_from_content_type("text/plain;charset=\"UTF-16\""), Some("UTF-16")); + assert_eq!(charset_from_content_type("application/json"), None); + assert_eq!(charset_from_content_type("text/html; boundary=x"), None); + } + + #[test] + fn decode_body_honors_declared_charset() { + // 0xE9 is 'e-acute' in ISO-8859-1 but invalid as standalone UTF-8. + let mut headers = HeaderMap::new(); + headers.insert(header::CONTENT_TYPE, HeaderValue::from_static("text/plain; charset=iso-8859-1")); + assert_eq!(decode_body(&headers, &[0xE9]), "\u{e9}"); + } + + #[test] + fn decode_body_defaults_to_utf8() { + let headers = HeaderMap::new(); + assert_eq!(decode_body(&headers, "hello \u{e9}".as_bytes()), "hello \u{e9}"); + } + + /// The latency timer must span the full body download (time-to-last-byte): + /// a server that streams its body 300ms after the headers should measure at + /// roughly 300ms, not ~0ms. Regression guard for the bug where the timer + /// stopped at the response headers and the body was never read (#74). + #[test] + fn measures_full_body_transfer_time() { + use std::collections::HashMap; + use std::io::Read; + use std::net::TcpListener; + use std::sync::{Arc, Mutex}; + use std::thread; + + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let addr = listener.local_addr().unwrap(); + let body_delay = Duration::from_millis(300); + + // A bare HTTP/1.1 server that sends the response head immediately but delays + // the body, so time-to-headers and time-to-last-byte differ measurably. + let server = thread::spawn(move || { + let (mut stream, _) = listener.accept().unwrap(); + let mut buf = [0u8; 1024]; + let _ = stream.read(&mut buf).unwrap(); + + let body = "x".repeat(4096); + let head = format!("HTTP/1.1 200 OK\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", body.len()); + stream.write_all(head.as_bytes()).unwrap(); + stream.flush().unwrap(); + thread::sleep(body_delay); + stream.write_all(body.as_bytes()).unwrap(); + stream.flush().unwrap(); + }); + + let url = format!("http://{addr}/"); + let yaml: YamlValue = serde_yaml::from_str(&format!("name: delayed-body\nrequest:\n url: {url}\n")).unwrap(); + let request = Request::new(&yaml, None, None); + let mut context: Context = Context::new(); + let pool: Pool = Arc::new(Mutex::new(HashMap::new())); + let config = test_config(); + + let runtime = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap(); + let (response, duration_ms) = runtime.block_on(request.send_request(&mut context, &pool, &config)); + + server.join().unwrap(); + + assert!(response.is_some(), "expected a successful response"); + assert!(duration_ms >= 250.0, "measured {duration_ms}ms; expected >= 250ms to include the 300ms body-transfer delay"); + } + + /// A request without `assign` must still fully drain a large body (so the + /// timer covers the transfer and the connection can be reused), but must not + /// retain it -- the chunks are dropped as they arrive rather than buffered. + #[test] + fn large_body_without_assign_is_drained_not_retained() { + use std::collections::HashMap; + use std::io::Read; + use std::net::TcpListener; + use std::sync::{Arc, Mutex}; + use std::thread; + + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let addr = listener.local_addr().unwrap(); + let body_len = 1024 * 1024; // 1 MiB + + let server = thread::spawn(move || { + let (mut stream, _) = listener.accept().unwrap(); + let mut buf = [0u8; 1024]; + let _ = stream.read(&mut buf).unwrap(); + + let body = "x".repeat(body_len); + let head = format!("HTTP/1.1 200 OK\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", body.len()); + stream.write_all(head.as_bytes()).unwrap(); + stream.write_all(body.as_bytes()).unwrap(); + stream.flush().unwrap(); + }); + + let url = format!("http://{addr}/"); + let yaml: YamlValue = serde_yaml::from_str(&format!("name: large-body\nrequest:\n url: {url}\n")).unwrap(); + let request = Request::new(&yaml, None, None); // no `assign` + let mut context: Context = Context::new(); + let pool: Pool = Arc::new(Mutex::new(HashMap::new())); + let config = test_config(); + + let runtime = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap(); + let (response, _duration_ms) = runtime.block_on(request.send_request(&mut context, &pool, &config)); + + server.join().unwrap(); + + let response = response.expect("expected a successful response after draining the body"); + assert_eq!(response.status.as_u16(), 200); + assert!(response.body.is_none(), "a non-assign body must be drained and dropped, not retained"); + } } From 8fd9bf134dd5981af9e5a6f8152630b3179444f2 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Mon, 1 Jun 2026 20:37:39 +0200 Subject: [PATCH 73/75] Raise a helpful error for '{{ index }}' outside an items expansion (fixes #186) (#232) `index` is only seeded inside with_items / with_items_range / with_items_from_csv / with_items_from_file requests. Referencing it elsewhere panicked (or warned under --relaxed-interpolations) with a generic "Unknown 'index' variable" message that gave no clue about the cause. Detect that specific case and raise a dedicated message explaining the variable's scope and suggesting `iteration` for the current iteration number. Also document the built-in interpolation variables in SYNTAX.md. --- SYNTAX.md | 9 +++++++++ src/interpolator.rs | 25 +++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/SYNTAX.md b/SYNTAX.md index 398092a..fb04331 100644 --- a/SYNTAX.md +++ b/SYNTAX.md @@ -75,6 +75,15 @@ The `body` property can be specified in different ways depending on the type of 3. `body: { file: path/to/file.txt }` - This variant allows you to specify a file path, and the content of the file will be used as the request body. +#### Built-in interpolation variables + +Besides anything you `assign`, a few variables are always available to `{{ }}` templates in URLs, headers and bodies: + +- `base`: the benchmark `base` URL. +- `iteration`: the current iteration number (0-based). +- `item`: the current item, only inside `with_items`, `with_items_range`, `with_items_from_csv` or `with_items_from_file` requests. +- `index`: the position of the current item, only inside the `with_items*` requests above. Outside them it is **not** defined — use `iteration` for the current iteration number. Referencing `{{ index }}` where it is not available raises an error (or a warning under `--relaxed-interpolations`) suggesting `iteration`. + #### tags item properties [Ansible](https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html#special-tags-always-and-never)-like tags. diff --git a/src/interpolator.rs b/src/interpolator.rs index 04161c9..788f14e 100644 --- a/src/interpolator.rs +++ b/src/interpolator.rs @@ -40,11 +40,13 @@ impl<'a> Interpolator<'a> { return item; } + let message = unknown_variable_message(capture); + if strict { - panic!("Unknown '{}' variable!", &capture); + panic!("{}", message); } - eprintln!("{} Unknown '{}' variable!", "WARNING!".yellow().bold(), &capture); + eprintln!("{} {}", "WARNING!".yellow().bold(), message); "".to_string() }) @@ -77,6 +79,16 @@ impl<'a> Interpolator<'a> { } } +fn unknown_variable_message(variable: &str) -> String { + // `index` is only seeded inside with_items/range/csv/file expansions. When it + // is missing the user most likely wants the iteration counter, so point them there. + if variable == "index" { + "Unknown 'index' variable! It is only available inside 'with_items', 'with_items_range', 'with_items_from_csv' or 'with_items_from_file' requests. Use 'iteration' for the current iteration number.".to_string() + } else { + format!("Unknown '{variable}' variable!") + } +} + #[cfg(test)] mod tests { use super::*; @@ -132,6 +144,15 @@ mod tests { interpolator.resolve(&url, true); } + #[test] + #[should_panic(expected = "Use 'iteration'")] + fn index_outside_expansion_suggests_iteration() { + let context: Context = Context::new(); + + let interpolator = Interpolator::new(&context); + interpolator.resolve("/users/{{ index }}", true); + } + #[test] fn interpolates_relaxed() { let context: Context = Context::new(); From 051c43a678d9a83839aa27b8486c671bac4ba0f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:25:04 +0200 Subject: [PATCH 74/75] Bump rustls-webpki from 0.103.8 to 0.103.13 (#226) Bumps [rustls-webpki](https://github.com/rustls/webpki) from 0.103.8 to 0.103.13. - [Release notes](https://github.com/rustls/webpki/releases) - [Commits](https://github.com/rustls/webpki/compare/v/0.103.8...v/0.103.13) --- updated-dependencies: - dependency-name: rustls-webpki dependency-version: 0.103.13 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0464b84..330011f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1812,9 +1812,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", From 0964bded9deb22f12d7059b1919bdab96cc92783 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Wed, 17 Jun 2026 20:45:30 +0200 Subject: [PATCH 75/75] Bump version to 0.9.1 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 330011f..8eab271 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -417,7 +417,7 @@ dependencies = [ [[package]] name = "drill" -version = "0.9.0" +version = "0.9.1" dependencies = [ "async-trait", "clap", diff --git a/Cargo.toml b/Cargo.toml index bc839d9..2a13899 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drill" -version = "0.9.0" +version = "0.9.1" authors = ["Ferran Basora "] description = "Drill is a HTTP load testing application written in Rust inspired by Ansible syntax" repository = "https://github.com/fcsonline/drill"