├── .gitignore ├── img └── kurl-demo.jpg ├── src ├── tests.rs ├── print.rs └── main.rs ├── .github └── workflows │ └── rust.yml ├── Cargo.toml ├── LICENSE ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | .DS_Store 3 | tmp* 4 | .tmp* 5 | -------------------------------------------------------------------------------- /img/kurl-demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbrls/kurl/HEAD/img/kurl-demo.jpg -------------------------------------------------------------------------------- /src/tests.rs: -------------------------------------------------------------------------------- 1 | #[cfg(test)] 2 | mod tests { 3 | use crate::*; 4 | 5 | #[test] 6 | fn a() {} 7 | } 8 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | pull_request: 7 | branches: [ "main" ] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v3 19 | - name: Build 20 | run: cargo build --verbose 21 | - name: Run tests 22 | run: cargo test --verbose 23 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "kurl" 3 | version = "0.2.1" 4 | edition = "2021" 5 | license = "MIT" 6 | description = "CLI HTTP client for Security Researchers" 7 | homepage = "https://github.com/gbrls/kurl" 8 | repository = "https://github.com/gbrls/kurl" 9 | readme = "README.md" 10 | categories = ["command-line-utilities"] 11 | keywords = ["http", "security"] 12 | 13 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 14 | 15 | [dependencies] 16 | reqwest = {version = "0.11", features = ["blocking", "json", "native-tls"]} 17 | clap = {version = "4.1", features = ["derive"]} 18 | serde_json = "1.0" 19 | colored = "2.0" 20 | xmltree = "0.10" 21 | itertools = "0.10.5" 22 | anyhow = "1.0.70" 23 | thiserror = "1.0" 24 | threadpool = "1.8" 25 | snailquote = "0.3" 26 | strip-ansi-escapes = "0.1" 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Gabriel Schneider 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kurl 2 |

3 | A Fast and Simple HTTP Client for Security Researchers 4 |

5 | 6 |

7 | Install 8 | • 9 | Usage 10 | • 11 | Concept 12 | 13 | 14 |

15 | 16 |

17 | 18 | ![](./img/kurl-demo.jpg) 19 | 20 |

