├── .gitignore ├── generate.sh ├── default.nix ├── Cargo.toml ├── COPYING ├── fetch.nix ├── README.md ├── src └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /tmp.json 3 | /out.json 4 | /ca.key 5 | /ca.cer 6 | /result 7 | -------------------------------------------------------------------------------- /generate.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env nix-shell 2 | #! nix-shell -i bash -p openssl 3 | openssl genrsa -out ca.key 2048 4 | openssl req -x509 -new -nodes -key ca.key -sha256 -days 1 -out ca.cer -subj "/C=AL/ST=a/L=a/O=a/OU=a/CN=example.org" 5 | -------------------------------------------------------------------------------- /default.nix: -------------------------------------------------------------------------------- 1 | { lib 2 | , callPackage 3 | , rustPlatform 4 | }: 5 | 6 | rustPlatform.buildRustPackage { 7 | pname = "mitm-cache"; 8 | version = "0.1.0"; 9 | 10 | src = lib.cleanSourceWith { 11 | filter = path: type: 12 | (type == "directory" || builtins.any (lib.flip lib.hasSuffix path) [ ".rs" ".toml" ".lock" ]) 13 | && !lib.hasInfix "/target" path; 14 | src = ./.; 15 | }; 16 | 17 | cargoLock.lockFile = ./Cargo.lock; 18 | 19 | passthru.fetch = callPackage ./fetch.nix { }; 20 | 21 | meta = with lib; { 22 | description = "A MITM caching proxy for use in nixpkgs"; 23 | license = licenses.mit; 24 | maintainers = with maintainers; [ chayleaf ]; 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "mitm-cache" 3 | version = "0.1.2" 4 | edition = "2021" 5 | license = "MIT" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | base64 = "0.21.5" 11 | clap = { version = "4.4.11", features = ["derive"] } 12 | futures-util = "0.3.30" 13 | http-body-util = "0.1.2" 14 | hudsucker = "0.22.0" 15 | hyper = { version = "1.3.1", features = ["client"] } 16 | hyper-rustls = "0.26.0" 17 | hyper-util = { version = "0.1.5", features = ["client", "http1", "http2", "tokio", "client-legacy"] } 18 | regex = "1.10.2" 19 | rustls-pemfile = "2.0.0" 20 | serde = { version = "1.0.193", features = ["derive"] } 21 | serde_json = "1.0.108" 22 | sha2 = "0.10.8" 23 | tokio = { version = "1.34.0", features = ["macros", "rt-multi-thread", "signal", "fs"] } 24 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | Copyright 2024 chayleaf 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /fetch.nix: -------------------------------------------------------------------------------- 1 | { lib 2 | , fetchurl 3 | , runCommand 4 | , writeText 5 | }: 6 | 7 | { name ? "deps" 8 | , data 9 | , dontFixup ? true 10 | , ... 11 | } 12 | @ attrs: 13 | 14 | let 15 | data' = 16 | builtins.removeAttrs 17 | (if builtins.isPath data then builtins.fromJSON (builtins.readFile data) else data) 18 | [ "!version" ]; 19 | urlToPath = url: 20 | if lib.hasPrefix "https://" url then ( 21 | let 22 | url' = lib.drop 2 (lib.splitString "/" url); 23 | in "https/${builtins.concatStringsSep "/" url'}" 24 | ) 25 | else builtins.replaceStrings ["://"] ["/"] url; 26 | code = '' 27 | mkdir -p "$out" 28 | cd "$out" 29 | '' + builtins.concatStringsSep "" (lib.mapAttrsToList (url: info: 30 | let 31 | key = builtins.head (builtins.attrNames info); 32 | val = info.${key}; 33 | path = urlToPath url; 34 | name = baseNameOf path; 35 | source = { 36 | redirect = "$out/${urlToPath val}"; 37 | hash = fetchurl { inherit url; hash = val; }; 38 | text = writeText name val; 39 | }.${key} or (throw "Unknown key: ${url}"); 40 | in '' 41 | mkdir -p "${dirOf path}" 42 | ln -s "${source}" "${path}" 43 | '') data'); 44 | in 45 | runCommand name (builtins.removeAttrs attrs [ "name" "data" ]) code 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MITM cache 2 | 3 | This is a caching MITM proxy for fetching the dependencies of poorly 4 | designed build systems. To use it, first create a root CA cert using 5 | `./generate.sh`, and then run the proxy: 6 | 7 | ``` 8 | Usage: mitm-cache [OPTIONS] 9 | 10 | Commands: 11 | record 12 | replay 13 | help Print this message or the help of the given subcommand(s) 14 | 15 | Options: 16 | -l, --listen Proxy listen address 17 | -k, --ca-key Path to the ca.key file 18 | -c, --ca-cert Path to the ca.cer file 19 | -o, --out Write MITM cache description to this file 20 | -h, --help Print help 21 | ``` 22 | 23 | ``` 24 | Usage: mitm-cache record [OPTIONS] 25 | 26 | Options: 27 | -r, --record-text 28 | Record text from URLs matching this regex 29 | -x, --reject 30 | Reject requests to URLs matching this regex 31 | -f, --forget-redirects-from 32 | Forget redirects from URLs matching this regex 33 | -t, --forget-redirects-to 34 | Forget redirects to URLs matching this regex 35 | -h, --help 36 | Print help 37 | ``` 38 | 39 | While the cache is running, you can send `SIGUSR1` to write the current 40 | cache into `tmp.json`. At the end, you should send `SIGINT` to make the 41 | proxy write the final cache into `out.json`, and then 42 | use [fetch.nix](./fetch.nix) for fetching the dependencies 43 | ([default.nix](./default.nix) provides it at `mitm-cache.fetch`), and 44 | finally pass the resulting derivation output to `mitm-cache replay`: 45 | 46 | ``` 47 | Usage: mitm-cache replay 48 | 49 | Arguments: 50 | Path to the cache fetched using fetch.nix 51 | 52 | Options: 53 | -h, --help Print help 54 | ``` 55 | 56 | ## Lockfile Format 57 | 58 | ```json 59 | { 60 | "!version": 1, 61 | "https://example.org/a": { 62 | "hash": "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" 63 | }, 64 | "https://example.org/b": { 65 | "text": "example" 66 | }, 67 | "https://example.org/c": { 68 | "redirect": "https://example.org/d" 69 | } 70 | } 71 | ``` 72 | 73 | `!version` specifies the lockfile version. `fetch.nix` is maintained to support 74 | all lockfile versions, but mitm-cache only supports creating the 75 | latest lockfile version. 76 | 77 | Per-URL value is a JSON object containing one of the following keys: 78 | 79 | - `hash` - specifies the response body's [SRI hash](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity#using_subresource_integrity) 80 | - `text` - specifies the response body as text. Only written if the 81 | `--record-text` regex matches this URL. 82 | - `redirect` - specifies the URL this page redirects to. If 83 | any of the `--forget-redirects-*` rules apply, the target page's 84 | value will be written as the page's value instead. 85 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use base64::Engine; 2 | use clap::{Parser, Subcommand}; 3 | use http_body_util::BodyExt; 4 | use hudsucker::{ 5 | certificate_authority::RcgenAuthority, 6 | decode_request, decode_response, 7 | futures::channel::mpsc, 8 | hyper::{Request, Response}, 9 | rcgen::KeyPair, 10 | rustls::pki_types::{CertificateDer, PrivatePkcs8KeyDer}, 11 | tokio_tungstenite::tungstenite::http::uri::Scheme, 12 | Body, HttpContext, HttpHandler, Proxy, RequestOrResponse, 13 | }; 14 | use hyper::{StatusCode, Uri}; 15 | use hyper_rustls::{HttpsConnector, HttpsConnectorBuilder}; 16 | use hyper_util::{ 17 | client::legacy::{connect::HttpConnector, Client}, 18 | rt::TokioExecutor, 19 | }; 20 | use rustls_pemfile as pemfile; 21 | use serde::{ser::SerializeMap, Serialize}; 22 | use sha2::Digest; 23 | use std::{ 24 | collections::BTreeMap, 25 | future::Future, 26 | net::{Ipv4Addr, SocketAddr}, 27 | path::PathBuf, 28 | sync::Arc, 29 | }; 30 | use tokio::{io::AsyncReadExt, sync::RwLock}; 31 | 32 | async fn shutdown_signal() { 33 | tokio::signal::ctrl_c() 34 | .await 35 | .expect("Failed to install CTRL+C signal handler"); 36 | } 37 | 38 | #[derive(Clone, Debug, Serialize)] 39 | enum Contents { 40 | #[serde(rename = "redirect")] 41 | Redirect(String), 42 | #[serde(rename = "hash")] 43 | Hash(String), 44 | #[serde(rename = "text")] 45 | Text(String), 46 | } 47 | 48 | #[derive(Default, Serialize)] 49 | struct Page { 50 | #[serde(skip_serializing_if = "Option::is_none", flatten)] 51 | contents: Option, 52 | // replaying not implemented 53 | #[serde(skip_serializing_if = "BTreeMap::is_empty", rename = "post")] 54 | post_responses: BTreeMap, 55 | } 56 | 57 | #[derive(Default)] 58 | struct Pages(BTreeMap); 59 | 60 | impl Serialize for Pages { 61 | fn serialize(&self, serializer: S) -> Result 62 | where 63 | S: serde::Serializer, 64 | { 65 | let mut ser = serializer.serialize_map(Some(self.0.len() + 1))?; 66 | ser.serialize_entry("!version", &1)?; 67 | for (k, v) in &self.0 { 68 | ser.serialize_entry(k, v)?; 69 | } 70 | ser.end() 71 | } 72 | } 73 | 74 | #[derive(Clone)] 75 | enum Handler { 76 | Record { 77 | client: Client, Body>, 78 | pages: Arc>, 79 | forget: Option, 80 | forget_redirects_from: Option, 81 | forget_redirects_to: Option, 82 | record_text: Option, 83 | reject: Option, 84 | }, 85 | Replay(PathBuf), 86 | } 87 | 88 | fn process_uri(uri: Uri) -> Uri { 89 | let mut parts = uri.clone().into_parts(); 90 | // strip query 91 | if let Some(ref mut pq) = &mut parts.path_and_query { 92 | if let Ok(pq2) = pq.path().parse() { 93 | *pq = pq2; 94 | } 95 | } 96 | if let Some(ref mut auth) = &mut parts.authority { 97 | if let Some(scheme) = &parts.scheme { 98 | if scheme == &Scheme::HTTPS && auth.port_u16() == Some(443) { 99 | if let Some(auth2) = auth 100 | .as_str() 101 | .strip_suffix(":443") 102 | .and_then(|x| x.parse().ok()) 103 | { 104 | *auth = auth2; 105 | } 106 | } 107 | } 108 | } 109 | Uri::from_parts(parts).unwrap_or(uri) 110 | } 111 | 112 | impl HttpHandler for Handler { 113 | #[allow(clippy::manual_async_fn)] 114 | fn handle_request( 115 | &mut self, 116 | _ctx: &HttpContext, 117 | req: Request, 118 | ) -> impl Future + Send { 119 | async move { 120 | match self { 121 | Self::Record { 122 | client, 123 | pages, 124 | forget: forget_regex, 125 | forget_redirects_to, 126 | forget_redirects_from, 127 | record_text, 128 | reject, 129 | } => { 130 | let mut forget = false; 131 | let mut all_urls = vec![]; 132 | let mut req1 = Some(req); 133 | loop { 134 | let req = req1.take().unwrap(); 135 | break match req.method().as_str() { 136 | "CONNECT" => req.into(), 137 | "GET" | "POST" | "HEAD" => { 138 | let original_url = req.uri().clone(); 139 | println!("{req:?}"); 140 | let Ok(req) = decode_request(req) else { 141 | let mut res = Response::new("not found".into()); 142 | *res.status_mut() = StatusCode::NOT_FOUND; 143 | return res.into(); 144 | }; 145 | let (info, body) = req.into_parts(); 146 | let Ok(req_body) = body.collect().await.map(|x| x.to_bytes()) 147 | else { 148 | let mut res = Response::new("not found".into()); 149 | *res.status_mut() = StatusCode::NOT_FOUND; 150 | return res.into(); 151 | }; 152 | let post_body = (info.method == "POST") 153 | .then(|| std::str::from_utf8(&req_body).ok()) 154 | .flatten() 155 | .map(ToOwned::to_owned); 156 | let req_method = info.method.clone(); 157 | let req_version = info.version; 158 | let req_headers = info.headers.clone(); 159 | let req = Request::from_parts( 160 | info, 161 | Body::from_stream(futures_util::stream::iter([Ok::< 162 | _, 163 | hudsucker::Error, 164 | >( 165 | req_body 166 | )])), 167 | ); 168 | let store_body_info = req.method() != "HEAD"; 169 | let url = process_uri(original_url); 170 | if matches!(forget_regex, Some(x) if x.is_match(&url.to_string())) { 171 | forget = true; 172 | } 173 | if !forget { 174 | all_urls.push(url.to_string()); 175 | } 176 | if matches!(reject, Some(x) if x.is_match(&url.to_string())) { 177 | let mut res = Response::new("not found".into()); 178 | *res.status_mut() = StatusCode::NOT_FOUND; 179 | return res.into(); 180 | } 181 | let store_full_body = req.method() == "POST" 182 | || matches!(record_text, Some(x) if x.is_match(&url.to_string())); 183 | let Ok(res) = client.request(req).await else { 184 | let mut res = Response::new("not found".into()); 185 | *res.status_mut() = StatusCode::NOT_FOUND; 186 | return res.into(); 187 | }; 188 | let Ok(mut res) = decode_response( 189 | res.map(|body| Body::from_stream(body.into_data_stream())), 190 | ) else { 191 | let mut res = Response::new("not found".into()); 192 | *res.status_mut() = StatusCode::NOT_FOUND; 193 | return res.into(); 194 | }; 195 | // println!("{res:?}"); 196 | if res.status().is_redirection() { 197 | if let Ok(location) = res.headers().get("Location").unwrap().to_str() { 198 | let mut pages = pages.write().await; 199 | let location = if let Ok(target) = location.parse::() { 200 | let target1 = process_uri(target.clone()); 201 | if matches!(forget_redirects_from, Some(x) if x.is_match(&url.to_string())) 202 | || matches!(forget_redirects_to, Some(x) if x.is_match(&target1.to_string())) 203 | { 204 | forget = true; 205 | let mut req = Request::new(Body::from_stream(futures_util::stream::empty::>())); 206 | *req.method_mut() = req_method; 207 | *req.headers_mut() = req_headers; 208 | *req.version_mut() = req_version; 209 | if let Some(host) = target.host().and_then(|x| TryInto::try_into(x).ok()) { 210 | req.headers_mut().insert("host", host); 211 | } 212 | *req.uri_mut() = if target.port().is_some() { 213 | target 214 | } else { 215 | let target0 = target.clone(); 216 | let mut parts = target.into_parts(); 217 | if let Some(auth) = &mut parts.authority { 218 | if let Ok(x) = format!("{}:{}", auth.host(), if matches!(&parts.scheme, Some(x) if *x == Scheme::HTTP) { 219 | 80 220 | } else { 221 | 443 222 | }).parse() { 223 | *auth = x; 224 | } 225 | } 226 | Uri::from_parts(parts).unwrap_or(target0) 227 | }; 228 | req1 = Some(req); 229 | continue; 230 | } 231 | target1.to_string() 232 | } else { 233 | location.to_owned() 234 | }; 235 | let contents = Contents::Redirect(location.to_owned()); 236 | for url in all_urls { 237 | let page = pages.0.entry(url.to_string()).or_default(); 238 | if let Some(post_body) = post_body.clone() { 239 | page.post_responses.entry(post_body).or_insert(contents.clone()); 240 | } else if page.contents.is_none() { 241 | page.contents = Some(contents.clone()); 242 | } 243 | } 244 | } 245 | res 246 | } else if res.status().is_success() { 247 | if store_body_info { 248 | let (info, mut body) = res.into_parts(); 249 | let (mut tx, rx) = mpsc::channel(1); 250 | let ret_body = Body::from_stream(rx); 251 | let pages = pages.clone(); 252 | tokio::spawn(async move { 253 | let mut sha256 = sha2::Sha256::new(); 254 | let mut contents = Vec::::new(); 255 | let mut error = false; 256 | while let Some(data) = body.frame().await { 257 | let data = match data { 258 | Ok(data) => data, 259 | Err(err) => { 260 | error = true; 261 | if futures_util::future::poll_fn(|cx| tx.poll_ready(cx)).await.is_err() { 262 | break; 263 | } 264 | if tx.start_send(Err(err)).is_err() { 265 | break; 266 | } 267 | continue; 268 | } 269 | }; 270 | let Ok(data) = data.into_data() else { 271 | break; 272 | }; 273 | if store_full_body { 274 | contents.extend_from_slice(&data); 275 | } 276 | sha256.update(&data); 277 | if futures_util::future::poll_fn(|cx| tx.poll_ready(cx)).await.is_err() { 278 | error = true; 279 | break; 280 | } 281 | if tx.start_send(Ok(data)).is_err() { 282 | error = true; 283 | break; 284 | } 285 | } 286 | if error { 287 | return; 288 | } 289 | let base64 = base64::engine::general_purpose::STANDARD 290 | .encode(sha256.finalize()); 291 | let contents = if let Some(contents) = 292 | std::str::from_utf8(&contents) 293 | .ok() 294 | .filter(|_| store_full_body) 295 | { 296 | Contents::Text(contents.to_owned()) 297 | } else { 298 | Contents::Hash("sha256-".to_owned() + &base64) 299 | }; 300 | let mut pages = pages.write().await; 301 | for url in all_urls { 302 | let page = pages.0.entry(url).or_default(); 303 | if let Some(post_body) = post_body.clone() { 304 | page.post_responses.entry(post_body).or_insert(contents.clone()); 305 | } else if page.contents.is_none() { 306 | page.contents = Some(contents.clone()); 307 | } 308 | } 309 | }); 310 | Response::from_parts(info, ret_body) 311 | } else { 312 | // remove hash headers to force the software to download this 313 | // so we get sha256 314 | let headers_to_remove = res 315 | .headers() 316 | .keys() 317 | .filter(|x| { 318 | x.as_str().ends_with("-md5") 319 | || x.as_str().ends_with("-sha1") 320 | || x.as_str().ends_with("-sha256") 321 | || x.as_str().ends_with("-sha512") 322 | || x.as_str() == "x-checksum" 323 | }) 324 | .cloned() 325 | .collect::>(); 326 | for header in headers_to_remove { 327 | res.headers_mut().remove(header); 328 | } 329 | res 330 | } 331 | } else { 332 | res 333 | } 334 | .into() 335 | } 336 | _ => { 337 | let mut res = Response::new("not found".into()); 338 | *res.status_mut() = StatusCode::NOT_FOUND; 339 | res.into() 340 | } 341 | }; 342 | } 343 | } 344 | Self::Replay(dir) => match req.method().as_str() { 345 | "CONNECT" => req.into(), 346 | "HEAD" | "GET" => { 347 | let mut path = dir.clone(); 348 | let url = process_uri(req.uri().clone()); 349 | if let Some(scheme) = url.scheme_str() { 350 | path.push(scheme); 351 | } 352 | if let Some(auth) = url.authority() { 353 | path.push(auth.to_string()); 354 | } 355 | for comp in url.path().split('/').filter(|x| !x.is_empty()) { 356 | path.push(comp); 357 | } 358 | if let Ok(mut file) = tokio::fs::File::open(path).await { 359 | let (mut tx, rx) = 360 | mpsc::channel::>(1); 361 | let body = Body::from_stream(rx); 362 | if req.method().as_str() != "HEAD" { 363 | tokio::spawn(async move { 364 | let mut buf = vec![0u8; 65536]; 365 | while let Ok(n) = file.read(&mut buf).await { 366 | if n == 0 { 367 | break; 368 | } 369 | if futures_util::future::poll_fn(|cx| tx.poll_ready(cx)) 370 | .await 371 | .is_err() 372 | { 373 | break; 374 | } 375 | if tx.start_send(Ok(buf[..n].to_vec().into())).is_err() { 376 | break; 377 | } 378 | } 379 | }); 380 | } 381 | Response::new(body).into() 382 | } else { 383 | let mut res = Response::new("not found".into()); 384 | *res.status_mut() = StatusCode::NOT_FOUND; 385 | res.into() 386 | } 387 | } 388 | _ => { 389 | let mut res = Response::new("not found".into()); 390 | *res.status_mut() = StatusCode::NOT_FOUND; 391 | res.into() 392 | } 393 | }, 394 | } 395 | } 396 | } 397 | } 398 | 399 | #[derive(Subcommand)] 400 | enum Command { 401 | Record { 402 | /// Record text from URLs matching this regex 403 | #[clap(long, short)] 404 | record_text: Option, 405 | /// Reject requests to URLs matching this regex 406 | #[clap(long, short = 'x')] 407 | reject: Option, 408 | /// Forget requests to URLs matching this regex 409 | #[clap(long, short = 'F')] 410 | forget: Option, 411 | /// Forget redirects from URLs matching this regex 412 | #[clap(long, short = 'f')] 413 | forget_redirects_from: Option, 414 | /// Forget redirects to URLs matching this regex 415 | #[clap(long, short = 't')] 416 | forget_redirects_to: Option, 417 | }, 418 | Replay { 419 | /// Path to the cache fetched using fetch.nix 420 | dir: PathBuf, 421 | }, 422 | } 423 | 424 | #[derive(Parser)] 425 | struct Args { 426 | /// Proxy listen address 427 | #[clap(long, short)] 428 | listen: Option, 429 | /// Path to the ca.key file 430 | #[clap(long, short = 'k')] 431 | ca_key: Option, 432 | /// Path to the ca.cer file 433 | #[clap(long, short = 'c')] 434 | ca_cert: Option, 435 | /// Write MITM cache description to this file 436 | #[clap(long, short = 'o')] 437 | out: Option, 438 | #[command(subcommand)] 439 | cmd: Command, 440 | } 441 | 442 | #[tokio::main] 443 | async fn main() -> Result<(), hudsucker::Error> { 444 | let args = Args::parse(); 445 | let addr = args 446 | .listen 447 | .unwrap_or_else(|| SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 1337)); 448 | 449 | let private_key_bytes = tokio::fs::read(args.ca_key.unwrap_or_else(|| "ca.key".into())) 450 | .await 451 | .unwrap(); 452 | let ca_cert_bytes = tokio::fs::read(args.ca_cert.unwrap_or_else(|| "ca.cer".into())) 453 | .await 454 | .unwrap(); 455 | let private_key = PrivatePkcs8KeyDer::from( 456 | pemfile::pkcs8_private_keys(&mut &private_key_bytes[..]) 457 | .next() 458 | .unwrap() 459 | .expect("Failed to parse private key") 460 | .secret_pkcs8_der() 461 | .to_vec(), 462 | ); 463 | let ca_cert = CertificateDer::from( 464 | pemfile::certs(&mut &ca_cert_bytes[..]) 465 | .next() 466 | .unwrap() 467 | .expect("Failed to parse CA certificate") 468 | .to_vec(), 469 | ); 470 | 471 | let key_pair = KeyPair::try_from(&private_key).expect("Failed to parse private key"); 472 | let ca_cert_params = hudsucker::rcgen::CertificateParams::from_ca_cert_der(&ca_cert) 473 | .expect("Failed to parse CA certificate"); 474 | let ca_cert = ca_cert_params 475 | .self_signed(&key_pair) 476 | .expect("Failed to generate CA certificate"); 477 | let ca = RcgenAuthority::new(key_pair, ca_cert, 1_000); 478 | 479 | let pages = Arc::new(RwLock::new(Pages(BTreeMap::default()))); 480 | let proxy = Proxy::builder() 481 | .with_addr(addr) 482 | .with_rustls_client() 483 | .with_ca(ca) 484 | .with_http_handler(match args.cmd { 485 | Command::Replay { dir } => Handler::Replay(dir), 486 | Command::Record { 487 | forget, 488 | forget_redirects_to, 489 | forget_redirects_from, 490 | record_text, 491 | reject, 492 | } => Handler::Record { 493 | client: Client::builder(TokioExecutor::new()).build( 494 | HttpsConnectorBuilder::new() 495 | .with_native_roots() 496 | .unwrap() 497 | .https_or_http() 498 | .enable_http1() 499 | .build(), 500 | ), 501 | pages: pages.clone(), 502 | forget, 503 | forget_redirects_from, 504 | forget_redirects_to, 505 | record_text, 506 | reject, 507 | }, 508 | }) 509 | .with_graceful_shutdown(shutdown_signal()) 510 | .build(); 511 | 512 | let pages1 = pages.clone(); 513 | tokio::spawn(async move { 514 | let mut ch = 515 | tokio::signal::unix::signal(tokio::signal::unix::SignalKind::user_defined1()).unwrap(); 516 | let mut buf = Vec::new(); 517 | while let Some(()) = ch.recv().await { 518 | let pages = pages.read().await; 519 | buf.clear(); 520 | pages 521 | .serialize(&mut serde_json::Serializer::with_formatter( 522 | &mut buf, 523 | serde_json::ser::CompactFormatter, 524 | )) 525 | .unwrap(); 526 | tokio::fs::write("tmp.json", &buf).await.unwrap(); 527 | } 528 | }); 529 | let ret = proxy.start().await; 530 | 531 | let pages = pages1.read().await; 532 | let mut buf = Vec::new(); 533 | pages 534 | .serialize(&mut serde_json::Serializer::with_formatter( 535 | &mut buf, 536 | serde_json::ser::CompactFormatter, 537 | )) 538 | .unwrap(); 539 | tokio::fs::write(args.out.unwrap_or("out.json".into()), &buf) 540 | .await 541 | .unwrap(); 542 | ret 543 | } 544 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.22.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "alloc-no-stdlib" 31 | version = "2.0.4" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 34 | 35 | [[package]] 36 | name = "alloc-stdlib" 37 | version = "0.2.2" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 40 | dependencies = [ 41 | "alloc-no-stdlib", 42 | ] 43 | 44 | [[package]] 45 | name = "anstream" 46 | version = "0.6.14" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" 49 | dependencies = [ 50 | "anstyle", 51 | "anstyle-parse", 52 | "anstyle-query", 53 | "anstyle-wincon", 54 | "colorchoice", 55 | "is_terminal_polyfill", 56 | "utf8parse", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle" 61 | version = "1.0.7" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" 64 | 65 | [[package]] 66 | name = "anstyle-parse" 67 | version = "0.2.4" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" 70 | dependencies = [ 71 | "utf8parse", 72 | ] 73 | 74 | [[package]] 75 | name = "anstyle-query" 76 | version = "1.1.0" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" 79 | dependencies = [ 80 | "windows-sys 0.52.0", 81 | ] 82 | 83 | [[package]] 84 | name = "anstyle-wincon" 85 | version = "3.0.3" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" 88 | dependencies = [ 89 | "anstyle", 90 | "windows-sys 0.52.0", 91 | ] 92 | 93 | [[package]] 94 | name = "asn1-rs" 95 | version = "0.6.1" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" 98 | dependencies = [ 99 | "asn1-rs-derive", 100 | "asn1-rs-impl", 101 | "displaydoc", 102 | "nom", 103 | "num-traits", 104 | "rusticata-macros", 105 | "thiserror", 106 | "time", 107 | ] 108 | 109 | [[package]] 110 | name = "asn1-rs-derive" 111 | version = "0.5.0" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" 114 | dependencies = [ 115 | "proc-macro2", 116 | "quote", 117 | "syn", 118 | "synstructure", 119 | ] 120 | 121 | [[package]] 122 | name = "asn1-rs-impl" 123 | version = "0.2.0" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" 126 | dependencies = [ 127 | "proc-macro2", 128 | "quote", 129 | "syn", 130 | ] 131 | 132 | [[package]] 133 | name = "async-compression" 134 | version = "0.4.11" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" 137 | dependencies = [ 138 | "brotli", 139 | "flate2", 140 | "futures-core", 141 | "memchr", 142 | "pin-project-lite", 143 | "tokio", 144 | "zstd", 145 | "zstd-safe", 146 | ] 147 | 148 | [[package]] 149 | name = "async-lock" 150 | version = "3.4.0" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 153 | dependencies = [ 154 | "event-listener", 155 | "event-listener-strategy", 156 | "pin-project-lite", 157 | ] 158 | 159 | [[package]] 160 | name = "async-trait" 161 | version = "0.1.80" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" 164 | dependencies = [ 165 | "proc-macro2", 166 | "quote", 167 | "syn", 168 | ] 169 | 170 | [[package]] 171 | name = "atomic-waker" 172 | version = "1.1.2" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 175 | 176 | [[package]] 177 | name = "autocfg" 178 | version = "1.3.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 181 | 182 | [[package]] 183 | name = "backtrace" 184 | version = "0.3.73" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" 187 | dependencies = [ 188 | "addr2line", 189 | "cc", 190 | "cfg-if", 191 | "libc", 192 | "miniz_oxide", 193 | "object", 194 | "rustc-demangle", 195 | ] 196 | 197 | [[package]] 198 | name = "base64" 199 | version = "0.21.7" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 202 | 203 | [[package]] 204 | name = "base64" 205 | version = "0.22.1" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 208 | 209 | [[package]] 210 | name = "bitflags" 211 | version = "2.6.0" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 214 | 215 | [[package]] 216 | name = "block-buffer" 217 | version = "0.10.4" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 220 | dependencies = [ 221 | "generic-array", 222 | ] 223 | 224 | [[package]] 225 | name = "brotli" 226 | version = "6.0.0" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" 229 | dependencies = [ 230 | "alloc-no-stdlib", 231 | "alloc-stdlib", 232 | "brotli-decompressor", 233 | ] 234 | 235 | [[package]] 236 | name = "brotli-decompressor" 237 | version = "4.0.1" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" 240 | dependencies = [ 241 | "alloc-no-stdlib", 242 | "alloc-stdlib", 243 | ] 244 | 245 | [[package]] 246 | name = "bstr" 247 | version = "1.9.1" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" 250 | dependencies = [ 251 | "memchr", 252 | "regex-automata 0.4.7", 253 | "serde", 254 | ] 255 | 256 | [[package]] 257 | name = "bumpalo" 258 | version = "3.16.0" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 261 | 262 | [[package]] 263 | name = "byteorder" 264 | version = "1.5.0" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 267 | 268 | [[package]] 269 | name = "bytes" 270 | version = "1.6.0" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 273 | 274 | [[package]] 275 | name = "cc" 276 | version = "1.0.101" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" 279 | dependencies = [ 280 | "jobserver", 281 | "libc", 282 | "once_cell", 283 | ] 284 | 285 | [[package]] 286 | name = "cfg-if" 287 | version = "1.0.0" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 290 | 291 | [[package]] 292 | name = "clap" 293 | version = "4.5.7" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" 296 | dependencies = [ 297 | "clap_builder", 298 | "clap_derive", 299 | ] 300 | 301 | [[package]] 302 | name = "clap_builder" 303 | version = "4.5.7" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" 306 | dependencies = [ 307 | "anstream", 308 | "anstyle", 309 | "clap_lex", 310 | "strsim", 311 | ] 312 | 313 | [[package]] 314 | name = "clap_derive" 315 | version = "4.5.5" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" 318 | dependencies = [ 319 | "heck", 320 | "proc-macro2", 321 | "quote", 322 | "syn", 323 | ] 324 | 325 | [[package]] 326 | name = "clap_lex" 327 | version = "0.7.1" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" 330 | 331 | [[package]] 332 | name = "colorchoice" 333 | version = "1.0.1" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" 336 | 337 | [[package]] 338 | name = "concurrent-queue" 339 | version = "2.5.0" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 342 | dependencies = [ 343 | "crossbeam-utils", 344 | ] 345 | 346 | [[package]] 347 | name = "core-foundation" 348 | version = "0.9.4" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 351 | dependencies = [ 352 | "core-foundation-sys", 353 | "libc", 354 | ] 355 | 356 | [[package]] 357 | name = "core-foundation-sys" 358 | version = "0.8.6" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 361 | 362 | [[package]] 363 | name = "cpufeatures" 364 | version = "0.2.12" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 367 | dependencies = [ 368 | "libc", 369 | ] 370 | 371 | [[package]] 372 | name = "crc32fast" 373 | version = "1.4.2" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 376 | dependencies = [ 377 | "cfg-if", 378 | ] 379 | 380 | [[package]] 381 | name = "crossbeam-channel" 382 | version = "0.5.13" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" 385 | dependencies = [ 386 | "crossbeam-utils", 387 | ] 388 | 389 | [[package]] 390 | name = "crossbeam-epoch" 391 | version = "0.9.18" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 394 | dependencies = [ 395 | "crossbeam-utils", 396 | ] 397 | 398 | [[package]] 399 | name = "crossbeam-utils" 400 | version = "0.8.20" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 403 | 404 | [[package]] 405 | name = "crypto-common" 406 | version = "0.1.6" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 409 | dependencies = [ 410 | "generic-array", 411 | "typenum", 412 | ] 413 | 414 | [[package]] 415 | name = "data-encoding" 416 | version = "2.6.0" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" 419 | 420 | [[package]] 421 | name = "der-parser" 422 | version = "9.0.0" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" 425 | dependencies = [ 426 | "asn1-rs", 427 | "displaydoc", 428 | "nom", 429 | "num-bigint", 430 | "num-traits", 431 | "rusticata-macros", 432 | ] 433 | 434 | [[package]] 435 | name = "deranged" 436 | version = "0.3.11" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 439 | dependencies = [ 440 | "powerfmt", 441 | ] 442 | 443 | [[package]] 444 | name = "digest" 445 | version = "0.10.7" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 448 | dependencies = [ 449 | "block-buffer", 450 | "crypto-common", 451 | ] 452 | 453 | [[package]] 454 | name = "displaydoc" 455 | version = "0.2.5" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 458 | dependencies = [ 459 | "proc-macro2", 460 | "quote", 461 | "syn", 462 | ] 463 | 464 | [[package]] 465 | name = "equivalent" 466 | version = "1.0.1" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 469 | 470 | [[package]] 471 | name = "event-listener" 472 | version = "5.3.1" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" 475 | dependencies = [ 476 | "concurrent-queue", 477 | "parking", 478 | "pin-project-lite", 479 | ] 480 | 481 | [[package]] 482 | name = "event-listener-strategy" 483 | version = "0.5.2" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" 486 | dependencies = [ 487 | "event-listener", 488 | "pin-project-lite", 489 | ] 490 | 491 | [[package]] 492 | name = "flate2" 493 | version = "1.0.30" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" 496 | dependencies = [ 497 | "crc32fast", 498 | "miniz_oxide", 499 | ] 500 | 501 | [[package]] 502 | name = "fnv" 503 | version = "1.0.7" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 506 | 507 | [[package]] 508 | name = "form_urlencoded" 509 | version = "1.2.1" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 512 | dependencies = [ 513 | "percent-encoding", 514 | ] 515 | 516 | [[package]] 517 | name = "futures" 518 | version = "0.3.30" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 521 | dependencies = [ 522 | "futures-channel", 523 | "futures-core", 524 | "futures-executor", 525 | "futures-io", 526 | "futures-sink", 527 | "futures-task", 528 | "futures-util", 529 | ] 530 | 531 | [[package]] 532 | name = "futures-channel" 533 | version = "0.3.30" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 536 | dependencies = [ 537 | "futures-core", 538 | "futures-sink", 539 | ] 540 | 541 | [[package]] 542 | name = "futures-core" 543 | version = "0.3.30" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 546 | 547 | [[package]] 548 | name = "futures-executor" 549 | version = "0.3.30" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 552 | dependencies = [ 553 | "futures-core", 554 | "futures-task", 555 | "futures-util", 556 | ] 557 | 558 | [[package]] 559 | name = "futures-io" 560 | version = "0.3.30" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 563 | 564 | [[package]] 565 | name = "futures-macro" 566 | version = "0.3.30" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 569 | dependencies = [ 570 | "proc-macro2", 571 | "quote", 572 | "syn", 573 | ] 574 | 575 | [[package]] 576 | name = "futures-sink" 577 | version = "0.3.30" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 580 | 581 | [[package]] 582 | name = "futures-task" 583 | version = "0.3.30" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 586 | 587 | [[package]] 588 | name = "futures-util" 589 | version = "0.3.30" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 592 | dependencies = [ 593 | "futures-channel", 594 | "futures-core", 595 | "futures-io", 596 | "futures-macro", 597 | "futures-sink", 598 | "futures-task", 599 | "memchr", 600 | "pin-project-lite", 601 | "pin-utils", 602 | "slab", 603 | ] 604 | 605 | [[package]] 606 | name = "generator" 607 | version = "0.8.1" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "186014d53bc231d0090ef8d6f03e0920c54d85a5ed22f4f2f74315ec56cf83fb" 610 | dependencies = [ 611 | "cc", 612 | "cfg-if", 613 | "libc", 614 | "log", 615 | "rustversion", 616 | "windows", 617 | ] 618 | 619 | [[package]] 620 | name = "generic-array" 621 | version = "0.14.7" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 624 | dependencies = [ 625 | "typenum", 626 | "version_check", 627 | ] 628 | 629 | [[package]] 630 | name = "getrandom" 631 | version = "0.2.15" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 634 | dependencies = [ 635 | "cfg-if", 636 | "libc", 637 | "wasi", 638 | ] 639 | 640 | [[package]] 641 | name = "gimli" 642 | version = "0.29.0" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" 645 | 646 | [[package]] 647 | name = "h2" 648 | version = "0.4.5" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" 651 | dependencies = [ 652 | "atomic-waker", 653 | "bytes", 654 | "fnv", 655 | "futures-core", 656 | "futures-sink", 657 | "http", 658 | "indexmap", 659 | "slab", 660 | "tokio", 661 | "tokio-util", 662 | "tracing", 663 | ] 664 | 665 | [[package]] 666 | name = "hashbrown" 667 | version = "0.14.5" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 670 | 671 | [[package]] 672 | name = "heck" 673 | version = "0.5.0" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 676 | 677 | [[package]] 678 | name = "hermit-abi" 679 | version = "0.3.9" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 682 | 683 | [[package]] 684 | name = "http" 685 | version = "1.1.0" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 688 | dependencies = [ 689 | "bytes", 690 | "fnv", 691 | "itoa", 692 | ] 693 | 694 | [[package]] 695 | name = "http-body" 696 | version = "1.0.0" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 699 | dependencies = [ 700 | "bytes", 701 | "http", 702 | ] 703 | 704 | [[package]] 705 | name = "http-body-util" 706 | version = "0.1.2" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 709 | dependencies = [ 710 | "bytes", 711 | "futures-util", 712 | "http", 713 | "http-body", 714 | "pin-project-lite", 715 | ] 716 | 717 | [[package]] 718 | name = "httparse" 719 | version = "1.9.4" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" 722 | 723 | [[package]] 724 | name = "httpdate" 725 | version = "1.0.3" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 728 | 729 | [[package]] 730 | name = "hudsucker" 731 | version = "0.22.0" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "8bb9d62508d54891fe529dc3a3e169aa7938b89898ba5ab0431ac5bafe66a249" 734 | dependencies = [ 735 | "async-compression", 736 | "bstr", 737 | "futures", 738 | "http", 739 | "http-body-util", 740 | "hyper", 741 | "hyper-rustls", 742 | "hyper-tungstenite", 743 | "hyper-util", 744 | "moka", 745 | "rand", 746 | "rcgen", 747 | "thiserror", 748 | "time", 749 | "tokio", 750 | "tokio-graceful", 751 | "tokio-rustls", 752 | "tokio-tungstenite", 753 | "tokio-util", 754 | "tracing", 755 | ] 756 | 757 | [[package]] 758 | name = "hyper" 759 | version = "1.3.1" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" 762 | dependencies = [ 763 | "bytes", 764 | "futures-channel", 765 | "futures-util", 766 | "h2", 767 | "http", 768 | "http-body", 769 | "httparse", 770 | "httpdate", 771 | "itoa", 772 | "pin-project-lite", 773 | "smallvec", 774 | "tokio", 775 | "want", 776 | ] 777 | 778 | [[package]] 779 | name = "hyper-rustls" 780 | version = "0.26.0" 781 | source = "registry+https://github.com/rust-lang/crates.io-index" 782 | checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" 783 | dependencies = [ 784 | "futures-util", 785 | "http", 786 | "hyper", 787 | "hyper-util", 788 | "log", 789 | "rustls", 790 | "rustls-native-certs", 791 | "rustls-pki-types", 792 | "tokio", 793 | "tokio-rustls", 794 | "tower-service", 795 | "webpki-roots", 796 | ] 797 | 798 | [[package]] 799 | name = "hyper-tungstenite" 800 | version = "0.13.0" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "7a343d17fe7885302ed7252767dc7bb83609a874b6ff581142241ec4b73957ad" 803 | dependencies = [ 804 | "http-body-util", 805 | "hyper", 806 | "hyper-util", 807 | "pin-project-lite", 808 | "tokio", 809 | "tokio-tungstenite", 810 | "tungstenite", 811 | ] 812 | 813 | [[package]] 814 | name = "hyper-util" 815 | version = "0.1.5" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" 818 | dependencies = [ 819 | "bytes", 820 | "futures-channel", 821 | "futures-util", 822 | "http", 823 | "http-body", 824 | "hyper", 825 | "pin-project-lite", 826 | "socket2", 827 | "tokio", 828 | "tower", 829 | "tower-service", 830 | "tracing", 831 | ] 832 | 833 | [[package]] 834 | name = "idna" 835 | version = "0.5.0" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 838 | dependencies = [ 839 | "unicode-bidi", 840 | "unicode-normalization", 841 | ] 842 | 843 | [[package]] 844 | name = "indexmap" 845 | version = "2.2.6" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 848 | dependencies = [ 849 | "equivalent", 850 | "hashbrown", 851 | ] 852 | 853 | [[package]] 854 | name = "is_terminal_polyfill" 855 | version = "1.70.0" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" 858 | 859 | [[package]] 860 | name = "itoa" 861 | version = "1.0.11" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 864 | 865 | [[package]] 866 | name = "jobserver" 867 | version = "0.1.31" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" 870 | dependencies = [ 871 | "libc", 872 | ] 873 | 874 | [[package]] 875 | name = "js-sys" 876 | version = "0.3.69" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 879 | dependencies = [ 880 | "wasm-bindgen", 881 | ] 882 | 883 | [[package]] 884 | name = "lazy_static" 885 | version = "1.5.0" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 888 | 889 | [[package]] 890 | name = "libc" 891 | version = "0.2.155" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 894 | 895 | [[package]] 896 | name = "lock_api" 897 | version = "0.4.12" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 900 | dependencies = [ 901 | "autocfg", 902 | "scopeguard", 903 | ] 904 | 905 | [[package]] 906 | name = "log" 907 | version = "0.4.21" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 910 | 911 | [[package]] 912 | name = "loom" 913 | version = "0.7.2" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 916 | dependencies = [ 917 | "cfg-if", 918 | "generator", 919 | "pin-utils", 920 | "scoped-tls", 921 | "serde", 922 | "serde_json", 923 | "tracing", 924 | "tracing-subscriber", 925 | ] 926 | 927 | [[package]] 928 | name = "matchers" 929 | version = "0.1.0" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 932 | dependencies = [ 933 | "regex-automata 0.1.10", 934 | ] 935 | 936 | [[package]] 937 | name = "memchr" 938 | version = "2.7.4" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 941 | 942 | [[package]] 943 | name = "minimal-lexical" 944 | version = "0.2.1" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 947 | 948 | [[package]] 949 | name = "miniz_oxide" 950 | version = "0.7.4" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 953 | dependencies = [ 954 | "adler", 955 | ] 956 | 957 | [[package]] 958 | name = "mio" 959 | version = "0.8.11" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 962 | dependencies = [ 963 | "libc", 964 | "wasi", 965 | "windows-sys 0.48.0", 966 | ] 967 | 968 | [[package]] 969 | name = "mitm-cache" 970 | version = "0.1.2" 971 | dependencies = [ 972 | "base64 0.21.7", 973 | "clap", 974 | "futures-util", 975 | "http-body-util", 976 | "hudsucker", 977 | "hyper", 978 | "hyper-rustls", 979 | "hyper-util", 980 | "regex", 981 | "rustls-pemfile", 982 | "serde", 983 | "serde_json", 984 | "sha2", 985 | "tokio", 986 | ] 987 | 988 | [[package]] 989 | name = "moka" 990 | version = "0.12.7" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "9e0d88686dc561d743b40de8269b26eaf0dc58781bde087b0984646602021d08" 993 | dependencies = [ 994 | "async-lock", 995 | "async-trait", 996 | "crossbeam-channel", 997 | "crossbeam-epoch", 998 | "crossbeam-utils", 999 | "event-listener", 1000 | "futures-util", 1001 | "once_cell", 1002 | "parking_lot", 1003 | "quanta", 1004 | "rustc_version", 1005 | "smallvec", 1006 | "tagptr", 1007 | "thiserror", 1008 | "triomphe", 1009 | "uuid", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "nom" 1014 | version = "7.1.3" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1017 | dependencies = [ 1018 | "memchr", 1019 | "minimal-lexical", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "nu-ansi-term" 1024 | version = "0.46.0" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1027 | dependencies = [ 1028 | "overload", 1029 | "winapi", 1030 | ] 1031 | 1032 | [[package]] 1033 | name = "num-bigint" 1034 | version = "0.4.5" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" 1037 | dependencies = [ 1038 | "num-integer", 1039 | "num-traits", 1040 | ] 1041 | 1042 | [[package]] 1043 | name = "num-conv" 1044 | version = "0.1.0" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1047 | 1048 | [[package]] 1049 | name = "num-integer" 1050 | version = "0.1.46" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1053 | dependencies = [ 1054 | "num-traits", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "num-traits" 1059 | version = "0.2.19" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1062 | dependencies = [ 1063 | "autocfg", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "num_cpus" 1068 | version = "1.16.0" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1071 | dependencies = [ 1072 | "hermit-abi", 1073 | "libc", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "object" 1078 | version = "0.36.0" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" 1081 | dependencies = [ 1082 | "memchr", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "oid-registry" 1087 | version = "0.7.0" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" 1090 | dependencies = [ 1091 | "asn1-rs", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "once_cell" 1096 | version = "1.19.0" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1099 | 1100 | [[package]] 1101 | name = "openssl-probe" 1102 | version = "0.1.5" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1105 | 1106 | [[package]] 1107 | name = "overload" 1108 | version = "0.1.1" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1111 | 1112 | [[package]] 1113 | name = "parking" 1114 | version = "2.2.0" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" 1117 | 1118 | [[package]] 1119 | name = "parking_lot" 1120 | version = "0.12.3" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1123 | dependencies = [ 1124 | "lock_api", 1125 | "parking_lot_core", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "parking_lot_core" 1130 | version = "0.9.10" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1133 | dependencies = [ 1134 | "cfg-if", 1135 | "libc", 1136 | "redox_syscall", 1137 | "smallvec", 1138 | "windows-targets 0.52.5", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "pem" 1143 | version = "3.0.4" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" 1146 | dependencies = [ 1147 | "base64 0.22.1", 1148 | "serde", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "percent-encoding" 1153 | version = "2.3.1" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1156 | 1157 | [[package]] 1158 | name = "pin-project" 1159 | version = "1.1.5" 1160 | source = "registry+https://github.com/rust-lang/crates.io-index" 1161 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 1162 | dependencies = [ 1163 | "pin-project-internal", 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "pin-project-internal" 1168 | version = "1.1.5" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1171 | dependencies = [ 1172 | "proc-macro2", 1173 | "quote", 1174 | "syn", 1175 | ] 1176 | 1177 | [[package]] 1178 | name = "pin-project-lite" 1179 | version = "0.2.14" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1182 | 1183 | [[package]] 1184 | name = "pin-utils" 1185 | version = "0.1.0" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1188 | 1189 | [[package]] 1190 | name = "pkg-config" 1191 | version = "0.3.30" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1194 | 1195 | [[package]] 1196 | name = "powerfmt" 1197 | version = "0.2.0" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1200 | 1201 | [[package]] 1202 | name = "ppv-lite86" 1203 | version = "0.2.17" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1206 | 1207 | [[package]] 1208 | name = "proc-macro2" 1209 | version = "1.0.86" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 1212 | dependencies = [ 1213 | "unicode-ident", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "quanta" 1218 | version = "0.12.3" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" 1221 | dependencies = [ 1222 | "crossbeam-utils", 1223 | "libc", 1224 | "once_cell", 1225 | "raw-cpuid", 1226 | "wasi", 1227 | "web-sys", 1228 | "winapi", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "quote" 1233 | version = "1.0.36" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1236 | dependencies = [ 1237 | "proc-macro2", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "rand" 1242 | version = "0.8.5" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1245 | dependencies = [ 1246 | "libc", 1247 | "rand_chacha", 1248 | "rand_core", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "rand_chacha" 1253 | version = "0.3.1" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1256 | dependencies = [ 1257 | "ppv-lite86", 1258 | "rand_core", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "rand_core" 1263 | version = "0.6.4" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1266 | dependencies = [ 1267 | "getrandom", 1268 | ] 1269 | 1270 | [[package]] 1271 | name = "raw-cpuid" 1272 | version = "11.0.2" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" 1275 | dependencies = [ 1276 | "bitflags", 1277 | ] 1278 | 1279 | [[package]] 1280 | name = "rcgen" 1281 | version = "0.13.1" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "54077e1872c46788540de1ea3d7f4ccb1983d12f9aa909b234468676c1a36779" 1284 | dependencies = [ 1285 | "pem", 1286 | "ring", 1287 | "rustls-pki-types", 1288 | "time", 1289 | "x509-parser", 1290 | "yasna", 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "redox_syscall" 1295 | version = "0.5.2" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" 1298 | dependencies = [ 1299 | "bitflags", 1300 | ] 1301 | 1302 | [[package]] 1303 | name = "regex" 1304 | version = "1.10.5" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" 1307 | dependencies = [ 1308 | "aho-corasick", 1309 | "memchr", 1310 | "regex-automata 0.4.7", 1311 | "regex-syntax 0.8.4", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "regex-automata" 1316 | version = "0.1.10" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1319 | dependencies = [ 1320 | "regex-syntax 0.6.29", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "regex-automata" 1325 | version = "0.4.7" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 1328 | dependencies = [ 1329 | "aho-corasick", 1330 | "memchr", 1331 | "regex-syntax 0.8.4", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "regex-syntax" 1336 | version = "0.6.29" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1339 | 1340 | [[package]] 1341 | name = "regex-syntax" 1342 | version = "0.8.4" 1343 | source = "registry+https://github.com/rust-lang/crates.io-index" 1344 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 1345 | 1346 | [[package]] 1347 | name = "ring" 1348 | version = "0.17.8" 1349 | source = "registry+https://github.com/rust-lang/crates.io-index" 1350 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1351 | dependencies = [ 1352 | "cc", 1353 | "cfg-if", 1354 | "getrandom", 1355 | "libc", 1356 | "spin", 1357 | "untrusted", 1358 | "windows-sys 0.52.0", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "rustc-demangle" 1363 | version = "0.1.24" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1366 | 1367 | [[package]] 1368 | name = "rustc_version" 1369 | version = "0.4.0" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1372 | dependencies = [ 1373 | "semver", 1374 | ] 1375 | 1376 | [[package]] 1377 | name = "rusticata-macros" 1378 | version = "4.1.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" 1381 | dependencies = [ 1382 | "nom", 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "rustls" 1387 | version = "0.22.4" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" 1390 | dependencies = [ 1391 | "log", 1392 | "ring", 1393 | "rustls-pki-types", 1394 | "rustls-webpki", 1395 | "subtle", 1396 | "zeroize", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "rustls-native-certs" 1401 | version = "0.7.0" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" 1404 | dependencies = [ 1405 | "openssl-probe", 1406 | "rustls-pemfile", 1407 | "rustls-pki-types", 1408 | "schannel", 1409 | "security-framework", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "rustls-pemfile" 1414 | version = "2.1.2" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" 1417 | dependencies = [ 1418 | "base64 0.22.1", 1419 | "rustls-pki-types", 1420 | ] 1421 | 1422 | [[package]] 1423 | name = "rustls-pki-types" 1424 | version = "1.7.0" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" 1427 | 1428 | [[package]] 1429 | name = "rustls-webpki" 1430 | version = "0.102.4" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" 1433 | dependencies = [ 1434 | "ring", 1435 | "rustls-pki-types", 1436 | "untrusted", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "rustversion" 1441 | version = "1.0.17" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" 1444 | 1445 | [[package]] 1446 | name = "ryu" 1447 | version = "1.0.18" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1450 | 1451 | [[package]] 1452 | name = "schannel" 1453 | version = "0.1.23" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1456 | dependencies = [ 1457 | "windows-sys 0.52.0", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "scoped-tls" 1462 | version = "1.0.1" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 1465 | 1466 | [[package]] 1467 | name = "scopeguard" 1468 | version = "1.2.0" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1471 | 1472 | [[package]] 1473 | name = "security-framework" 1474 | version = "2.11.0" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" 1477 | dependencies = [ 1478 | "bitflags", 1479 | "core-foundation", 1480 | "core-foundation-sys", 1481 | "libc", 1482 | "security-framework-sys", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "security-framework-sys" 1487 | version = "2.11.0" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" 1490 | dependencies = [ 1491 | "core-foundation-sys", 1492 | "libc", 1493 | ] 1494 | 1495 | [[package]] 1496 | name = "semver" 1497 | version = "1.0.23" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" 1500 | 1501 | [[package]] 1502 | name = "serde" 1503 | version = "1.0.203" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" 1506 | dependencies = [ 1507 | "serde_derive", 1508 | ] 1509 | 1510 | [[package]] 1511 | name = "serde_derive" 1512 | version = "1.0.203" 1513 | source = "registry+https://github.com/rust-lang/crates.io-index" 1514 | checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" 1515 | dependencies = [ 1516 | "proc-macro2", 1517 | "quote", 1518 | "syn", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "serde_json" 1523 | version = "1.0.118" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" 1526 | dependencies = [ 1527 | "itoa", 1528 | "ryu", 1529 | "serde", 1530 | ] 1531 | 1532 | [[package]] 1533 | name = "sha1" 1534 | version = "0.10.6" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1537 | dependencies = [ 1538 | "cfg-if", 1539 | "cpufeatures", 1540 | "digest", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "sha2" 1545 | version = "0.10.8" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1548 | dependencies = [ 1549 | "cfg-if", 1550 | "cpufeatures", 1551 | "digest", 1552 | ] 1553 | 1554 | [[package]] 1555 | name = "sharded-slab" 1556 | version = "0.1.7" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1559 | dependencies = [ 1560 | "lazy_static", 1561 | ] 1562 | 1563 | [[package]] 1564 | name = "signal-hook-registry" 1565 | version = "1.4.2" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1568 | dependencies = [ 1569 | "libc", 1570 | ] 1571 | 1572 | [[package]] 1573 | name = "slab" 1574 | version = "0.4.9" 1575 | source = "registry+https://github.com/rust-lang/crates.io-index" 1576 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1577 | dependencies = [ 1578 | "autocfg", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "smallvec" 1583 | version = "1.13.2" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1586 | 1587 | [[package]] 1588 | name = "socket2" 1589 | version = "0.5.7" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1592 | dependencies = [ 1593 | "libc", 1594 | "windows-sys 0.52.0", 1595 | ] 1596 | 1597 | [[package]] 1598 | name = "spin" 1599 | version = "0.9.8" 1600 | source = "registry+https://github.com/rust-lang/crates.io-index" 1601 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1602 | 1603 | [[package]] 1604 | name = "strsim" 1605 | version = "0.11.1" 1606 | source = "registry+https://github.com/rust-lang/crates.io-index" 1607 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1608 | 1609 | [[package]] 1610 | name = "subtle" 1611 | version = "2.6.1" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1614 | 1615 | [[package]] 1616 | name = "syn" 1617 | version = "2.0.68" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" 1620 | dependencies = [ 1621 | "proc-macro2", 1622 | "quote", 1623 | "unicode-ident", 1624 | ] 1625 | 1626 | [[package]] 1627 | name = "synstructure" 1628 | version = "0.13.1" 1629 | source = "registry+https://github.com/rust-lang/crates.io-index" 1630 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1631 | dependencies = [ 1632 | "proc-macro2", 1633 | "quote", 1634 | "syn", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "tagptr" 1639 | version = "0.2.0" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 1642 | 1643 | [[package]] 1644 | name = "thiserror" 1645 | version = "1.0.61" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" 1648 | dependencies = [ 1649 | "thiserror-impl", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "thiserror-impl" 1654 | version = "1.0.61" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" 1657 | dependencies = [ 1658 | "proc-macro2", 1659 | "quote", 1660 | "syn", 1661 | ] 1662 | 1663 | [[package]] 1664 | name = "thread_local" 1665 | version = "1.1.8" 1666 | source = "registry+https://github.com/rust-lang/crates.io-index" 1667 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1668 | dependencies = [ 1669 | "cfg-if", 1670 | "once_cell", 1671 | ] 1672 | 1673 | [[package]] 1674 | name = "time" 1675 | version = "0.3.36" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 1678 | dependencies = [ 1679 | "deranged", 1680 | "itoa", 1681 | "num-conv", 1682 | "powerfmt", 1683 | "serde", 1684 | "time-core", 1685 | "time-macros", 1686 | ] 1687 | 1688 | [[package]] 1689 | name = "time-core" 1690 | version = "0.1.2" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1693 | 1694 | [[package]] 1695 | name = "time-macros" 1696 | version = "0.2.18" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 1699 | dependencies = [ 1700 | "num-conv", 1701 | "time-core", 1702 | ] 1703 | 1704 | [[package]] 1705 | name = "tinyvec" 1706 | version = "1.6.1" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" 1709 | dependencies = [ 1710 | "tinyvec_macros", 1711 | ] 1712 | 1713 | [[package]] 1714 | name = "tinyvec_macros" 1715 | version = "0.1.1" 1716 | source = "registry+https://github.com/rust-lang/crates.io-index" 1717 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1718 | 1719 | [[package]] 1720 | name = "tokio" 1721 | version = "1.38.0" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" 1724 | dependencies = [ 1725 | "backtrace", 1726 | "bytes", 1727 | "libc", 1728 | "mio", 1729 | "num_cpus", 1730 | "pin-project-lite", 1731 | "signal-hook-registry", 1732 | "socket2", 1733 | "tokio-macros", 1734 | "windows-sys 0.48.0", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "tokio-graceful" 1739 | version = "0.1.6" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "627ba4daa4cbce14740603401c895e72d47ecd86690a18e3f0841266e9340de7" 1742 | dependencies = [ 1743 | "loom", 1744 | "pin-project-lite", 1745 | "slab", 1746 | "tokio", 1747 | "tracing", 1748 | ] 1749 | 1750 | [[package]] 1751 | name = "tokio-macros" 1752 | version = "2.3.0" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" 1755 | dependencies = [ 1756 | "proc-macro2", 1757 | "quote", 1758 | "syn", 1759 | ] 1760 | 1761 | [[package]] 1762 | name = "tokio-rustls" 1763 | version = "0.25.0" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" 1766 | dependencies = [ 1767 | "rustls", 1768 | "rustls-pki-types", 1769 | "tokio", 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "tokio-tungstenite" 1774 | version = "0.21.0" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" 1777 | dependencies = [ 1778 | "futures-util", 1779 | "log", 1780 | "rustls", 1781 | "rustls-pki-types", 1782 | "tokio", 1783 | "tokio-rustls", 1784 | "tungstenite", 1785 | "webpki-roots", 1786 | ] 1787 | 1788 | [[package]] 1789 | name = "tokio-util" 1790 | version = "0.7.11" 1791 | source = "registry+https://github.com/rust-lang/crates.io-index" 1792 | checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" 1793 | dependencies = [ 1794 | "bytes", 1795 | "futures-core", 1796 | "futures-sink", 1797 | "pin-project-lite", 1798 | "tokio", 1799 | ] 1800 | 1801 | [[package]] 1802 | name = "tower" 1803 | version = "0.4.13" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1806 | dependencies = [ 1807 | "futures-core", 1808 | "futures-util", 1809 | "pin-project", 1810 | "pin-project-lite", 1811 | "tokio", 1812 | "tower-layer", 1813 | "tower-service", 1814 | ] 1815 | 1816 | [[package]] 1817 | name = "tower-layer" 1818 | version = "0.3.2" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1821 | 1822 | [[package]] 1823 | name = "tower-service" 1824 | version = "0.3.2" 1825 | source = "registry+https://github.com/rust-lang/crates.io-index" 1826 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1827 | 1828 | [[package]] 1829 | name = "tracing" 1830 | version = "0.1.40" 1831 | source = "registry+https://github.com/rust-lang/crates.io-index" 1832 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1833 | dependencies = [ 1834 | "log", 1835 | "pin-project-lite", 1836 | "tracing-attributes", 1837 | "tracing-core", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "tracing-attributes" 1842 | version = "0.1.27" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1845 | dependencies = [ 1846 | "proc-macro2", 1847 | "quote", 1848 | "syn", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "tracing-core" 1853 | version = "0.1.32" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1856 | dependencies = [ 1857 | "once_cell", 1858 | "valuable", 1859 | ] 1860 | 1861 | [[package]] 1862 | name = "tracing-log" 1863 | version = "0.2.0" 1864 | source = "registry+https://github.com/rust-lang/crates.io-index" 1865 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1866 | dependencies = [ 1867 | "log", 1868 | "once_cell", 1869 | "tracing-core", 1870 | ] 1871 | 1872 | [[package]] 1873 | name = "tracing-subscriber" 1874 | version = "0.3.18" 1875 | source = "registry+https://github.com/rust-lang/crates.io-index" 1876 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 1877 | dependencies = [ 1878 | "matchers", 1879 | "nu-ansi-term", 1880 | "once_cell", 1881 | "regex", 1882 | "sharded-slab", 1883 | "smallvec", 1884 | "thread_local", 1885 | "tracing", 1886 | "tracing-core", 1887 | "tracing-log", 1888 | ] 1889 | 1890 | [[package]] 1891 | name = "triomphe" 1892 | version = "0.1.13" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" 1895 | 1896 | [[package]] 1897 | name = "try-lock" 1898 | version = "0.2.5" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1901 | 1902 | [[package]] 1903 | name = "tungstenite" 1904 | version = "0.21.0" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" 1907 | dependencies = [ 1908 | "byteorder", 1909 | "bytes", 1910 | "data-encoding", 1911 | "http", 1912 | "httparse", 1913 | "log", 1914 | "rand", 1915 | "rustls", 1916 | "rustls-pki-types", 1917 | "sha1", 1918 | "thiserror", 1919 | "url", 1920 | "utf-8", 1921 | ] 1922 | 1923 | [[package]] 1924 | name = "typenum" 1925 | version = "1.17.0" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1928 | 1929 | [[package]] 1930 | name = "unicode-bidi" 1931 | version = "0.3.15" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1934 | 1935 | [[package]] 1936 | name = "unicode-ident" 1937 | version = "1.0.12" 1938 | source = "registry+https://github.com/rust-lang/crates.io-index" 1939 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1940 | 1941 | [[package]] 1942 | name = "unicode-normalization" 1943 | version = "0.1.23" 1944 | source = "registry+https://github.com/rust-lang/crates.io-index" 1945 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1946 | dependencies = [ 1947 | "tinyvec", 1948 | ] 1949 | 1950 | [[package]] 1951 | name = "untrusted" 1952 | version = "0.9.0" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1955 | 1956 | [[package]] 1957 | name = "url" 1958 | version = "2.5.2" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 1961 | dependencies = [ 1962 | "form_urlencoded", 1963 | "idna", 1964 | "percent-encoding", 1965 | ] 1966 | 1967 | [[package]] 1968 | name = "utf-8" 1969 | version = "0.7.6" 1970 | source = "registry+https://github.com/rust-lang/crates.io-index" 1971 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1972 | 1973 | [[package]] 1974 | name = "utf8parse" 1975 | version = "0.2.2" 1976 | source = "registry+https://github.com/rust-lang/crates.io-index" 1977 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1978 | 1979 | [[package]] 1980 | name = "uuid" 1981 | version = "1.9.1" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" 1984 | dependencies = [ 1985 | "getrandom", 1986 | ] 1987 | 1988 | [[package]] 1989 | name = "valuable" 1990 | version = "0.1.0" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 1993 | 1994 | [[package]] 1995 | name = "version_check" 1996 | version = "0.9.4" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1999 | 2000 | [[package]] 2001 | name = "want" 2002 | version = "0.3.1" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2005 | dependencies = [ 2006 | "try-lock", 2007 | ] 2008 | 2009 | [[package]] 2010 | name = "wasi" 2011 | version = "0.11.0+wasi-snapshot-preview1" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2014 | 2015 | [[package]] 2016 | name = "wasm-bindgen" 2017 | version = "0.2.92" 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" 2019 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2020 | dependencies = [ 2021 | "cfg-if", 2022 | "wasm-bindgen-macro", 2023 | ] 2024 | 2025 | [[package]] 2026 | name = "wasm-bindgen-backend" 2027 | version = "0.2.92" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2030 | dependencies = [ 2031 | "bumpalo", 2032 | "log", 2033 | "once_cell", 2034 | "proc-macro2", 2035 | "quote", 2036 | "syn", 2037 | "wasm-bindgen-shared", 2038 | ] 2039 | 2040 | [[package]] 2041 | name = "wasm-bindgen-macro" 2042 | version = "0.2.92" 2043 | source = "registry+https://github.com/rust-lang/crates.io-index" 2044 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2045 | dependencies = [ 2046 | "quote", 2047 | "wasm-bindgen-macro-support", 2048 | ] 2049 | 2050 | [[package]] 2051 | name = "wasm-bindgen-macro-support" 2052 | version = "0.2.92" 2053 | source = "registry+https://github.com/rust-lang/crates.io-index" 2054 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2055 | dependencies = [ 2056 | "proc-macro2", 2057 | "quote", 2058 | "syn", 2059 | "wasm-bindgen-backend", 2060 | "wasm-bindgen-shared", 2061 | ] 2062 | 2063 | [[package]] 2064 | name = "wasm-bindgen-shared" 2065 | version = "0.2.92" 2066 | source = "registry+https://github.com/rust-lang/crates.io-index" 2067 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2068 | 2069 | [[package]] 2070 | name = "web-sys" 2071 | version = "0.3.69" 2072 | source = "registry+https://github.com/rust-lang/crates.io-index" 2073 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 2074 | dependencies = [ 2075 | "js-sys", 2076 | "wasm-bindgen", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "webpki-roots" 2081 | version = "0.26.3" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" 2084 | dependencies = [ 2085 | "rustls-pki-types", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "winapi" 2090 | version = "0.3.9" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2093 | dependencies = [ 2094 | "winapi-i686-pc-windows-gnu", 2095 | "winapi-x86_64-pc-windows-gnu", 2096 | ] 2097 | 2098 | [[package]] 2099 | name = "winapi-i686-pc-windows-gnu" 2100 | version = "0.4.0" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2103 | 2104 | [[package]] 2105 | name = "winapi-x86_64-pc-windows-gnu" 2106 | version = "0.4.0" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2109 | 2110 | [[package]] 2111 | name = "windows" 2112 | version = "0.54.0" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" 2115 | dependencies = [ 2116 | "windows-core", 2117 | "windows-targets 0.52.5", 2118 | ] 2119 | 2120 | [[package]] 2121 | name = "windows-core" 2122 | version = "0.54.0" 2123 | source = "registry+https://github.com/rust-lang/crates.io-index" 2124 | checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" 2125 | dependencies = [ 2126 | "windows-result", 2127 | "windows-targets 0.52.5", 2128 | ] 2129 | 2130 | [[package]] 2131 | name = "windows-result" 2132 | version = "0.1.2" 2133 | source = "registry+https://github.com/rust-lang/crates.io-index" 2134 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 2135 | dependencies = [ 2136 | "windows-targets 0.52.5", 2137 | ] 2138 | 2139 | [[package]] 2140 | name = "windows-sys" 2141 | version = "0.48.0" 2142 | source = "registry+https://github.com/rust-lang/crates.io-index" 2143 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2144 | dependencies = [ 2145 | "windows-targets 0.48.5", 2146 | ] 2147 | 2148 | [[package]] 2149 | name = "windows-sys" 2150 | version = "0.52.0" 2151 | source = "registry+https://github.com/rust-lang/crates.io-index" 2152 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2153 | dependencies = [ 2154 | "windows-targets 0.52.5", 2155 | ] 2156 | 2157 | [[package]] 2158 | name = "windows-targets" 2159 | version = "0.48.5" 2160 | source = "registry+https://github.com/rust-lang/crates.io-index" 2161 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2162 | dependencies = [ 2163 | "windows_aarch64_gnullvm 0.48.5", 2164 | "windows_aarch64_msvc 0.48.5", 2165 | "windows_i686_gnu 0.48.5", 2166 | "windows_i686_msvc 0.48.5", 2167 | "windows_x86_64_gnu 0.48.5", 2168 | "windows_x86_64_gnullvm 0.48.5", 2169 | "windows_x86_64_msvc 0.48.5", 2170 | ] 2171 | 2172 | [[package]] 2173 | name = "windows-targets" 2174 | version = "0.52.5" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 2177 | dependencies = [ 2178 | "windows_aarch64_gnullvm 0.52.5", 2179 | "windows_aarch64_msvc 0.52.5", 2180 | "windows_i686_gnu 0.52.5", 2181 | "windows_i686_gnullvm", 2182 | "windows_i686_msvc 0.52.5", 2183 | "windows_x86_64_gnu 0.52.5", 2184 | "windows_x86_64_gnullvm 0.52.5", 2185 | "windows_x86_64_msvc 0.52.5", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "windows_aarch64_gnullvm" 2190 | version = "0.48.5" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2193 | 2194 | [[package]] 2195 | name = "windows_aarch64_gnullvm" 2196 | version = "0.52.5" 2197 | source = "registry+https://github.com/rust-lang/crates.io-index" 2198 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 2199 | 2200 | [[package]] 2201 | name = "windows_aarch64_msvc" 2202 | version = "0.48.5" 2203 | source = "registry+https://github.com/rust-lang/crates.io-index" 2204 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2205 | 2206 | [[package]] 2207 | name = "windows_aarch64_msvc" 2208 | version = "0.52.5" 2209 | source = "registry+https://github.com/rust-lang/crates.io-index" 2210 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 2211 | 2212 | [[package]] 2213 | name = "windows_i686_gnu" 2214 | version = "0.48.5" 2215 | source = "registry+https://github.com/rust-lang/crates.io-index" 2216 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2217 | 2218 | [[package]] 2219 | name = "windows_i686_gnu" 2220 | version = "0.52.5" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 2223 | 2224 | [[package]] 2225 | name = "windows_i686_gnullvm" 2226 | version = "0.52.5" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 2229 | 2230 | [[package]] 2231 | name = "windows_i686_msvc" 2232 | version = "0.48.5" 2233 | source = "registry+https://github.com/rust-lang/crates.io-index" 2234 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2235 | 2236 | [[package]] 2237 | name = "windows_i686_msvc" 2238 | version = "0.52.5" 2239 | source = "registry+https://github.com/rust-lang/crates.io-index" 2240 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 2241 | 2242 | [[package]] 2243 | name = "windows_x86_64_gnu" 2244 | version = "0.48.5" 2245 | source = "registry+https://github.com/rust-lang/crates.io-index" 2246 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2247 | 2248 | [[package]] 2249 | name = "windows_x86_64_gnu" 2250 | version = "0.52.5" 2251 | source = "registry+https://github.com/rust-lang/crates.io-index" 2252 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 2253 | 2254 | [[package]] 2255 | name = "windows_x86_64_gnullvm" 2256 | version = "0.48.5" 2257 | source = "registry+https://github.com/rust-lang/crates.io-index" 2258 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2259 | 2260 | [[package]] 2261 | name = "windows_x86_64_gnullvm" 2262 | version = "0.52.5" 2263 | source = "registry+https://github.com/rust-lang/crates.io-index" 2264 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 2265 | 2266 | [[package]] 2267 | name = "windows_x86_64_msvc" 2268 | version = "0.48.5" 2269 | source = "registry+https://github.com/rust-lang/crates.io-index" 2270 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2271 | 2272 | [[package]] 2273 | name = "windows_x86_64_msvc" 2274 | version = "0.52.5" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 2277 | 2278 | [[package]] 2279 | name = "x509-parser" 2280 | version = "0.16.0" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" 2283 | dependencies = [ 2284 | "asn1-rs", 2285 | "data-encoding", 2286 | "der-parser", 2287 | "lazy_static", 2288 | "nom", 2289 | "oid-registry", 2290 | "ring", 2291 | "rusticata-macros", 2292 | "thiserror", 2293 | "time", 2294 | ] 2295 | 2296 | [[package]] 2297 | name = "yasna" 2298 | version = "0.5.2" 2299 | source = "registry+https://github.com/rust-lang/crates.io-index" 2300 | checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" 2301 | dependencies = [ 2302 | "time", 2303 | ] 2304 | 2305 | [[package]] 2306 | name = "zeroize" 2307 | version = "1.8.1" 2308 | source = "registry+https://github.com/rust-lang/crates.io-index" 2309 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2310 | 2311 | [[package]] 2312 | name = "zstd" 2313 | version = "0.13.1" 2314 | source = "registry+https://github.com/rust-lang/crates.io-index" 2315 | checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" 2316 | dependencies = [ 2317 | "zstd-safe", 2318 | ] 2319 | 2320 | [[package]] 2321 | name = "zstd-safe" 2322 | version = "7.1.0" 2323 | source = "registry+https://github.com/rust-lang/crates.io-index" 2324 | checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" 2325 | dependencies = [ 2326 | "zstd-sys", 2327 | ] 2328 | 2329 | [[package]] 2330 | name = "zstd-sys" 2331 | version = "2.0.11+zstd.1.5.6" 2332 | source = "registry+https://github.com/rust-lang/crates.io-index" 2333 | checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" 2334 | dependencies = [ 2335 | "cc", 2336 | "pkg-config", 2337 | ] 2338 | --------------------------------------------------------------------------------