21 | 22 | 23 | 24 | # Install Kurl 25 | 26 | ```bash 27 | cargo install kurl 28 | ``` 29 | _For this to work you need to have [Rust installed](https://rustup.rs/)_ 30 | 31 | # Concept 32 | 33 | **Kurl** was created to aid my work as a Red Teamer. 34 | Kurl creates an easy to view data sent via HTTP requests by the URLs provided, showing: 35 | 36 | - Status code. 37 | - Response length. 38 | - HTTP Verb. 39 | - **Data format** (json or xml). 40 | - Content-Type. 41 | - The URL itself. 42 | 43 | With kurl it's easy to parse through many URLs to find relevant data. You can visually find what's important for you, 44 | or even output to a file and grep things. 45 | 46 | # Usage 47 | 48 | ``` 49 | kurl --help 50 | ``` 51 | 52 | Will show the command line usage. 53 | 54 | 55 | ```console 56 | Simple CLI HTTP client focused on security research 57 | 58 | Usage: kurl [OPTIONS] 59 | 60 | Arguments: 61 | URL or file with URLs to send the request 62 | 63 | Options: 64 | -p 65 | Number of parallel threads to send the requests [default: 4] 66 | -X 67 | [default: GET] [possible values: POST, GET, HEAD] 68 | -b, --body 69 | 70 | -d, --data 71 | Data to be sent in the request body 72 | --verbosity-level 73 | [default: 0] 74 | -o 75 | File to write the results 76 | --fext 77 | Extensions to be ignored [default: jpeg,png,jpg,gif,wof,ttf,otf,eot,swf,ico,svg,css,woff,woff2] 78 | --fstatus 79 | Status codes to be ignored [default: 404] 80 | -h, --help 81 | Print help 82 | -V, --version 83 | Print version 84 | ``` 85 | -------------------------------------------------------------------------------- /src/print.rs: -------------------------------------------------------------------------------- 1 | use anyhow::anyhow; 2 | use strip_ansi_escapes::strip; 3 | 4 | use crate::*; 5 | 6 | #[derive(Clone, Debug, PartialEq)] 7 | pub enum DataFormat { 8 | Json(serde_json::Value), 9 | Xml(xmltree::Element), 10 | } 11 | 12 | fn get_json_keys(json: &serde_json::Value) -> Vec { 13 | if json.is_object() { 14 | json.as_object() 15 | .unwrap() 16 | .keys() 17 | .map(|x| x.to_owned()) 18 | .collect::>() 19 | } else if json.is_array() { 20 | let arr = json.as_array().unwrap().to_owned(); 21 | 22 | if arr.len() > 0 { 23 | get_json_keys(&arr[0]) 24 | } else { 25 | vec![] 26 | } 27 | } else { 28 | vec![] 29 | } 30 | } 31 | 32 | fn get_format(data: &str) -> Option { 33 | let data = data.trim().trim_start_matches("\u{feff}"); 34 | match ( 35 | serde_json::from_str::(data), 36 | xmltree::Element::parse(data.as_bytes()), 37 | ) { 38 | (Ok(x), _) => Some(DataFormat::Json(x)), 39 | (_, Ok(x)) => Some(DataFormat::Xml(x)), 40 | (_, Err(_)) => None, 41 | } 42 | } 43 | 44 | fn get_xml_keys(xml: &xmltree::Element) -> Vec { 45 | if xml 46 | .children 47 | .iter() 48 | .any(|x| matches!(x, xmltree::XMLNode::Text(_))) 49 | { 50 | vec![xml.name.clone()] 51 | } else { 52 | xml.children 53 | .iter() 54 | .map(|x| match x { 55 | xmltree::XMLNode::Element(x) => get_xml_keys(x), 56 | _ => vec![], 57 | }) 58 | .flatten() 59 | .unique() 60 | .collect::>() 61 | } 62 | } 63 | 64 | pub fn log_response(args: &CliArgs, resp: Response, url: &str) -> Result { 65 | let headers = resp.headers().clone(); 66 | 67 | let status = resp.status(); 68 | let filter_status = args.filter_status(); 69 | 70 | let u16_status = status.as_u16(); 71 | 72 | if filter_status.into_iter().any(|fs| u16_status == fs) { 73 | return Err(anyhow!("Filtered")); 74 | } 75 | 76 | let headers = resp.headers().to_owned(); 77 | let content_type = headers 78 | .get("Content-Type") 79 | .map(|x| x.to_str().unwrap_or("null")) 80 | .unwrap_or("null"); 81 | 82 | let mut data: Option = None; 83 | 84 | let len = if resp.content_length().is_some() { 85 | let len = resp 86 | .content_length() 87 | .context("While readig Content-Length")?; 88 | data = Some(resp.text().context("While reading reponse as text")?); 89 | len 90 | } else { 91 | data = Some(resp.text()?); 92 | data.as_ref().unwrap().len() as u64 93 | }; 94 | 95 | let data_fmt = get_format(&data.as_ref().unwrap()); 96 | 97 | let mut buf = vec![]; 98 | let mut ret_str = String::new(); 99 | 100 | // status_code 101 | if status.is_success() { 102 | buf.push(format!("{}", status.as_u16()).green()); 103 | } else if status.is_server_error() { 104 | buf.push(format!("{}", status.as_u16()).red()) 105 | } else if status.is_client_error() { 106 | buf.push(format!("{}", status.as_u16()).yellow()) 107 | } else { 108 | buf.push(format!("{}", status.as_u16()).black()) 109 | } 110 | 111 | // response size 112 | buf.push(format!("{}", len).normal()); 113 | 114 | // http verb 115 | match args.verb { 116 | Verb::GET => buf.push("get".green()), 117 | Verb::POST => buf.push("post".blue()), 118 | Verb::HEAD => buf.push("head".yellow()), 119 | } 120 | 121 | // data format 122 | { 123 | use DataFormat::*; 124 | match &data_fmt { 125 | Some(Json(_)) => buf.push("json".green().bold()), 126 | Some(Xml(_)) => buf.push("xml".purple().bold()), 127 | None => buf.push("none".normal()), 128 | } 129 | } 130 | 131 | // show keys from json or xml 132 | if data_fmt.is_some() { 133 | use DataFormat::*; 134 | let keys = match data_fmt.unwrap() { 135 | Json(json) => get_json_keys(&json), 136 | Xml(xml) => get_xml_keys(&xml), 137 | }; 138 | 139 | let keys = if keys.len() > 8 { 140 | let mut truncated = keys.into_iter().take(8).collect_vec(); 141 | truncated.push("...".to_string()); 142 | truncated 143 | } else { 144 | keys 145 | }; 146 | 147 | 148 | buf.push(format!("\"{}\"", keys.join(" ")).white().bold()); 149 | } 150 | 151 | // content-type 152 | buf.push(format!("\"{}\"", content_type).normal()); 153 | 154 | // url 155 | buf.push(format!("{}", url).normal()); 156 | 157 | if args.show_response_body { 158 | buf.push( 159 | format!( 160 | "{}{}", 161 | if buf.is_empty() { "" } else { "\n" }, 162 | data.unwrap() 163 | ) 164 | .normal(), 165 | ); 166 | } 167 | 168 | //TODO: implement header printing 169 | 170 | let final_string = buf 171 | .into_iter() 172 | .map(|x| format!("{}", x)) 173 | .collect_vec() 174 | .join(" "); 175 | 176 | if !final_string.is_empty() { 177 | println!("{}", final_string); 178 | } 179 | 180 | let no_colors = 181 | strip(final_string.as_bytes()).context("while removing ansi symbols from string")?; 182 | let no_colors = std::str::from_utf8(&no_colors).context("while decoding str to utf-8")?; 183 | //snailquote::unescape(no_colors).context("while unescaping string") 184 | Ok(no_colors.to_owned()) 185 | } 186 | 187 | pub fn write_results(args: &CliArgs, data: Vec) -> Result<()> { 188 | if args.output.is_none() { 189 | return Ok(()); 190 | } 191 | 192 | let fname = args.output.clone().unwrap(); 193 | 194 | let s = data 195 | .into_iter() 196 | .filter(|s| !s.is_empty()) 197 | .sorted_by_key(|s| { 198 | let len: String = s.split_ascii_whitespace().skip(1).take(1).collect(); 199 | let n: usize = len.parse().unwrap(); 200 | // -n for inverse 201 | 1i64 - (n as i64) 202 | }) 203 | .join("\n"); 204 | 205 | std::fs::write(fname, format!("{}\n", s)).context("while writing to file") 206 | } 207 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | pub mod print; 2 | mod tests; 3 | 4 | use anyhow::{Context, Result}; 5 | use clap::{Parser, ValueEnum}; 6 | use colored::Colorize; 7 | use itertools::Itertools; 8 | use reqwest::{ 9 | self, 10 | blocking::{ClientBuilder, Response}, 11 | }; 12 | use std::time::Duration; 13 | use std::{fs, sync::mpsc::channel}; 14 | use thiserror::Error; 15 | use threadpool::ThreadPool; 16 | 17 | #[derive(Copy, Clone, Debug, ValueEnum, PartialEq)] 18 | #[clap(rename_all = "UPPER")] 19 | pub enum Verb { 20 | POST, 21 | GET, 22 | HEAD, 23 | } 24 | 25 | #[derive(Error, Debug)] 26 | pub enum RequestError { 27 | #[error("invalid hostname (`{0}`)")] 28 | InvalidHostname(String), 29 | #[error("unkown error(`{0}`)")] 30 | Unkown(reqwest::Error), 31 | } 32 | 33 | #[derive(Parser, Clone)] 34 | #[command(version, about, long_about = None)] 35 | pub struct CliArgs { 36 | /// URL or file with URLs to send the request 37 | url_or_file: String, 38 | 39 | /// Number of parallel threads to send the requests 40 | #[arg(short = 'p', default_value = "4")] 41 | nworkers: usize, 42 | 43 | #[arg(short = 'X', default_value = "GET")] 44 | verb: Verb, 45 | 46 | #[arg(short = 'b', long = "body")] 47 | show_response_body: bool, 48 | 49 | /// Data to be sent in the request body 50 | #[arg(short, long)] 51 | data: Option, 52 | 53 | #[arg(long, default_value = "0")] 54 | verbosity_level: usize, 55 | 56 | /// File to write the results 57 | #[arg(short)] 58 | output: Option, 59 | 60 | /// Extensions to be ignored 61 | #[arg( 62 | long = "fext", 63 | default_value = "jpeg,png,jpg,gif,wof,ttf,otf,eot,swf,ico,svg,css,woff,woff2" 64 | )] 65 | filter_extensions: String, 66 | 67 | /// Status codes to be ignored 68 | #[arg(long = "fstatus", default_value = "404")] 69 | filter_status: String, 70 | 71 | /// proxy 72 | #[arg(short = 'x')] 73 | proxy: Option, 74 | } 75 | 76 | impl CliArgs { 77 | pub fn filter_extensions(&self) -> Vec { 78 | self.filter_extensions 79 | .clone() 80 | .split(",") 81 | .map(|s| format!(".{}", s)) 82 | .collect_vec() 83 | } 84 | 85 | pub fn filter_status(&self) -> Vec { 86 | self.filter_status 87 | .clone() 88 | .split(",") 89 | .map(|s| s.parse().unwrap()) 90 | .collect_vec() 91 | } 92 | } 93 | 94 | #[derive(Debug, Clone)] 95 | struct RequestParam { 96 | http_verb: Verb, 97 | // refactor this to be more strongly typed 98 | url: String, 99 | // refactor this to &[u8] 100 | body: String, 101 | proxy: Option, 102 | } 103 | 104 | //TODO: Run any script from bash here 105 | fn run_scripts(_scripts: &[String]) -> Result<()> { 106 | todo!("Not implemented") 107 | } 108 | 109 | fn to_url(s: &str) -> String { 110 | if !(s.starts_with("http://") || s.starts_with("https://")) { 111 | format!("http://{}", &s) 112 | } else { 113 | s.to_string() 114 | } 115 | } 116 | 117 | fn request( 118 | RequestParam { 119 | http_verb, 120 | url, 121 | body, 122 | proxy, 123 | }: RequestParam, 124 | ) -> Result { 125 | let client = match proxy { 126 | Some(url) => ClientBuilder::new().proxy(reqwest::Proxy::all(url)?), 127 | None => ClientBuilder::new(), 128 | }; 129 | 130 | let client = client 131 | .danger_accept_invalid_hostnames(true) 132 | .danger_accept_invalid_certs(true) 133 | .timeout(Duration::from_secs(30)) 134 | .build() 135 | .context("Error building http client") 136 | .unwrap(); 137 | 138 | match http_verb { 139 | Verb::GET => client.get(&url), 140 | Verb::POST => client.post(&url), 141 | Verb::HEAD => client.head(&url), 142 | } 143 | .body(body) 144 | .send() 145 | .map_err(|e| { 146 | let s = format!("{:#?}", e); 147 | if s.contains("dns error") { 148 | RequestError::InvalidHostname(url) 149 | } else { 150 | // Turn this on in verbose mode 151 | //eprintln!("{:#?}", e); 152 | RequestError::Unkown(e) 153 | } 154 | }) 155 | .context("While sending request") 156 | } 157 | 158 | fn urls(args: &CliArgs) -> Vec { 159 | let file_or_url = &args.url_or_file; 160 | // check if file exits 161 | match fs::read_to_string(&file_or_url) { 162 | Ok(urls) => urls.lines().into_iter().map(|s| to_url(s)).collect_vec(), 163 | Err(_) => vec![to_url(&file_or_url.clone())], 164 | } 165 | } 166 | 167 | fn filter_by_extension(args: &CliArgs, urls: Vec) -> Vec { 168 | let exts = args.filter_extensions(); 169 | 170 | urls.into_iter() 171 | .filter(|url| exts.iter().all(|ext| !url.ends_with(ext))) 172 | .collect_vec() 173 | } 174 | 175 | /// This is a blocking function that will only return when all the requests 176 | fn execute_requests(args: &CliArgs) -> Result<()> { 177 | let params = filter_by_extension(&args, urls(&args)) 178 | .into_iter() 179 | .map(|url| RequestParam { 180 | http_verb: args.verb, 181 | url: url, 182 | body: args.data.clone().unwrap_or("".into()), 183 | proxy: args.proxy.clone(), 184 | }) 185 | .collect_vec(); 186 | 187 | let pool = ThreadPool::new(args.nworkers); 188 | let (tx, rx) = channel(); 189 | 190 | let n = params.len(); 191 | 192 | for rp in params.into_iter() { 193 | let tx = tx.clone(); 194 | 195 | let args = args.clone(); 196 | 197 | pool.execute(move || { 198 | let url = rp.url.clone(); 199 | // verbose mode 200 | //eprintln!("started {}", rp.url); 201 | match request(rp) { 202 | Ok(response) => { 203 | let res = print::log_response(&args, response, &url); 204 | tx.send(res.unwrap_or("".to_owned())).unwrap(); 205 | } 206 | 207 | // TODO: Log error when in verbose mode 208 | Err(_) => tx.send("".to_owned()).unwrap(), 209 | } 210 | }); 211 | } 212 | 213 | // TODO: if some request panics, this will halt the application 214 | let res = rx.into_iter().take(n).collect_vec(); 215 | // verbose 216 | //eprintln!("{res:?}"); 217 | 218 | print::write_results(args, res) 219 | } 220 | 221 | fn banner() { 222 | let main = r#" 223 | ██ ▄█▀ █ ██ ██▀███ ██▓ 224 | ██▄█▒ ██ ▓██▒▓██ ▒ ██▒▓██▒ 225 | ▓███▄░ ▓██ ▒██░▓██ ░▄█ ▒▒██░ 226 | ▓██ █▄ ▓▓█ ░██░▒██▀▀█▄ ▒██░ 227 | ▒██▒ █▄▒▒█████▓ ░██▓ ▒██▒░██████▒ 228 | ▒ ▒▒ ▓▒░▒▓▒ ▒ ▒ ░ ▒▓ ░▒▓░░ ▒░▓ ░ 229 | ░ ░▒ ▒░░░▒░ ░ ░ ░▒ ░ ▒░░ ░ ▒ ░ 230 | ░ ░░ ░ ░░░ ░ ░ ░░ ░ ░ ░ 231 | ░ ░ ░ ░ ░ ░ 232 | "# 233 | .bright_yellow(); 234 | 235 | let version: &str = env!("CARGO_PKG_VERSION"); 236 | 237 | eprint!("{}", main); 238 | 239 | eprintln!("v{} - By: gbrls\n", version); 240 | } 241 | 242 | fn main() -> Result<()> { 243 | let args = CliArgs::parse(); 244 | banner(); 245 | execute_requests(&args)?; 246 | 247 | Ok(()) 248 | } 249 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "anyhow" 7 | version = "1.0.70" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" 10 | 11 | [[package]] 12 | name = "arrayvec" 13 | version = "0.5.2" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 16 | 17 | [[package]] 18 | name = "atty" 19 | version = "0.2.14" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 22 | dependencies = [ 23 | "hermit-abi 0.1.19", 24 | "libc", 25 | "winapi", 26 | ] 27 | 28 | [[package]] 29 | name = "autocfg" 30 | version = "1.1.0" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 33 | 34 | [[package]] 35 | name = "base64" 36 | version = "0.21.0" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 39 | 40 | [[package]] 41 | name = "bitflags" 42 | version = "1.3.2" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 45 | 46 | [[package]] 47 | name = "bumpalo" 48 | version = "3.12.0" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 51 | 52 | [[package]] 53 | name = "bytes" 54 | version = "1.3.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" 57 | 58 | [[package]] 59 | name = "cc" 60 | version = "1.0.78" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" 63 | 64 | [[package]] 65 | name = "cfg-if" 66 | version = "1.0.0" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 69 | 70 | [[package]] 71 | name = "clap" 72 | version = "4.1.4" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" 75 | dependencies = [ 76 | "bitflags", 77 | "clap_derive", 78 | "clap_lex", 79 | "is-terminal", 80 | "once_cell", 81 | "strsim", 82 | "termcolor", 83 | ] 84 | 85 | [[package]] 86 | name = "clap_derive" 87 | version = "4.1.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" 90 | dependencies = [ 91 | "heck", 92 | "proc-macro-error", 93 | "proc-macro2", 94 | "quote", 95 | "syn", 96 | ] 97 | 98 | [[package]] 99 | name = "clap_lex" 100 | version = "0.3.1" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" 103 | dependencies = [ 104 | "os_str_bytes", 105 | ] 106 | 107 | [[package]] 108 | name = "colored" 109 | version = "2.0.0" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" 112 | dependencies = [ 113 | "atty", 114 | "lazy_static", 115 | "winapi", 116 | ] 117 | 118 | [[package]] 119 | name = "core-foundation" 120 | version = "0.9.3" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 123 | dependencies = [ 124 | "core-foundation-sys", 125 | "libc", 126 | ] 127 | 128 | [[package]] 129 | name = "core-foundation-sys" 130 | version = "0.8.3" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 133 | 134 | [[package]] 135 | name = "either" 136 | version = "1.8.1" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" 139 | 140 | [[package]] 141 | name = "encoding_rs" 142 | version = "0.8.31" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 145 | dependencies = [ 146 | "cfg-if", 147 | ] 148 | 149 | [[package]] 150 | name = "errno" 151 | version = "0.2.8" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 154 | dependencies = [ 155 | "errno-dragonfly", 156 | "libc", 157 | "winapi", 158 | ] 159 | 160 | [[package]] 161 | name = "errno-dragonfly" 162 | version = "0.1.2" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 165 | dependencies = [ 166 | "cc", 167 | "libc", 168 | ] 169 | 170 | [[package]] 171 | name = "fastrand" 172 | version = "1.8.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 175 | dependencies = [ 176 | "instant", 177 | ] 178 | 179 | [[package]] 180 | name = "fnv" 181 | version = "1.0.7" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 184 | 185 | [[package]] 186 | name = "foreign-types" 187 | version = "0.3.2" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 190 | dependencies = [ 191 | "foreign-types-shared", 192 | ] 193 | 194 | [[package]] 195 | name = "foreign-types-shared" 196 | version = "0.1.1" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 199 | 200 | [[package]] 201 | name = "form_urlencoded" 202 | version = "1.1.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 205 | dependencies = [ 206 | "percent-encoding", 207 | ] 208 | 209 | [[package]] 210 | name = "futures-channel" 211 | version = "0.3.25" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" 214 | dependencies = [ 215 | "futures-core", 216 | ] 217 | 218 | [[package]] 219 | name = "futures-core" 220 | version = "0.3.25" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" 223 | 224 | [[package]] 225 | name = "futures-io" 226 | version = "0.3.25" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" 229 | 230 | [[package]] 231 | name = "futures-sink" 232 | version = "0.3.25" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" 235 | 236 | [[package]] 237 | name = "futures-task" 238 | version = "0.3.25" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" 241 | 242 | [[package]] 243 | name = "futures-util" 244 | version = "0.3.25" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" 247 | dependencies = [ 248 | "futures-core", 249 | "futures-io", 250 | "futures-task", 251 | "memchr", 252 | "pin-project-lite", 253 | "pin-utils", 254 | "slab", 255 | ] 256 | 257 | [[package]] 258 | name = "h2" 259 | version = "0.3.15" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" 262 | dependencies = [ 263 | "bytes", 264 | "fnv", 265 | "futures-core", 266 | "futures-sink", 267 | "futures-util", 268 | "http", 269 | "indexmap", 270 | "slab", 271 | "tokio", 272 | "tokio-util", 273 | "tracing", 274 | ] 275 | 276 | [[package]] 277 | name = "hashbrown" 278 | version = "0.12.3" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 281 | 282 | [[package]] 283 | name = "heck" 284 | version = "0.4.0" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 287 | 288 | [[package]] 289 | name = "hermit-abi" 290 | version = "0.1.19" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 293 | dependencies = [ 294 | "libc", 295 | ] 296 | 297 | [[package]] 298 | name = "hermit-abi" 299 | version = "0.2.6" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 302 | dependencies = [ 303 | "libc", 304 | ] 305 | 306 | [[package]] 307 | name = "http" 308 | version = "0.2.8" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 311 | dependencies = [ 312 | "bytes", 313 | "fnv", 314 | "itoa", 315 | ] 316 | 317 | [[package]] 318 | name = "http-body" 319 | version = "0.4.5" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 322 | dependencies = [ 323 | "bytes", 324 | "http", 325 | "pin-project-lite", 326 | ] 327 | 328 | [[package]] 329 | name = "httparse" 330 | version = "1.8.0" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 333 | 334 | [[package]] 335 | name = "httpdate" 336 | version = "1.0.2" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 339 | 340 | [[package]] 341 | name = "hyper" 342 | version = "0.14.23" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" 345 | dependencies = [ 346 | "bytes", 347 | "futures-channel", 348 | "futures-core", 349 | "futures-util", 350 | "h2", 351 | "http", 352 | "http-body", 353 | "httparse", 354 | "httpdate", 355 | "itoa", 356 | "pin-project-lite", 357 | "socket2", 358 | "tokio", 359 | "tower-service", 360 | "tracing", 361 | "want", 362 | ] 363 | 364 | [[package]] 365 | name = "hyper-tls" 366 | version = "0.5.0" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 369 | dependencies = [ 370 | "bytes", 371 | "hyper", 372 | "native-tls", 373 | "tokio", 374 | "tokio-native-tls", 375 | ] 376 | 377 | [[package]] 378 | name = "idna" 379 | version = "0.3.0" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 382 | dependencies = [ 383 | "unicode-bidi", 384 | "unicode-normalization", 385 | ] 386 | 387 | [[package]] 388 | name = "indexmap" 389 | version = "1.9.2" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 392 | dependencies = [ 393 | "autocfg", 394 | "hashbrown", 395 | ] 396 | 397 | [[package]] 398 | name = "instant" 399 | version = "0.1.12" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 402 | dependencies = [ 403 | "cfg-if", 404 | ] 405 | 406 | [[package]] 407 | name = "io-lifetimes" 408 | version = "1.0.4" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" 411 | dependencies = [ 412 | "libc", 413 | "windows-sys", 414 | ] 415 | 416 | [[package]] 417 | name = "ipnet" 418 | version = "2.7.1" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" 421 | 422 | [[package]] 423 | name = "is-terminal" 424 | version = "0.4.2" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" 427 | dependencies = [ 428 | "hermit-abi 0.2.6", 429 | "io-lifetimes", 430 | "rustix", 431 | "windows-sys", 432 | ] 433 | 434 | [[package]] 435 | name = "itertools" 436 | version = "0.10.5" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 439 | dependencies = [ 440 | "either", 441 | ] 442 | 443 | [[package]] 444 | name = "itoa" 445 | version = "1.0.5" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" 448 | 449 | [[package]] 450 | name = "js-sys" 451 | version = "0.3.60" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 454 | dependencies = [ 455 | "wasm-bindgen", 456 | ] 457 | 458 | [[package]] 459 | name = "kurl" 460 | version = "0.2.0" 461 | dependencies = [ 462 | "anyhow", 463 | "clap", 464 | "colored", 465 | "itertools", 466 | "reqwest", 467 | "serde_json", 468 | "snailquote", 469 | "strip-ansi-escapes", 470 | "thiserror", 471 | "threadpool", 472 | "xmltree", 473 | ] 474 | 475 | [[package]] 476 | name = "lazy_static" 477 | version = "1.4.0" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 480 | 481 | [[package]] 482 | name = "libc" 483 | version = "0.2.139" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" 486 | 487 | [[package]] 488 | name = "linux-raw-sys" 489 | version = "0.1.4" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 492 | 493 | [[package]] 494 | name = "log" 495 | version = "0.4.17" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 498 | dependencies = [ 499 | "cfg-if", 500 | ] 501 | 502 | [[package]] 503 | name = "memchr" 504 | version = "2.5.0" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 507 | 508 | [[package]] 509 | name = "mime" 510 | version = "0.3.16" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 513 | 514 | [[package]] 515 | name = "mio" 516 | version = "0.8.5" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" 519 | dependencies = [ 520 | "libc", 521 | "log", 522 | "wasi", 523 | "windows-sys", 524 | ] 525 | 526 | [[package]] 527 | name = "native-tls" 528 | version = "0.2.11" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 531 | dependencies = [ 532 | "lazy_static", 533 | "libc", 534 | "log", 535 | "openssl", 536 | "openssl-probe", 537 | "openssl-sys", 538 | "schannel", 539 | "security-framework", 540 | "security-framework-sys", 541 | "tempfile", 542 | ] 543 | 544 | [[package]] 545 | name = "num_cpus" 546 | version = "1.15.0" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 549 | dependencies = [ 550 | "hermit-abi 0.2.6", 551 | "libc", 552 | ] 553 | 554 | [[package]] 555 | name = "once_cell" 556 | version = "1.17.0" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" 559 | 560 | [[package]] 561 | name = "openssl" 562 | version = "0.10.45" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" 565 | dependencies = [ 566 | "bitflags", 567 | "cfg-if", 568 | "foreign-types", 569 | "libc", 570 | "once_cell", 571 | "openssl-macros", 572 | "openssl-sys", 573 | ] 574 | 575 | [[package]] 576 | name = "openssl-macros" 577 | version = "0.1.0" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 580 | dependencies = [ 581 | "proc-macro2", 582 | "quote", 583 | "syn", 584 | ] 585 | 586 | [[package]] 587 | name = "openssl-probe" 588 | version = "0.1.5" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 591 | 592 | [[package]] 593 | name = "openssl-sys" 594 | version = "0.9.80" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" 597 | dependencies = [ 598 | "autocfg", 599 | "cc", 600 | "libc", 601 | "pkg-config", 602 | "vcpkg", 603 | ] 604 | 605 | [[package]] 606 | name = "os_str_bytes" 607 | version = "6.4.1" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" 610 | 611 | [[package]] 612 | name = "percent-encoding" 613 | version = "2.2.0" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 616 | 617 | [[package]] 618 | name = "pin-project-lite" 619 | version = "0.2.9" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 622 | 623 | [[package]] 624 | name = "pin-utils" 625 | version = "0.1.0" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 628 | 629 | [[package]] 630 | name = "pkg-config" 631 | version = "0.3.26" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 634 | 635 | [[package]] 636 | name = "proc-macro-error" 637 | version = "1.0.4" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 640 | dependencies = [ 641 | "proc-macro-error-attr", 642 | "proc-macro2", 643 | "quote", 644 | "syn", 645 | "version_check", 646 | ] 647 | 648 | [[package]] 649 | name = "proc-macro-error-attr" 650 | version = "1.0.4" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 653 | dependencies = [ 654 | "proc-macro2", 655 | "quote", 656 | "version_check", 657 | ] 658 | 659 | [[package]] 660 | name = "proc-macro2" 661 | version = "1.0.50" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" 664 | dependencies = [ 665 | "unicode-ident", 666 | ] 667 | 668 | [[package]] 669 | name = "quote" 670 | version = "1.0.23" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 673 | dependencies = [ 674 | "proc-macro2", 675 | ] 676 | 677 | [[package]] 678 | name = "redox_syscall" 679 | version = "0.2.16" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 682 | dependencies = [ 683 | "bitflags", 684 | ] 685 | 686 | [[package]] 687 | name = "remove_dir_all" 688 | version = "0.5.3" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 691 | dependencies = [ 692 | "winapi", 693 | ] 694 | 695 | [[package]] 696 | name = "reqwest" 697 | version = "0.11.14" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" 700 | dependencies = [ 701 | "base64", 702 | "bytes", 703 | "encoding_rs", 704 | "futures-core", 705 | "futures-util", 706 | "h2", 707 | "http", 708 | "http-body", 709 | "hyper", 710 | "hyper-tls", 711 | "ipnet", 712 | "js-sys", 713 | "log", 714 | "mime", 715 | "native-tls", 716 | "once_cell", 717 | "percent-encoding", 718 | "pin-project-lite", 719 | "serde", 720 | "serde_json", 721 | "serde_urlencoded", 722 | "tokio", 723 | "tokio-native-tls", 724 | "tower-service", 725 | "url", 726 | "wasm-bindgen", 727 | "wasm-bindgen-futures", 728 | "web-sys", 729 | "winreg", 730 | ] 731 | 732 | [[package]] 733 | name = "rustix" 734 | version = "0.36.7" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" 737 | dependencies = [ 738 | "bitflags", 739 | "errno", 740 | "io-lifetimes", 741 | "libc", 742 | "linux-raw-sys", 743 | "windows-sys", 744 | ] 745 | 746 | [[package]] 747 | name = "ryu" 748 | version = "1.0.12" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 751 | 752 | [[package]] 753 | name = "schannel" 754 | version = "0.1.21" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" 757 | dependencies = [ 758 | "windows-sys", 759 | ] 760 | 761 | [[package]] 762 | name = "security-framework" 763 | version = "2.8.1" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "7c4437699b6d34972de58652c68b98cb5b53a4199ab126db8e20ec8ded29a721" 766 | dependencies = [ 767 | "bitflags", 768 | "core-foundation", 769 | "core-foundation-sys", 770 | "libc", 771 | "security-framework-sys", 772 | ] 773 | 774 | [[package]] 775 | name = "security-framework-sys" 776 | version = "2.8.0" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" 779 | dependencies = [ 780 | "core-foundation-sys", 781 | "libc", 782 | ] 783 | 784 | [[package]] 785 | name = "serde" 786 | version = "1.0.152" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" 789 | 790 | [[package]] 791 | name = "serde_json" 792 | version = "1.0.91" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" 795 | dependencies = [ 796 | "itoa", 797 | "ryu", 798 | "serde", 799 | ] 800 | 801 | [[package]] 802 | name = "serde_urlencoded" 803 | version = "0.7.1" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 806 | dependencies = [ 807 | "form_urlencoded", 808 | "itoa", 809 | "ryu", 810 | "serde", 811 | ] 812 | 813 | [[package]] 814 | name = "slab" 815 | version = "0.4.7" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 818 | dependencies = [ 819 | "autocfg", 820 | ] 821 | 822 | [[package]] 823 | name = "snailquote" 824 | version = "0.3.1" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "ec62a949bda7f15800481a711909f946e1204f2460f89210eaf7f57730f88f86" 827 | dependencies = [ 828 | "thiserror", 829 | "unicode_categories", 830 | ] 831 | 832 | [[package]] 833 | name = "socket2" 834 | version = "0.4.7" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 837 | dependencies = [ 838 | "libc", 839 | "winapi", 840 | ] 841 | 842 | [[package]] 843 | name = "strip-ansi-escapes" 844 | version = "0.1.1" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8" 847 | dependencies = [ 848 | "vte", 849 | ] 850 | 851 | [[package]] 852 | name = "strsim" 853 | version = "0.10.0" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 856 | 857 | [[package]] 858 | name = "syn" 859 | version = "1.0.107" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" 862 | dependencies = [ 863 | "proc-macro2", 864 | "quote", 865 | "unicode-ident", 866 | ] 867 | 868 | [[package]] 869 | name = "tempfile" 870 | version = "3.3.0" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 873 | dependencies = [ 874 | "cfg-if", 875 | "fastrand", 876 | "libc", 877 | "redox_syscall", 878 | "remove_dir_all", 879 | "winapi", 880 | ] 881 | 882 | [[package]] 883 | name = "termcolor" 884 | version = "1.2.0" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 887 | dependencies = [ 888 | "winapi-util", 889 | ] 890 | 891 | [[package]] 892 | name = "thiserror" 893 | version = "1.0.39" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" 896 | dependencies = [ 897 | "thiserror-impl", 898 | ] 899 | 900 | [[package]] 901 | name = "thiserror-impl" 902 | version = "1.0.39" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" 905 | dependencies = [ 906 | "proc-macro2", 907 | "quote", 908 | "syn", 909 | ] 910 | 911 | [[package]] 912 | name = "threadpool" 913 | version = "1.8.1" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" 916 | dependencies = [ 917 | "num_cpus", 918 | ] 919 | 920 | [[package]] 921 | name = "tinyvec" 922 | version = "1.6.0" 923 | source = "registry+https://github.com/rust-lang/crates.io-index" 924 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 925 | dependencies = [ 926 | "tinyvec_macros", 927 | ] 928 | 929 | [[package]] 930 | name = "tinyvec_macros" 931 | version = "0.1.0" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 934 | 935 | [[package]] 936 | name = "tokio" 937 | version = "1.24.2" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" 940 | dependencies = [ 941 | "autocfg", 942 | "bytes", 943 | "libc", 944 | "memchr", 945 | "mio", 946 | "num_cpus", 947 | "pin-project-lite", 948 | "socket2", 949 | "windows-sys", 950 | ] 951 | 952 | [[package]] 953 | name = "tokio-native-tls" 954 | version = "0.3.0" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 957 | dependencies = [ 958 | "native-tls", 959 | "tokio", 960 | ] 961 | 962 | [[package]] 963 | name = "tokio-util" 964 | version = "0.7.4" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 967 | dependencies = [ 968 | "bytes", 969 | "futures-core", 970 | "futures-sink", 971 | "pin-project-lite", 972 | "tokio", 973 | "tracing", 974 | ] 975 | 976 | [[package]] 977 | name = "tower-service" 978 | version = "0.3.2" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 981 | 982 | [[package]] 983 | name = "tracing" 984 | version = "0.1.37" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 987 | dependencies = [ 988 | "cfg-if", 989 | "pin-project-lite", 990 | "tracing-core", 991 | ] 992 | 993 | [[package]] 994 | name = "tracing-core" 995 | version = "0.1.30" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 998 | dependencies = [ 999 | "once_cell", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "try-lock" 1004 | version = "0.2.4" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 1007 | 1008 | [[package]] 1009 | name = "unicode-bidi" 1010 | version = "0.3.10" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" 1013 | 1014 | [[package]] 1015 | name = "unicode-ident" 1016 | version = "1.0.6" 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" 1018 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 1019 | 1020 | [[package]] 1021 | name = "unicode-normalization" 1022 | version = "0.1.22" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1025 | dependencies = [ 1026 | "tinyvec", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "unicode_categories" 1031 | version = "0.1.1" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 1034 | 1035 | [[package]] 1036 | name = "url" 1037 | version = "2.3.1" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 1040 | dependencies = [ 1041 | "form_urlencoded", 1042 | "idna", 1043 | "percent-encoding", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "utf8parse" 1048 | version = "0.2.1" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 1051 | 1052 | [[package]] 1053 | name = "vcpkg" 1054 | version = "0.2.15" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1057 | 1058 | [[package]] 1059 | name = "version_check" 1060 | version = "0.9.4" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1063 | 1064 | [[package]] 1065 | name = "vte" 1066 | version = "0.10.1" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" 1069 | dependencies = [ 1070 | "arrayvec", 1071 | "utf8parse", 1072 | "vte_generate_state_changes", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "vte_generate_state_changes" 1077 | version = "0.1.1" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" 1080 | dependencies = [ 1081 | "proc-macro2", 1082 | "quote", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "want" 1087 | version = "0.3.0" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1090 | dependencies = [ 1091 | "log", 1092 | "try-lock", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "wasi" 1097 | version = "0.11.0+wasi-snapshot-preview1" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1100 | 1101 | [[package]] 1102 | name = "wasm-bindgen" 1103 | version = "0.2.83" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 1106 | dependencies = [ 1107 | "cfg-if", 1108 | "wasm-bindgen-macro", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "wasm-bindgen-backend" 1113 | version = "0.2.83" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 1116 | dependencies = [ 1117 | "bumpalo", 1118 | "log", 1119 | "once_cell", 1120 | "proc-macro2", 1121 | "quote", 1122 | "syn", 1123 | "wasm-bindgen-shared", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "wasm-bindgen-futures" 1128 | version = "0.4.33" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" 1131 | dependencies = [ 1132 | "cfg-if", 1133 | "js-sys", 1134 | "wasm-bindgen", 1135 | "web-sys", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "wasm-bindgen-macro" 1140 | version = "0.2.83" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 1143 | dependencies = [ 1144 | "quote", 1145 | "wasm-bindgen-macro-support", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "wasm-bindgen-macro-support" 1150 | version = "0.2.83" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 1153 | dependencies = [ 1154 | "proc-macro2", 1155 | "quote", 1156 | "syn", 1157 | "wasm-bindgen-backend", 1158 | "wasm-bindgen-shared", 1159 | ] 1160 | 1161 | [[package]] 1162 | name = "wasm-bindgen-shared" 1163 | version = "0.2.83" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 1166 | 1167 | [[package]] 1168 | name = "web-sys" 1169 | version = "0.3.60" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 1172 | dependencies = [ 1173 | "js-sys", 1174 | "wasm-bindgen", 1175 | ] 1176 | 1177 | [[package]] 1178 | name = "winapi" 1179 | version = "0.3.9" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1182 | dependencies = [ 1183 | "winapi-i686-pc-windows-gnu", 1184 | "winapi-x86_64-pc-windows-gnu", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "winapi-i686-pc-windows-gnu" 1189 | version = "0.4.0" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1192 | 1193 | [[package]] 1194 | name = "winapi-util" 1195 | version = "0.1.5" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1198 | dependencies = [ 1199 | "winapi", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "winapi-x86_64-pc-windows-gnu" 1204 | version = "0.4.0" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1207 | 1208 | [[package]] 1209 | name = "windows-sys" 1210 | version = "0.42.0" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 1213 | dependencies = [ 1214 | "windows_aarch64_gnullvm", 1215 | "windows_aarch64_msvc", 1216 | "windows_i686_gnu", 1217 | "windows_i686_msvc", 1218 | "windows_x86_64_gnu", 1219 | "windows_x86_64_gnullvm", 1220 | "windows_x86_64_msvc", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "windows_aarch64_gnullvm" 1225 | version = "0.42.1" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" 1228 | 1229 | [[package]] 1230 | name = "windows_aarch64_msvc" 1231 | version = "0.42.1" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" 1234 | 1235 | [[package]] 1236 | name = "windows_i686_gnu" 1237 | version = "0.42.1" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" 1240 | 1241 | [[package]] 1242 | name = "windows_i686_msvc" 1243 | version = "0.42.1" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" 1246 | 1247 | [[package]] 1248 | name = "windows_x86_64_gnu" 1249 | version = "0.42.1" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" 1252 | 1253 | [[package]] 1254 | name = "windows_x86_64_gnullvm" 1255 | version = "0.42.1" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" 1258 | 1259 | [[package]] 1260 | name = "windows_x86_64_msvc" 1261 | version = "0.42.1" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" 1264 | 1265 | [[package]] 1266 | name = "winreg" 1267 | version = "0.10.1" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 1270 | dependencies = [ 1271 | "winapi", 1272 | ] 1273 | 1274 | [[package]] 1275 | name = "xml-rs" 1276 | version = "0.8.4" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" 1279 | 1280 | [[package]] 1281 | name = "xmltree" 1282 | version = "0.10.3" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" 1285 | dependencies = [ 1286 | "xml-rs", 1287 | ] 1288 | --------------------------------------------------------------------------------