From 0b10737403b7edee11477222c28de71e6f039ae8 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 17:26:56 +0000 Subject: [PATCH 01/46] :recycle: refactor: move ptth_server's main into its library so I can make a busybox-style multi-use binary --- Cargo.lock | 1 + crates/ptth_core/Cargo.toml | 1 + crates/ptth_core/src/prelude.rs | 5 + crates/ptth_server/src/bin/ptth_server.rs | 122 +----------------- crates/ptth_server/src/lib.rs | 146 ++++++++++++++++++++-- crates/ptth_server/src/prelude.rs | 9 +- 6 files changed, 144 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ae75527..274dee2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1158,6 +1158,7 @@ dependencies = [ name = "ptth_core" version = "2.0.0" dependencies = [ + "anyhow", "base64", "ctrlc", "futures", diff --git a/crates/ptth_core/Cargo.toml b/crates/ptth_core/Cargo.toml index 636bc79..566d6e5 100644 --- a/crates/ptth_core/Cargo.toml +++ b/crates/ptth_core/Cargo.toml @@ -10,6 +10,7 @@ description = "Common code for the PTTH relay and server" [dependencies] +anyhow = "1.0.38" base64 = "0.13.0" ctrlc = { version = "3.1.8", features = [ "termination" ] } futures = "0.3.7" diff --git a/crates/ptth_core/src/prelude.rs b/crates/ptth_core/src/prelude.rs index 44db49e..4a2b7d2 100644 --- a/crates/ptth_core/src/prelude.rs +++ b/crates/ptth_core/src/prelude.rs @@ -1,8 +1,13 @@ pub use std::{ + io::Write, sync::Arc, time::{Duration, Instant}, }; +pub use anyhow::{ + Context, + bail, +}; pub use tracing::{ debug, error, info, trace, warn, instrument, diff --git a/crates/ptth_server/src/bin/ptth_server.rs b/crates/ptth_server/src/bin/ptth_server.rs index 4a47bc6..06eeaea 100644 --- a/crates/ptth_server/src/bin/ptth_server.rs +++ b/crates/ptth_server/src/bin/ptth_server.rs @@ -1,126 +1,8 @@ #![warn (clippy::pedantic)] -use std::{ - fs::File, - path::{Path, PathBuf}, -}; - -use structopt::StructOpt; - -use ptth_server::{ - load_toml, - prelude::*, - run_server, -}; - -#[derive (Debug, StructOpt)] -struct Opt { - #[structopt (long)] - auto_gen_key: bool, - - #[structopt (long)] - throttle_upload: bool, - - #[structopt (long)] - file_server_root: Option , - - #[structopt (long)] - asset_root: Option , - - #[structopt (long)] - config_path: Option , - - #[structopt (long)] - name: Option , - - #[structopt (long)] - print_tripcode: bool, - - #[structopt (long)] - relay_url: Option , -} - -#[derive (Default, serde::Deserialize)] -pub struct ConfigFile { - pub name: Option , - pub api_key: String, - pub relay_url: Option , - pub file_server_root: Option , -} - -fn gen_and_save_key (path: &Path) -> anyhow::Result <()> { - let api_key = ptth_core::gen_key (); - - let mut f = File::create (path).with_context (|| format! ("Can't create config file `{:?}`", path))?; - - #[cfg (unix)] - { - use std::os::unix::fs::PermissionsExt; - - let metadata = f.metadata ()?; - let mut permissions = metadata.permissions (); - permissions.set_mode (0o600); - f.set_permissions (permissions)?; - } - #[cfg (not (unix))] - { - tracing::warn! ("Error VR6VW5QT: API keys aren't protected from clients on non-Unix OSes yet"); - } - - f.write_all (format! ("api_key = \"{}\"\n", api_key).as_bytes ())?; - - Ok (()) -} - #[tokio::main] -async fn main () -> Result <(), anyhow::Error> { +async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); - let opt = Opt::from_args (); - let asset_root = opt.asset_root; - - let path = opt.config_path.clone ().unwrap_or_else (|| PathBuf::from ("./config/ptth_server.toml")); - - let config_file: ConfigFile = if opt.auto_gen_key { - // If we're in autonomous mode, try harder to fix things - - match load_toml::load (&path) { - Err (_) => { - gen_and_save_key (&path)?; - - load_toml::load (&path)? - }, - Ok (x) => x, - } - } - else { - match load_toml::load (&path) { - Err (ptth_server::errors::LoadTomlError::Io (_)) => bail! ("API key not provided in config file and auto-gen-key not provided"), - Ok (x) => x, - Err (e) => return Err (e.into ()), - } - }; - - let config_file = ptth_server::ConfigFile { - name: opt.name.or (config_file.name).ok_or (anyhow::anyhow! ("`name` must be provided in command line or config file"))?, - api_key: config_file.api_key, - relay_url: opt.relay_url.or (config_file.relay_url).ok_or (anyhow::anyhow! ("`--relay-url` must be provided in command line or `relay_url` in config file"))?, - file_server_root: opt.file_server_root.or (config_file.file_server_root), - throttle_upload: opt.throttle_upload, - }; - - if opt.print_tripcode { - println! (r#"name = "{}""#, config_file.name); - println! (r#"tripcode = "{}""#, config_file.tripcode ()); - return Ok (()); - } - - run_server ( - config_file, - ptth_core::graceful_shutdown::init (), - Some (path), - asset_root - ).await?; - - Ok (()) + ptth_server::executable::main ().await } diff --git a/crates/ptth_server/src/lib.rs b/crates/ptth_server/src/lib.rs index 4f4875f..25f8d61 100644 --- a/crates/ptth_server/src/lib.rs +++ b/crates/ptth_server/src/lib.rs @@ -39,6 +39,17 @@ // False positive on futures::select! macro #![allow (clippy::mut_mut)] +pub mod errors; + +/// In-process file server module with byte range and ETag support +pub mod file_server; + +/// Load and de-serialize structures from TOML, with a size limit +/// and checking permissions (On Unix) +pub mod load_toml; + +pub mod prelude; + use std::{ future::Future, path::PathBuf, @@ -58,21 +69,10 @@ use tokio_stream::wrappers::ReceiverStream; use ptth_core::{ http_serde, - prelude::*, }; -pub mod errors; - -/// In-process file server module with byte range and ETag support -pub mod file_server; - -/// Load and de-serialize structures from TOML, with a size limit -/// and checking permissions (On Unix) -pub mod load_toml; - -pub mod prelude; - use errors::ServerError; +use prelude::*; pub struct State { // file_server: file_server::FileServer, @@ -480,6 +480,128 @@ impl State { } } +pub mod executable { + use std::{ + path::{Path, PathBuf}, + }; + use structopt::StructOpt; + use super::{ + load_toml, + prelude::*, + }; + + pub async fn main () -> anyhow::Result <()> { + let opt = Opt::from_args (); + let asset_root = opt.asset_root; + + let path = opt.config_path.clone ().unwrap_or_else (|| PathBuf::from ("./config/ptth_server.toml")); + + let config_file: ConfigFile = if opt.auto_gen_key { + // If we're in autonomous mode, try harder to fix things + + match load_toml::load (&path) { + Err (_) => { + gen_and_save_key (&path)?; + + load_toml::load (&path)? + }, + Ok (x) => x, + } + } + else { + match load_toml::load (&path) { + Err (super::errors::LoadTomlError::Io (_)) => bail! ("API key not provided in config file and auto-gen-key not provided"), + Ok (x) => x, + Err (e) => return Err (e.into ()), + } + }; + + let config_file = super::ConfigFile { + name: opt.name.or (config_file.name).ok_or (anyhow::anyhow! ("`name` must be provided in command line or config file"))?, + api_key: config_file.api_key, + relay_url: opt.relay_url.or (config_file.relay_url).ok_or (anyhow::anyhow! ("`--relay-url` must be provided in command line or `relay_url` in config file"))?, + file_server_root: opt.file_server_root.or (config_file.file_server_root), + throttle_upload: opt.throttle_upload, + }; + + if opt.print_tripcode { + println! (r#"name = "{}""#, config_file.name); + println! (r#"tripcode = "{}""#, config_file.tripcode ()); + return Ok (()); + } + + super::run_server ( + config_file, + ptth_core::graceful_shutdown::init (), + Some (path), + asset_root + ).await?; + + Ok (()) + } + + #[derive (Debug, StructOpt)] + struct Opt { + #[structopt (long)] + auto_gen_key: bool, + + #[structopt (long)] + throttle_upload: bool, + + #[structopt (long)] + file_server_root: Option , + + #[structopt (long)] + asset_root: Option , + + #[structopt (long)] + config_path: Option , + + #[structopt (long)] + name: Option , + + #[structopt (long)] + print_tripcode: bool, + + #[structopt (long)] + relay_url: Option , + } + + #[derive (Default, serde::Deserialize)] + struct ConfigFile { + pub name: Option , + pub api_key: String, + pub relay_url: Option , + pub file_server_root: Option , + } + + fn gen_and_save_key (path: &Path) -> anyhow::Result <()> { + use std::fs::File; + + let api_key = ptth_core::gen_key (); + + let mut f = File::create (path).with_context (|| format! ("Can't create config file `{:?}`", path))?; + + #[cfg (unix)] + { + use std::os::unix::fs::PermissionsExt; + + let metadata = f.metadata ()?; + let mut permissions = metadata.permissions (); + permissions.set_mode (0o600); + f.set_permissions (permissions)?; + } + #[cfg (not (unix))] + { + tracing::warn! ("Error VR6VW5QT: API keys aren't protected from clients on non-Unix OSes yet"); + } + + f.write_all (format! ("api_key = \"{}\"\n", api_key).as_bytes ())?; + + Ok (()) + } +} + #[cfg (test)] mod tests { use super::*; diff --git a/crates/ptth_server/src/prelude.rs b/crates/ptth_server/src/prelude.rs index 7b25ad1..61786cc 100644 --- a/crates/ptth_server/src/prelude.rs +++ b/crates/ptth_server/src/prelude.rs @@ -1,8 +1 @@ -pub use std::{ - io::Write, -}; - -pub use anyhow::{ - Context, - bail, -}; +pub use ptth_core::prelude::*; From 30f8bbb0aa88279f1eec68fde77574300182f5df Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 17:31:06 +0000 Subject: [PATCH 02/46] :recycle: refactor inject CLI args instead of reading them in main --- crates/ptth_server/src/bin/ptth_server.rs | 4 +++- crates/ptth_server/src/lib.rs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/ptth_server/src/bin/ptth_server.rs b/crates/ptth_server/src/bin/ptth_server.rs index 06eeaea..a069c0a 100644 --- a/crates/ptth_server/src/bin/ptth_server.rs +++ b/crates/ptth_server/src/bin/ptth_server.rs @@ -4,5 +4,7 @@ async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); - ptth_server::executable::main ().await + let args = std::env::args_os (); + + ptth_server::executable::main (args).await } diff --git a/crates/ptth_server/src/lib.rs b/crates/ptth_server/src/lib.rs index 25f8d61..0d3455c 100644 --- a/crates/ptth_server/src/lib.rs +++ b/crates/ptth_server/src/lib.rs @@ -490,8 +490,8 @@ pub mod executable { prelude::*, }; - pub async fn main () -> anyhow::Result <()> { - let opt = Opt::from_args (); + pub async fn main (args: std::env::ArgsOs) -> anyhow::Result <()> { + let opt = Opt::from_iter (args); let asset_root = opt.asset_root; let path = opt.config_path.clone ().unwrap_or_else (|| PathBuf::from ("./config/ptth_server.toml")); From 97fc2c74d460dec50f9f7b5cf7a7082b3ee6bbb0 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 17:39:03 +0000 Subject: [PATCH 03/46] :recycle: refactor: extract PTTH_QUIC end server to a module in the PTTH_QUIC lib --- .../quic_demo/src/bin/quic_demo_end_server.rs | 103 +---------------- .../quic_demo/src/executable_end_server.rs | 104 ++++++++++++++++++ prototypes/quic_demo/src/lib.rs | 1 + 3 files changed, 107 insertions(+), 101 deletions(-) create mode 100644 prototypes/quic_demo/src/executable_end_server.rs diff --git a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs index 5f28433..86c3cc8 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs @@ -1,107 +1,8 @@ -use structopt::StructOpt; -use tokio::net::TcpStream; - -use quic_demo::prelude::*; -use protocol::PeerId; - -#[derive (Debug, StructOpt)] -struct Opt { - #[structopt (long)] - relay_addr: Option , - #[structopt (long)] - server_id: Option , - #[structopt (long)] - debug_echo: bool, - #[structopt (long)] - cert_url: Option , -} - #[tokio::main] async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); - let opt = Arc::new (Opt::from_args ()); + let args = std::env::args_os (); - let server_cert = match opt.cert_url.as_ref () { - Some (url) => reqwest::get (url).await?.bytes ().await?, - None => tokio::fs::read ("quic_server.crt").await?.into (), - }; - let relay_addr = opt.relay_addr.clone ().unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; - let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; - - trace! ("Connecting to relay server"); - - let server_id = opt.server_id.clone ().unwrap_or_else (|| "bogus_server".to_string ()); - - let quinn::NewConnection { - mut bi_streams, - .. - } = protocol::p4_connect_to_p3 (&endpoint, &relay_addr, &server_id).await?; - - debug! ("Connected to relay server"); - trace! ("Accepting bi streams from P3"); - - loop { - let (relay_send, relay_recv) = bi_streams.next ().await.ok_or_else (|| anyhow::anyhow! ("Relay server didn't open a bi stream"))??; - - tokio::spawn (handle_bi_stream (Arc::clone (&opt), relay_send, relay_recv)); - } -} - -async fn handle_bi_stream ( - opt: Arc , - relay_send: quinn::SendStream, - mut relay_recv: quinn::RecvStream, -) -> anyhow::Result <()> -{ - match protocol::p4_accept_p3_stream (&mut relay_recv).await? { - protocol::P3ToP4Stream::NewPtthConnection { - client_id, - .. - } => handle_new_ptth_connection (opt, relay_send, relay_recv, client_id).await?, - } - - Ok (()) -} - -async fn handle_new_ptth_connection ( - opt: Arc , - mut relay_send: quinn::SendStream, - mut relay_recv: quinn::RecvStream, - _client_id: String, -) -> anyhow::Result <()> -{ - // TODO: Check authorization for P2 --> P4 - - protocol::p4_authorize_p2_connection (&mut relay_send).await?; - let p4_to_p5_req = protocol::p4_expect_p5_request (&mut relay_recv).await?; - - // TODO: Check authorization for P1 --> P5 - - protocol::p4_authorize_p1_connection (&mut relay_send).await?; - - debug! ("Started PTTH connection"); - - if opt.debug_echo { - relay_send.write (b"Connected to P4=P5 debug echo server\n").await?; - debug! ("Relaying bytes using internal debug echo server (P4=P5)"); - tokio::io::copy (&mut relay_recv, &mut relay_send).await?; - } - else { - let stream = TcpStream::connect (("127.0.0.1", p4_to_p5_req.port)).await?; - let (local_recv, local_send) = stream.into_split (); - - trace! ("Relaying bytes..."); - - let ptth_conn = quic_demo::connection::NewConnection { - local_send, - local_recv, - relay_send, - relay_recv, - }.build (); - - ptth_conn.wait_for_close ().await?; - } - - Ok (()) + quic_demo::executable_end_server::main (args).await } diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs new file mode 100644 index 0000000..62804ac --- /dev/null +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -0,0 +1,104 @@ +use structopt::StructOpt; +use tokio::net::TcpStream; + +use crate::prelude::*; +use protocol::PeerId; + +#[derive (Debug, StructOpt)] +struct Opt { + #[structopt (long)] + relay_addr: Option , + #[structopt (long)] + server_id: Option , + #[structopt (long)] + debug_echo: bool, + #[structopt (long)] + cert_url: Option , +} + +pub async fn main (args: std::env::ArgsOs) -> anyhow::Result <()> { + let opt = Arc::new (Opt::from_iter (args)); + + let server_cert = match opt.cert_url.as_ref () { + Some (url) => reqwest::get (url).await?.bytes ().await?, + None => tokio::fs::read ("quic_server.crt").await?.into (), + }; + let relay_addr = opt.relay_addr.clone ().unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; + let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; + + trace! ("Connecting to relay server"); + + let server_id = opt.server_id.clone ().unwrap_or_else (|| "bogus_server".to_string ()); + + let quinn::NewConnection { + mut bi_streams, + .. + } = protocol::p4_connect_to_p3 (&endpoint, &relay_addr, &server_id).await?; + + debug! ("Connected to relay server"); + trace! ("Accepting bi streams from P3"); + + loop { + let (relay_send, relay_recv) = bi_streams.next ().await.ok_or_else (|| anyhow::anyhow! ("Relay server didn't open a bi stream"))??; + + tokio::spawn (handle_bi_stream (Arc::clone (&opt), relay_send, relay_recv)); + } +} + +async fn handle_bi_stream ( + opt: Arc , + relay_send: quinn::SendStream, + mut relay_recv: quinn::RecvStream, +) -> anyhow::Result <()> +{ + match protocol::p4_accept_p3_stream (&mut relay_recv).await? { + protocol::P3ToP4Stream::NewPtthConnection { + client_id, + .. + } => handle_new_ptth_connection (opt, relay_send, relay_recv, client_id).await?, + } + + Ok (()) +} + +async fn handle_new_ptth_connection ( + opt: Arc , + mut relay_send: quinn::SendStream, + mut relay_recv: quinn::RecvStream, + _client_id: String, +) -> anyhow::Result <()> +{ + // TODO: Check authorization for P2 --> P4 + + protocol::p4_authorize_p2_connection (&mut relay_send).await?; + let p4_to_p5_req = protocol::p4_expect_p5_request (&mut relay_recv).await?; + + // TODO: Check authorization for P1 --> P5 + + protocol::p4_authorize_p1_connection (&mut relay_send).await?; + + debug! ("Started PTTH connection"); + + if opt.debug_echo { + relay_send.write (b"Connected to P4=P5 debug echo server\n").await?; + debug! ("Relaying bytes using internal debug echo server (P4=P5)"); + tokio::io::copy (&mut relay_recv, &mut relay_send).await?; + } + else { + let stream = TcpStream::connect (("127.0.0.1", p4_to_p5_req.port)).await?; + let (local_recv, local_send) = stream.into_split (); + + trace! ("Relaying bytes..."); + + let ptth_conn = crate::connection::NewConnection { + local_send, + local_recv, + relay_send, + relay_recv, + }.build (); + + ptth_conn.wait_for_close ().await?; + } + + Ok (()) +} diff --git a/prototypes/quic_demo/src/lib.rs b/prototypes/quic_demo/src/lib.rs index dcbd50a..d5f0aa0 100644 --- a/prototypes/quic_demo/src/lib.rs +++ b/prototypes/quic_demo/src/lib.rs @@ -1,5 +1,6 @@ pub mod client_proxy; pub mod connection; +pub mod executable_end_server; pub mod prelude; pub mod protocol; pub mod quinn_utils; From f44613540e42ee5a419a10d8200402e8a9b90d5c Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 18:13:14 +0000 Subject: [PATCH 04/46] :heavy_plus_sign: add the multi-call server This exe can act as both a PTTH and PTTH_QUIC end server. It's only 17 MB, which is a big improvement over the 15 + 15 for shipping both servers as their own exes --- Cargo.lock | 12 +++++ crates/ptth_core/src/prelude.rs | 1 + crates/ptth_multi_call_server/Cargo.toml | 14 +++++ crates/ptth_multi_call_server/src/main.rs | 51 +++++++++++++++++++ crates/ptth_server/src/bin/ptth_server.rs | 8 +-- crates/ptth_server/src/lib.rs | 2 +- .../quic_demo/src/bin/quic_demo_end_server.rs | 8 ++- .../quic_demo/src/executable_end_server.rs | 2 +- prototypes/quic_demo/src/prelude.rs | 1 + 9 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 crates/ptth_multi_call_server/Cargo.toml create mode 100644 crates/ptth_multi_call_server/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 274dee2..dcb8f5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1202,6 +1202,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "ptth_multi_call_server" +version = "0.1.0" +dependencies = [ + "anyhow", + "ptth_server", + "quic_demo", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "ptth_quic_client_gui" version = "0.1.0" diff --git a/crates/ptth_core/src/prelude.rs b/crates/ptth_core/src/prelude.rs index 4a2b7d2..d674eeb 100644 --- a/crates/ptth_core/src/prelude.rs +++ b/crates/ptth_core/src/prelude.rs @@ -1,4 +1,5 @@ pub use std::{ + ffi::OsString, io::Write, sync::Arc, time::{Duration, Instant}, diff --git a/crates/ptth_multi_call_server/Cargo.toml b/crates/ptth_multi_call_server/Cargo.toml new file mode 100644 index 0000000..0313b6b --- /dev/null +++ b/crates/ptth_multi_call_server/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "ptth_multi_call_server" +version = "0.1.0" +authors = ["Trish"] +edition = "2018" +license = "AGPL-3.0" + +[dependencies] +anyhow = "1.0.38" +ptth_server = { path = "../ptth_server" } +quic_demo = { path = "../../prototypes/quic_demo" } +tokio = { version = "1.8.1", features = ["full"] } +tracing-subscriber = "0.2.16" +tracing = "0.1.25" diff --git a/crates/ptth_multi_call_server/src/main.rs b/crates/ptth_multi_call_server/src/main.rs new file mode 100644 index 0000000..607d046 --- /dev/null +++ b/crates/ptth_multi_call_server/src/main.rs @@ -0,0 +1,51 @@ +use std::{ + iter::FromIterator, +}; + +enum Subcommand { + PtthServer, + PtthQuicEndServer, +} + +fn parse_subcommand (name: &str) -> Option +{ + if name.ends_with ("ptth_server") || name.ends_with ("ptth_server.exe") + { + Some (Subcommand::PtthServer) + } + else if name.ends_with ("ptth_quic_end_server") || name.ends_with ("ptth_quic_end_server.exe") + { + Some (Subcommand::PtthQuicEndServer) + } + else { + None + } +} + +#[tokio::main] +async fn main () -> anyhow::Result <()> { + tracing_subscriber::fmt::init (); + + let args = Vec::from_iter (std::env::args_os ()); + + let arg_0 = args [0].to_str ().expect ("exe name should be valid UTF-8"); + match parse_subcommand (arg_0) { + Some (Subcommand::PtthServer) => return ptth_server::executable::main (&args).await, + Some (Subcommand::PtthQuicEndServer) => return quic_demo::executable_end_server::main (&args).await, + _ => (), + } + + let arg_1 = match args.get (1) { + Some (x) => x, + None => anyhow::bail! ("Subcommand must be the first argument if it's not the exe name"), + }; + + let arg_1 = arg_1.to_str ().expect ("subcommand should be valid UTF-8"); + match parse_subcommand (arg_1) { + Some (Subcommand::PtthServer) => return ptth_server::executable::main (&args [1..]).await, + Some (Subcommand::PtthQuicEndServer) => return quic_demo::executable_end_server::main (&args [1..]).await, + _ => (), + } + + anyhow::bail! ("Subcommand should be provided in exe name or first argument, e.g. `./ptth_multi_call_server ptth_server`"); +} diff --git a/crates/ptth_server/src/bin/ptth_server.rs b/crates/ptth_server/src/bin/ptth_server.rs index a069c0a..a03af00 100644 --- a/crates/ptth_server/src/bin/ptth_server.rs +++ b/crates/ptth_server/src/bin/ptth_server.rs @@ -1,10 +1,12 @@ -#![warn (clippy::pedantic)] +use std::{ + iter::FromIterator, +}; #[tokio::main] async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); - let args = std::env::args_os (); + let args = Vec::from_iter (std::env::args_os ()); - ptth_server::executable::main (args).await + ptth_server::executable::main (&args).await } diff --git a/crates/ptth_server/src/lib.rs b/crates/ptth_server/src/lib.rs index 0d3455c..8b55936 100644 --- a/crates/ptth_server/src/lib.rs +++ b/crates/ptth_server/src/lib.rs @@ -490,7 +490,7 @@ pub mod executable { prelude::*, }; - pub async fn main (args: std::env::ArgsOs) -> anyhow::Result <()> { + pub async fn main (args: &[OsString]) -> anyhow::Result <()> { let opt = Opt::from_iter (args); let asset_root = opt.asset_root; diff --git a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs index 86c3cc8..f2d9f75 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs @@ -1,8 +1,12 @@ +use std::{ + iter::FromIterator, +}; + #[tokio::main] async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); - let args = std::env::args_os (); + let args = Vec::from_iter (std::env::args_os ()); - quic_demo::executable_end_server::main (args).await + quic_demo::executable_end_server::main (&args).await } diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs index 62804ac..bcadac4 100644 --- a/prototypes/quic_demo/src/executable_end_server.rs +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -16,7 +16,7 @@ struct Opt { cert_url: Option , } -pub async fn main (args: std::env::ArgsOs) -> anyhow::Result <()> { +pub async fn main (args: &[OsString]) -> anyhow::Result <()> { let opt = Arc::new (Opt::from_iter (args)); let server_cert = match opt.cert_url.as_ref () { diff --git a/prototypes/quic_demo/src/prelude.rs b/prototypes/quic_demo/src/prelude.rs index 03fc349..7515241 100644 --- a/prototypes/quic_demo/src/prelude.rs +++ b/prototypes/quic_demo/src/prelude.rs @@ -1,5 +1,6 @@ pub use std::{ collections::*, + ffi::OsString, net::SocketAddr, sync::{ Arc, From 4329562aa390b3fdcdd3f5031d806df561ab1c1a Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 18:47:10 +0000 Subject: [PATCH 05/46] :white_check_mark: refactor and test the multi-call code --- crates/ptth_multi_call_server/src/main.rs | 119 ++++++++++++++++++---- 1 file changed, 100 insertions(+), 19 deletions(-) diff --git a/crates/ptth_multi_call_server/src/main.rs b/crates/ptth_multi_call_server/src/main.rs index 607d046..479453c 100644 --- a/crates/ptth_multi_call_server/src/main.rs +++ b/crates/ptth_multi_call_server/src/main.rs @@ -1,7 +1,9 @@ use std::{ + ffi::OsString, iter::FromIterator, }; +#[derive (Debug, PartialEq)] enum Subcommand { PtthServer, PtthQuicEndServer, @@ -22,30 +24,109 @@ fn parse_subcommand (name: &str) -> Option } } +fn parse_args (args: &[OsString]) -> anyhow::Result <(Subcommand, &[OsString])> +{ + let arg_0 = match args.get (0) { + Some (x) => x, + None => anyhow::bail! ("arg 0 must be the exe name"), + }; + + let arg_0 = arg_0.to_str ().ok_or_else (|| anyhow::anyhow! ("arg 0 should be valid UTF-8"))?; + match parse_subcommand (arg_0) { + Some (x) => return Ok ((x, args)), + None => (), + } + + let arg_1 = match args.get (1) { + Some (x) => x, + None => anyhow::bail! ("arg 1 must be the subcommand if arg 0 is not"), + }; + + let arg_1 = arg_1.to_str ().ok_or_else (|| anyhow::anyhow! ("arg 1 subcommand should be valid UTF-8"))?; + match parse_subcommand (arg_1) { + Some (x) => return Ok ((x, &args [1..])), + None => (), + } + + anyhow::bail! ("Subcommand must be either arg 0 (exe name) or arg 1") +} + #[tokio::main] async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); let args = Vec::from_iter (std::env::args_os ()); - let arg_0 = args [0].to_str ().expect ("exe name should be valid UTF-8"); - match parse_subcommand (arg_0) { - Some (Subcommand::PtthServer) => return ptth_server::executable::main (&args).await, - Some (Subcommand::PtthQuicEndServer) => return quic_demo::executable_end_server::main (&args).await, - _ => (), + let (subcommand, args) = parse_args (&args)?; + match subcommand { + Subcommand::PtthServer => ptth_server::executable::main (&args).await, + Subcommand::PtthQuicEndServer => quic_demo::executable_end_server::main (&args).await, + } +} + +#[cfg (test)] +mod tests { + use super::*; + + #[test] + fn multi_call () -> anyhow::Result <()> { + let negative_cases = vec! [ + vec! [], + vec! ["invalid_exe_name"], + vec! ["ptth_multi_call_server"], + vec! ["ptth_multi_call_server", "invalid_subcommand"], + ]; + + for input in &negative_cases { + let input: Vec <_> = input.iter ().map (OsString::from).collect (); + + let actual = parse_args (&input); + assert! (actual.is_err ()); + } + + let positive_cases = vec! [ + (vec! ["ptth_server"], (Subcommand::PtthServer, vec! ["ptth_server"])), + (vec! ["ptth_server", "--help"], (Subcommand::PtthServer, vec! ["ptth_server", "--help"])), + (vec! ["ptth_quic_end_server", "--help"], (Subcommand::PtthQuicEndServer, vec! ["ptth_quic_end_server", "--help"])), + (vec! ["ptth_multi_call_server", "ptth_server"], (Subcommand::PtthServer, vec! ["ptth_server"])), + ( + vec! [ + "ptth_multi_call_server", + "ptth_server", + "--help" + ], + ( + Subcommand::PtthServer, + vec! [ + "ptth_server", + "--help" + ] + ) + ), + ( + vec! [ + "invalid_exe_name", + "ptth_server", + "--help" + ], + ( + Subcommand::PtthServer, + vec! [ + "ptth_server", + "--help" + ] + ) + ), + ]; + + for (input, (expected_subcommand, expected_args)) in &positive_cases { + let input: Vec <_> = input.iter ().map (OsString::from).collect (); + + let (actual_subcommand, actual_args) = parse_args (&input)?; + assert_eq! (expected_subcommand, &actual_subcommand); + assert_eq! (expected_args, actual_args); + } + + Ok (()) } - - let arg_1 = match args.get (1) { - Some (x) => x, - None => anyhow::bail! ("Subcommand must be the first argument if it's not the exe name"), - }; - - let arg_1 = arg_1.to_str ().expect ("subcommand should be valid UTF-8"); - match parse_subcommand (arg_1) { - Some (Subcommand::PtthServer) => return ptth_server::executable::main (&args [1..]).await, - Some (Subcommand::PtthQuicEndServer) => return quic_demo::executable_end_server::main (&args [1..]).await, - _ => (), - } - - anyhow::bail! ("Subcommand should be provided in exe name or first argument, e.g. `./ptth_multi_call_server ptth_server`"); } From 4c79af3f4b75e6146e7be84e6fe389a582a0a0dc Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 18:58:27 +0000 Subject: [PATCH 06/46] :recycle: refactor: clean up `.exe` handling and add a place for `ptth_file_server` --- crates/ptth_multi_call_server/src/main.rs | 35 +++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/crates/ptth_multi_call_server/src/main.rs b/crates/ptth_multi_call_server/src/main.rs index 479453c..7349f62 100644 --- a/crates/ptth_multi_call_server/src/main.rs +++ b/crates/ptth_multi_call_server/src/main.rs @@ -3,25 +3,32 @@ use std::{ iter::FromIterator, }; -#[derive (Debug, PartialEq)] +#[derive (Clone, Copy, Debug, PartialEq)] enum Subcommand { PtthServer, + PtthFileServer, PtthQuicEndServer, } -fn parse_subcommand (name: &str) -> Option +fn parse_subcommand (arg: &str) -> Option { - if name.ends_with ("ptth_server") || name.ends_with ("ptth_server.exe") - { - Some (Subcommand::PtthServer) - } - else if name.ends_with ("ptth_quic_end_server") || name.ends_with ("ptth_quic_end_server.exe") - { - Some (Subcommand::PtthQuicEndServer) - } - else { - None + use Subcommand::*; + + let map = vec! [ + ("ptth_server", PtthServer), + ("ptth_file_server", PtthFileServer), + ("ptth_quic_end_server", PtthQuicEndServer), + ]; + + let arg = arg.strip_suffix (".exe").unwrap_or (arg); + + for (suffix, subcommand) in &map { + if arg.ends_with (suffix) { + return Some (*subcommand); + } } + + None } fn parse_args (args: &[OsString]) -> anyhow::Result <(Subcommand, &[OsString])> @@ -60,6 +67,7 @@ async fn main () -> anyhow::Result <()> { let (subcommand, args) = parse_args (&args)?; match subcommand { Subcommand::PtthServer => ptth_server::executable::main (&args).await, + Subcommand::PtthFileServer => unimplemented! (), Subcommand::PtthQuicEndServer => quic_demo::executable_end_server::main (&args).await, } } @@ -74,6 +82,7 @@ mod tests { vec! [], vec! ["invalid_exe_name"], vec! ["ptth_multi_call_server"], + vec! ["ptth_server.ex"], vec! ["ptth_multi_call_server", "invalid_subcommand"], ]; @@ -85,8 +94,10 @@ mod tests { } let positive_cases = vec! [ + (vec! ["ptth_server.exe"], (Subcommand::PtthServer, vec! ["ptth_server.exe"])), (vec! ["ptth_server"], (Subcommand::PtthServer, vec! ["ptth_server"])), (vec! ["ptth_server", "--help"], (Subcommand::PtthServer, vec! ["ptth_server", "--help"])), + (vec! ["ptth_file_server"], (Subcommand::PtthFileServer, vec! ["ptth_file_server"])), (vec! ["ptth_quic_end_server", "--help"], (Subcommand::PtthQuicEndServer, vec! ["ptth_quic_end_server", "--help"])), (vec! ["ptth_multi_call_server", "ptth_server"], (Subcommand::PtthServer, vec! ["ptth_server"])), ( From 4911a37887e5c927833b1fa368c54d32c3713ff2 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 19:00:13 +0000 Subject: [PATCH 07/46] add ptth_file_server depend to ptth_multi_call_server --- Cargo.lock | 1 + crates/ptth_multi_call_server/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index dcb8f5d..c94a64c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1207,6 +1207,7 @@ name = "ptth_multi_call_server" version = "0.1.0" dependencies = [ "anyhow", + "ptth_file_server", "ptth_server", "quic_demo", "tokio", diff --git a/crates/ptth_multi_call_server/Cargo.toml b/crates/ptth_multi_call_server/Cargo.toml index 0313b6b..2357804 100644 --- a/crates/ptth_multi_call_server/Cargo.toml +++ b/crates/ptth_multi_call_server/Cargo.toml @@ -7,6 +7,7 @@ license = "AGPL-3.0" [dependencies] anyhow = "1.0.38" +ptth_file_server = { path = "../ptth_file_server_bin" } ptth_server = { path = "../ptth_server" } quic_demo = { path = "../../prototypes/quic_demo" } tokio = { version = "1.8.1", features = ["full"] } From b8d07c526ae60c736789542849e74e5073cfdce8 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 19:07:55 +0000 Subject: [PATCH 08/46] :heavy_plus_sign: add ptth_file_server to ptth_multi_call_server. Even with all 3 servers it's only 18 MB - Most of the big code is shared. --- crates/ptth_file_server_bin/src/lib.rs | 127 ++++++++++++++++++++++ crates/ptth_file_server_bin/src/main.rs | 122 +-------------------- crates/ptth_multi_call_server/src/main.rs | 2 +- 3 files changed, 131 insertions(+), 120 deletions(-) create mode 100644 crates/ptth_file_server_bin/src/lib.rs diff --git a/crates/ptth_file_server_bin/src/lib.rs b/crates/ptth_file_server_bin/src/lib.rs new file mode 100644 index 0000000..3935328 --- /dev/null +++ b/crates/ptth_file_server_bin/src/lib.rs @@ -0,0 +1,127 @@ +#![warn (clippy::pedantic)] + +use std::{ + ffi::OsString, + net::SocketAddr, + path::PathBuf, + sync::Arc, +}; + +use arc_swap::ArcSwap; +use hyper::{ + Body, + Request, + Response, + Server, + service::{ + make_service_fn, + service_fn, + }, + StatusCode, +}; +use serde::Deserialize; +use tokio_stream::wrappers::ReceiverStream; +use tracing::debug; + +use ptth_core::{ + http_serde::RequestParts, + prelude::*, +}; +use ptth_server::{ + file_server::{ + self, + metrics, + FileServer, + }, + load_toml, +}; + +async fn handle_all (req: Request , state: Arc ) +-> anyhow::Result > +{ + use std::str::FromStr; + use hyper::header::HeaderName; + + debug! ("req.uri () = {:?}", req.uri ()); + + let path_and_query = req.uri ().path_and_query ().map_or_else (|| req.uri ().path (), http::uri::PathAndQuery::as_str); + + let path_and_query = path_and_query.into (); + + let (parts, _) = req.into_parts (); + + let ptth_req = RequestParts::from_hyper (parts.method, path_and_query, parts.headers)?; + + let ptth_resp = state.serve_all ( + ptth_req.method, + &ptth_req.uri, + &ptth_req.headers + ).await?; + + let mut resp = Response::builder () + .status (StatusCode::from (ptth_resp.parts.status_code)); + + for (k, v) in ptth_resp.parts.headers { + resp = resp.header (HeaderName::from_str (&k)?, v); + } + + let body = ptth_resp.body.map_or_else (Body::empty, |body| { + Body::wrap_stream (ReceiverStream::new (body)) + }); + + Ok (resp.body (body)?) +} + +#[derive (Deserialize)] +struct ConfigFile { + file_server_root: Option , + name: Option , +} + +pub async fn main (_args: &[OsString]) -> anyhow::Result <()> { + let path = PathBuf::from ("./config/ptth_server.toml"); + let config_file: ConfigFile = load_toml::load (&path)?; + info! ("file_server_root: {:?}", config_file.file_server_root); + + let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); + + let metrics_interval = Arc::new (ArcSwap::default ()); + + let interval_writer = Arc::clone (&metrics_interval); + tokio::spawn (async move { + file_server::metrics::Interval::monitor (interval_writer).await; + }); + + let state = Arc::new (FileServer::new ( + config_file.file_server_root, + &PathBuf::new (), + config_file.name.unwrap_or_else (|| "PTTH File Server".to_string ()), + metrics_interval, + Some (path), + )?); + + let make_svc = make_service_fn (|_conn| { + let state = state.clone (); + + async { + Ok::<_, String> (service_fn (move |req| { + let state = state.clone (); + + handle_all (req, state) + })) + } + }); + + let (shutdown_rx, forced_shutdown) = ptth_core::graceful_shutdown::init_with_force (); + + let server = Server::bind (&addr) + .serve (make_svc) + .with_graceful_shutdown (async move { + shutdown_rx.await.ok (); + }); + + forced_shutdown.wrap_server (server).await??; + + Ok (()) +} + diff --git a/crates/ptth_file_server_bin/src/main.rs b/crates/ptth_file_server_bin/src/main.rs index 1966acb..43c896e 100644 --- a/crates/ptth_file_server_bin/src/main.rs +++ b/crates/ptth_file_server_bin/src/main.rs @@ -1,128 +1,12 @@ -#![warn (clippy::pedantic)] - use std::{ - net::SocketAddr, - path::PathBuf, - sync::Arc, + iter::FromIterator, }; -use arc_swap::ArcSwap; -use hyper::{ - Body, - Request, - Response, - Server, - service::{ - make_service_fn, - service_fn, - }, - StatusCode, -}; -use serde::Deserialize; -use tokio_stream::wrappers::ReceiverStream; -use tracing::debug; - -use ptth_core::{ - http_serde::RequestParts, - prelude::*, -}; -use ptth_server::{ - file_server::{ - self, - metrics, - FileServer, - }, - load_toml, -}; - -async fn handle_all (req: Request , state: Arc ) --> anyhow::Result > -{ - use std::str::FromStr; - use hyper::header::HeaderName; - - debug! ("req.uri () = {:?}", req.uri ()); - - let path_and_query = req.uri ().path_and_query ().map_or_else (|| req.uri ().path (), http::uri::PathAndQuery::as_str); - - let path_and_query = path_and_query.into (); - - let (parts, _) = req.into_parts (); - - let ptth_req = RequestParts::from_hyper (parts.method, path_and_query, parts.headers)?; - - let ptth_resp = state.serve_all ( - ptth_req.method, - &ptth_req.uri, - &ptth_req.headers - ).await?; - - let mut resp = Response::builder () - .status (StatusCode::from (ptth_resp.parts.status_code)); - - for (k, v) in ptth_resp.parts.headers { - resp = resp.header (HeaderName::from_str (&k)?, v); - } - - let body = ptth_resp.body.map_or_else (Body::empty, |body| { - Body::wrap_stream (ReceiverStream::new (body)) - }); - - Ok (resp.body (body)?) -} - -#[derive (Deserialize)] -pub struct ConfigFile { - pub file_server_root: Option , - pub name: Option , -} - #[tokio::main] async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); - let path = PathBuf::from ("./config/ptth_server.toml"); - let config_file: ConfigFile = load_toml::load (&path)?; - info! ("file_server_root: {:?}", config_file.file_server_root); + let args = Vec::from_iter (std::env::args_os ()); - let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); - - let metrics_interval = Arc::new (ArcSwap::default ()); - - let interval_writer = Arc::clone (&metrics_interval); - tokio::spawn (async move { - file_server::metrics::Interval::monitor (interval_writer).await; - }); - - let state = Arc::new (FileServer::new ( - config_file.file_server_root, - &PathBuf::new (), - config_file.name.unwrap_or_else (|| "PTTH File Server".to_string ()), - metrics_interval, - Some (path), - )?); - - let make_svc = make_service_fn (|_conn| { - let state = state.clone (); - - async { - Ok::<_, String> (service_fn (move |req| { - let state = state.clone (); - - handle_all (req, state) - })) - } - }); - - let (shutdown_rx, forced_shutdown) = ptth_core::graceful_shutdown::init_with_force (); - - let server = Server::bind (&addr) - .serve (make_svc) - .with_graceful_shutdown (async move { - shutdown_rx.await.ok (); - }); - - forced_shutdown.wrap_server (server).await??; - - Ok (()) + ptth_file_server::main (&args).await } diff --git a/crates/ptth_multi_call_server/src/main.rs b/crates/ptth_multi_call_server/src/main.rs index 7349f62..48648fd 100644 --- a/crates/ptth_multi_call_server/src/main.rs +++ b/crates/ptth_multi_call_server/src/main.rs @@ -67,7 +67,7 @@ async fn main () -> anyhow::Result <()> { let (subcommand, args) = parse_args (&args)?; match subcommand { Subcommand::PtthServer => ptth_server::executable::main (&args).await, - Subcommand::PtthFileServer => unimplemented! (), + Subcommand::PtthFileServer => ptth_file_server::main (&args).await, Subcommand::PtthQuicEndServer => quic_demo::executable_end_server::main (&args).await, } } From f7b78b8a1242d0e051cffee46bd57d26723b7616 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 19:13:46 +0000 Subject: [PATCH 09/46] :arrow_up: update to blake3 1.0.0 to de-dupe the cfg-if depend --- Cargo.lock | 59 +++++++++++------------------------ Cargo.toml | 2 +- crates/ptth_relay/Cargo.toml | 2 +- crates/ptth_server/Cargo.toml | 2 +- 4 files changed, 21 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c94a64c..cd8a5f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,9 +51,9 @@ checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" -version = "0.5.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" [[package]] name = "async-trait" @@ -97,16 +97,15 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "blake3" -version = "0.3.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f" +checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f" dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if 0.1.10", + "cfg-if", "constant_time_eq", - "crypto-mac", "digest 0.9.0", ] @@ -161,12 +160,6 @@ version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -233,16 +226,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.4", - "subtle", -] - [[package]] name = "ct-logs" version = "0.8.0" @@ -268,7 +251,7 @@ version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "num_cpus", ] @@ -331,7 +314,7 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -531,7 +514,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi", ] @@ -706,7 +689,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -766,7 +749,7 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -867,7 +850,7 @@ checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" dependencies = [ "bitflags", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", ] @@ -937,7 +920,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a61075b62a23fef5a29815de7536d940aa35ce96d18ce0cc5076272db678a577" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -980,7 +963,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "instant", "libc", "redox_syscall", @@ -1771,7 +1754,7 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "winapi", ] @@ -1822,12 +1805,6 @@ dependencies = [ "syn", ] -[[package]] -name = "subtle" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" - [[package]] name = "syn" version = "1.0.73" @@ -1845,7 +1822,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "rand", "redox_syscall", @@ -2015,7 +1992,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2225,7 +2202,7 @@ version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "serde", "serde_json", "wasm-bindgen-macro", @@ -2252,7 +2229,7 @@ version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81b8b767af23de6ac18bf2168b690bed2902743ddf0fb39252e36f9e2bfc63ea" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", diff --git a/Cargo.toml b/Cargo.toml index c025fe0..d45fbcb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ exclude = [ [dependencies] anyhow = "1.0.38" -blake3 = "0.3.7" +blake3 = "1.0.0" tokio = { version = "1.4.0", features = ["full"] } tracing-subscriber = "0.2.16" tracing = "0.1.25" diff --git a/crates/ptth_relay/Cargo.toml b/crates/ptth_relay/Cargo.toml index 69fb829..a44c080 100644 --- a/crates/ptth_relay/Cargo.toml +++ b/crates/ptth_relay/Cargo.toml @@ -12,7 +12,7 @@ description = "The PTTH relay" anyhow = "1.0.38" base64 = "0.13.0" -blake3 = "0.3.7" +blake3 = "1.0.0" chrono = { version = "0.4.19", features = ["serde"] } clap = "2.33.3" dashmap = "4.0.2" diff --git a/crates/ptth_server/Cargo.toml b/crates/ptth_server/Cargo.toml index d6deb67..beb0726 100644 --- a/crates/ptth_server/Cargo.toml +++ b/crates/ptth_server/Cargo.toml @@ -17,7 +17,7 @@ aho-corasick = "0.7.15" anyhow = "1.0.38" arc-swap = "1.2.0" base64 = "0.13.0" -blake3 = "0.3.7" +blake3 = "1.0.0" chrono = {version = "0.4.19", features = ["serde"]} futures = "0.3.7" handlebars = "3.5.1" From c53ed0d2bdc444207ddabb778e2d2eaa45069767 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 19:28:20 +0000 Subject: [PATCH 10/46] :arrow_up: newest stable toolchain, plus `cargo update` --- Cargo.lock | 438 +++++++++++++++++++++++++------------------------ rust-toolchain | 2 +- 2 files changed, 225 insertions(+), 215 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cd8a5f1..468f94b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,10 +1,12 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] @@ -33,15 +35,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" [[package]] name = "arc-swap" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d7d63395147b81a9e570bcc6243aaf71c017bd666d4909cfef0085bdda8d73" +checksum = "e6df5aef5c5830360ce5218cecb8f018af3438af5686ae945094affc86fdec63" [[package]] name = "arrayref" @@ -57,9 +59,9 @@ checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" [[package]] name = "async-trait" -version = "0.1.48" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea56748e10732c49404c153638a15ec3d6211ec5ff35d9bb20e13b93576adf" +checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" dependencies = [ "proc-macro2", "quote", @@ -132,9 +134,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.6.1" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" +checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" [[package]] name = "byte-tools" @@ -150,15 +152,15 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cc" -version = "1.0.67" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" [[package]] name = "cfg-if" @@ -237,9 +239,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.8" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15b8ec3b5755a188c141c1f6a98e76de31b936209bf066b647979e2a84764a9" +checksum = "377c9b002a72a0b2c1a18c62e2f3864bdfea4a015e3683a96e24aa45dd6c02d1" dependencies = [ "nix", "winapi", @@ -325,9 +327,9 @@ checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fltk" -version = "1.1.1" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d364803b740d10140734eaa925af4ff4b3826e2bad29b18e477aeac3fdf016c" +checksum = "471fefc1fc3e019d314d542637f5bf48bd72a678f5e9052167b9ac7bea7b0a38" dependencies = [ "bitflags", "fltk-derive", @@ -339,9 +341,9 @@ dependencies = [ [[package]] name = "fltk-derive" -version = "1.1.0" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7272e4cb6beabf0a37a8070f1700795d99fc3612dd7292842fa171e2f67d8b76" +checksum = "712f09c29760a17e14a2f0d08a36b78bab82d5fbb3b2c3e17f3420f239351364" dependencies = [ "quote", "syn", @@ -349,9 +351,9 @@ dependencies = [ [[package]] name = "fltk-sys" -version = "1.1.1" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158abaf04e1d5cdc08bb75cd3683e03be6f6b6e2fa3a0124e1a596c436417bcb" +checksum = "5cc5eabad4839df806d102049c44586233743cf6607e2d2829155bb9fe45775e" dependencies = [ "cmake", "libc", @@ -390,9 +392,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" dependencies = [ "futures-channel", "futures-core", @@ -405,9 +407,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", "futures-sink", @@ -415,15 +417,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" [[package]] name = "futures-executor" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" dependencies = [ "futures-core", "futures-task", @@ -432,16 +434,17 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" [[package]] name = "futures-macro" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ + "autocfg", "proc-macro-hack", "proc-macro2", "quote", @@ -450,22 +453,23 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" [[package]] name = "futures-task" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" [[package]] name = "futures-util" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ + "autocfg", "futures-channel", "futures-core", "futures-io", @@ -510,9 +514,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if", "libc", @@ -521,9 +525,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.2" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc018e188373e2777d0ef2467ebff62a08e66c3f5857b23c8fbec3018210dc00" +checksum = "6c06815895acec637cd6ed6e9662c935b866d20a106f8361892893a7d9234964" dependencies = [ "bytes", "fnv", @@ -540,9 +544,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "3.5.4" +version = "3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "580b6f551b29a3a02436318aed09ba1c58eea177dc49e39beac627ad356730a5" +checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3" dependencies = [ "log", "pest", @@ -554,33 +558,33 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "http" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" dependencies = [ "bytes", "fnv", @@ -589,9 +593,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737" +checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" dependencies = [ "bytes", "http", @@ -600,21 +604,21 @@ dependencies = [ [[package]] name = "httparse" -version = "1.3.5" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" [[package]] name = "hyper" -version = "0.14.5" +version = "0.14.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1" +checksum = "15d1cfb9e4f68655fa04c01f59edb405b6074a0f7118ea881e5026e4a1cd8593" dependencies = [ "bytes", "futures-channel", @@ -626,8 +630,8 @@ dependencies = [ "httparse", "httpdate", "itoa", - "pin-project", - "socket2 0.4.0", + "pin-project-lite", + "socket2 0.4.2", "tokio", "tower-service", "tracing", @@ -664,9 +668,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -675,9 +679,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.6.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg", "hashbrown", @@ -685,18 +689,18 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" dependencies = [ "cfg-if", ] [[package]] name = "ipnet" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] name = "itertools" @@ -709,15 +713,15 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "js-sys" -version = "0.3.50" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" dependencies = [ "wasm-bindgen", ] @@ -730,15 +734,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.98" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" +checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" [[package]] name = "lock_api" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] @@ -778,15 +782,24 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] [[package]] name = "metrics_test" @@ -804,9 +817,9 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mio" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956" +checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" dependencies = [ "libc", "log", @@ -826,9 +839,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ "lazy_static", "libc", @@ -844,14 +857,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.20.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" +checksum = "d3bb9a13fa32bc5aeb64150cd3f32d6cf4c748f8f8a417cce5d2eb976a8370ba" dependencies = [ "bitflags", "cc", "cfg-if", "libc", + "memoffset", ] [[package]] @@ -903,9 +917,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.5.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "opaque-debug" @@ -915,9 +929,9 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "openssl" -version = "0.10.33" +version = "0.10.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61075b62a23fef5a29815de7536d940aa35ce96d18ce0cc5076272db678a577" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" dependencies = [ "bitflags", "cfg-if", @@ -929,15 +943,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.61" +version = "0.9.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "313752393519e876837e09e1fa183ddef0be7735868dced3196f4472d536277f" +checksum = "69df2d8dfc6ce3aaf44b40dec6f487d5a886516cf6879c49e98e0710f310a058" dependencies = [ "autocfg", "cc", @@ -948,9 +962,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", @@ -959,9 +973,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if", "instant", @@ -1033,18 +1047,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2", "quote", @@ -1053,9 +1067,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -1065,9 +1079,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" [[package]] name = "ppv-lite86" @@ -1113,9 +1127,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" dependencies = [ "unicode-xid", ] @@ -1339,9 +1353,9 @@ dependencies = [ [[package]] name = "quick-error" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ac73b1112776fc109b2e61909bc46c7e1bf0d7f690ffb1676553acce16d5cda" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quinn" @@ -1393,9 +1407,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", "rand_chacha", @@ -1405,9 +1419,9 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", @@ -1415,18 +1429,18 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ "getrandom", ] [[package]] name = "rand_hc" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ "rand_core", ] @@ -1442,9 +1456,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.8.11" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48b4fc1b81d685fcd442a86da2e2c829d9e353142633a8159f42bf28e7e94428" +checksum = "2351cbef4bf91837f5ff7face6091cb277ba960d1638d2c5ae2327859912fbba" dependencies = [ "chrono", "pem", @@ -1454,18 +1468,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.5" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.4.5" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", @@ -1474,19 +1488,18 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "byteorder", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.23" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "remove_dir_all" @@ -1642,9 +1655,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3670b1d2fdf6084d192bc71ead7aabe6c06aa2ea3fbd9cc3ac111fa5c2b1bd84" +checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" dependencies = [ "bitflags", "core-foundation", @@ -1655,9 +1668,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.2.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3676258fd3cfe2c9a0ec99ce3038798d847ce3e4bb17746373eb9f0f1ac16339" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" dependencies = [ "core-foundation-sys", "libc", @@ -1665,18 +1678,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.125" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2", "quote", @@ -1685,9 +1698,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ "itoa", "ryu", @@ -1720,33 +1733,33 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c719719ee05df97490f80a45acfc99e5a30ce98a1e4fb67aee422745ae14e3" +checksum = "740223c51853f3145fe7c90360d2d4232f2b62e3449489c207eccde818979982" dependencies = [ "lazy_static", ] [[package]] name = "signal-hook-registry" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "smallvec" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" [[package]] name = "socket2" @@ -1761,9 +1774,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" dependencies = [ "libc", "winapi", @@ -1783,9 +1796,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "structopt" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" +checksum = "bf9d950ef167e25e0bdb073cf1d68e9ad2795ac826f2f3f59647817cf23c0bfa" dependencies = [ "clap", "lazy_static", @@ -1794,9 +1807,9 @@ dependencies = [ [[package]] name = "structopt-derive" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" +checksum = "134d838a2c9943ac3125cf6df165eda53493451b719f3255b2a26b85f772d0ba" dependencies = [ "heck", "proc-macro-error", @@ -1807,9 +1820,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.73" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0" dependencies = [ "proc-macro2", "quote", @@ -1841,18 +1854,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.24" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.24" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" dependencies = [ "proc-macro2", "quote", @@ -1881,9 +1894,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" dependencies = [ "tinyvec_macros", ] @@ -1896,9 +1909,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.8.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c8b05dc14c75ea83d63dd391100353789f5f24b8b3866542a5e85c8be8e985" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" dependencies = [ "autocfg", "bytes", @@ -1916,9 +1929,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.1.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57" +checksum = "154794c8f499c2619acd19e839294703e9e32e7630ef5f46ea80d4ef0fbee5eb" dependencies = [ "proc-macro2", "quote", @@ -1948,9 +1961,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e177a5d8c3bf36de9ebe6d58537d8879e964332f93fb3339e43f618c81361af0" +checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" dependencies = [ "futures-core", "pin-project-lite", @@ -1959,9 +1972,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5143d049e85af7fbc36f5454d990e62c2df705b3589f123b71f441b6b59f443f" +checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" dependencies = [ "bytes", "futures-core", @@ -1988,9 +2001,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.25" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8" dependencies = [ "cfg-if", "pin-project-lite", @@ -2000,9 +2013,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +checksum = "c4f915eb6abf914599c200260efced9203504c4c37380af10cdf3b7d36970650" dependencies = [ "proc-macro2", "quote", @@ -2011,9 +2024,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" dependencies = [ "lazy_static", ] @@ -2051,9 +2064,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.2.17" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705096c6f83bf68ea5d357a6aa01829ddbdac531b357b45abeca842938085baa" +checksum = "fdd0568dbfe3baf7048b7908d2b32bca0d81cd56bec6d2a8f894b01d74f86be3" dependencies = [ "ansi_term 0.12.1", "chrono", @@ -2079,9 +2092,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "typenum" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" [[package]] name = "ucd-trie" @@ -2100,39 +2113,36 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] +checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" [[package]] name = "unicode-normalization" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "untrusted" @@ -2152,9 +2162,9 @@ dependencies = [ [[package]] name = "url" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna", @@ -2164,9 +2174,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vec_map" @@ -2198,9 +2208,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.73" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" +checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" dependencies = [ "cfg-if", "serde", @@ -2210,9 +2220,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.73" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" +checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" dependencies = [ "bumpalo", "lazy_static", @@ -2225,9 +2235,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.23" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b8b767af23de6ac18bf2168b690bed2902743ddf0fb39252e36f9e2bfc63ea" +checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" dependencies = [ "cfg-if", "js-sys", @@ -2237,9 +2247,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.73" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" +checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2247,9 +2257,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.73" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" +checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ "proc-macro2", "quote", @@ -2260,15 +2270,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.73" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" +checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" [[package]] name = "web-sys" -version = "0.3.50" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be" +checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/rust-toolchain b/rust-toolchain index 5a5c721..094d6ad 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.50.0 +1.55.0 From 2972e856714138a165457b1f311161c26e1f72fc Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 19:49:19 +0000 Subject: [PATCH 11/46] :heavy_plus_sign: use rust_embed and default configs so you can call `ptth_file_server` from any working dir. This is like Python's old `-m SimpleHTTPServer` but better because I wrote it. --- Cargo.lock | 105 ++++++++++++++++++++++++- crates/ptth_file_server_bin/src/lib.rs | 28 +++++-- crates/ptth_server/Cargo.toml | 1 + crates/ptth_server/src/file_server.rs | 16 ++-- 4 files changed, 138 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 468f94b..52fbe6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,6 +123,15 @@ dependencies = [ "generic-array 0.12.4", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.4", +] + [[package]] name = "block-padding" version = "0.1.5" @@ -228,6 +237,15 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + [[package]] name = "ct-logs" version = "0.8.0" @@ -927,6 +945,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "openssl" version = "0.10.36" @@ -1282,6 +1306,7 @@ dependencies = [ "regex", "reqwest", "rmp-serde", + "rust-embed", "rusty_ulid", "serde", "serde_json", @@ -1584,6 +1609,40 @@ dependencies = [ "serde", ] +[[package]] +name = "rust-embed" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be44a6694859b7cfc955699935944a6844aa9fe416aeda5d40829e3e38dfee6" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f567ca01565c50c67b29e535f5f67b8ea8aeadaeed16a88f10792ab57438b957" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6116e7ab9ea963f60f2f20291d8fcf6c7273192cdd7273b3c80729a9605c97b2" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustls" version = "0.19.1" @@ -1627,6 +1686,15 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.19" @@ -1725,10 +1793,23 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "block-buffer", + "block-buffer 0.7.3", "digest 0.8.1", "fake-simd", - "opaque-debug", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] @@ -2190,6 +2271,17 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + [[package]] name = "want" version = "0.3.0" @@ -2319,6 +2411,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/crates/ptth_file_server_bin/src/lib.rs b/crates/ptth_file_server_bin/src/lib.rs index 3935328..036dae2 100644 --- a/crates/ptth_file_server_bin/src/lib.rs +++ b/crates/ptth_file_server_bin/src/lib.rs @@ -3,7 +3,7 @@ use std::{ ffi::OsString, net::SocketAddr, - path::PathBuf, + path::{PathBuf}, sync::Arc, }; @@ -80,10 +80,28 @@ struct ConfigFile { pub async fn main (_args: &[OsString]) -> anyhow::Result <()> { let path = PathBuf::from ("./config/ptth_server.toml"); - let config_file: ConfigFile = load_toml::load (&path)?; - info! ("file_server_root: {:?}", config_file.file_server_root); + + let file_server_root; + let name; + + match load_toml::load:: (&path) { + Ok (config_file) => { + file_server_root = config_file.file_server_root; + name = config_file.name; + }, + _ => { + info! ("No ptth_server.toml file, using default configs"); + file_server_root = None; + name = None; + }, + }; + + let name = name.unwrap_or_else (|| "PTTH File Server".to_string ()); + + info! ("file_server_root: {:?}", file_server_root); let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); + info! ("Serving at {:?}", addr); let metrics_interval = Arc::new (ArcSwap::default ()); @@ -93,9 +111,9 @@ pub async fn main (_args: &[OsString]) -> anyhow::Result <()> { }); let state = Arc::new (FileServer::new ( - config_file.file_server_root, + file_server_root, &PathBuf::new (), - config_file.name.unwrap_or_else (|| "PTTH File Server".to_string ()), + name, metrics_interval, Some (path), )?); diff --git a/crates/ptth_server/Cargo.toml b/crates/ptth_server/Cargo.toml index beb0726..7506a76 100644 --- a/crates/ptth_server/Cargo.toml +++ b/crates/ptth_server/Cargo.toml @@ -28,6 +28,7 @@ pulldown-cmark = { version = "0.8.0", optional = true } rand = "0.8.3" regex = "1.4.1" rmp-serde = "0.15.5" +rust-embed = "6.2.0" rusty_ulid = "0.10.1" serde = {version = "1.0.117", features = ["derive"]} serde_json = "1.0.60" diff --git a/crates/ptth_server/src/file_server.rs b/crates/ptth_server/src/file_server.rs index 4c4d301..a347a4c 100644 --- a/crates/ptth_server/src/file_server.rs +++ b/crates/ptth_server/src/file_server.rs @@ -429,20 +429,26 @@ impl FileServer { } fn load_templates ( - asset_root: &Path + _asset_root: &Path ) --> Result , anyhow::Error> +-> anyhow::Result > { + use rust_embed::RustEmbed; + #[derive (RustEmbed)] + #[folder = "../../handlebars/server"] + struct HandlebarsServer; + let mut handlebars = Handlebars::new (); handlebars.set_strict_mode (true); - let asset_root = asset_root.join ("handlebars/server"); - for (k, v) in &[ ("file_server_dir", "file_server_dir.html"), ("file_server_root", "file_server_root.html"), ] { - handlebars.register_template_file (k, asset_root.join (v))?; + let asset_file = HandlebarsServer::get (v) + .ok_or_else (|| anyhow::anyhow! ("failed to load handlebars template file"))?; + let s = std::str::from_utf8 (asset_file.data.as_ref ())?; + handlebars.register_template_string (k, s)?; } Ok (handlebars) From 98b43d1ba2371e720f7dd4b3b43d6fd6d445c032 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 20:03:03 +0000 Subject: [PATCH 12/46] guess MIME for JavaScript files so that `ptth_file_server` can serve Jet Racing 4 locally. Firfox has a bunch of odd security features that I only sometimes understand. Among them is that it won't load JS files without the `content-type` header, and it also disables a lot of features for the `file://` scheme. Which I think is a shame. There's probably a good reason they do this, but I'm not aware of one. So now you can use PTTH's file server to host Jet Racing 4. --- crates/ptth_server/src/file_server.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/ptth_server/src/file_server.rs b/crates/ptth_server/src/file_server.rs index a347a4c..86fa357 100644 --- a/crates/ptth_server/src/file_server.rs +++ b/crates/ptth_server/src/file_server.rs @@ -141,6 +141,7 @@ async fn serve_dir_json ( #[instrument (level = "debug", skip (f))] async fn serve_file ( + uri: &str, mut f: File, client_wants_body: bool, range: range::ValidParsed, @@ -211,6 +212,12 @@ async fn serve_file ( response.header (String::from ("content-range"), format! ("bytes {}-{}/{}", range.start, range.end - 1, range.end).into_bytes ()); } + // Guess MIME type based on the URI so that we can serve web games + + if uri.ends_with (".js") { + response.header ("content-type".into (), b"application/javascript".to_vec ()); + } + response.content_length = Some (content_length); if let Some (body) = body { @@ -402,7 +409,7 @@ impl FileServer { file, send_body, range, - }) => serve_file (file.into_inner (), send_body, range, headers.get ("if-none-match").map (|v| &v[..])).await?, + }) => serve_file (uri, file.into_inner (), send_body, range, headers.get ("if-none-match").map (|v| &v[..])).await?, MarkdownErr (e) => { #[cfg (feature = "markdown")] { From 61a74c29a67fffb00b22923751c0d4071a39ffd9 Mon Sep 17 00:00:00 2001 From: _ <> Date: Mon, 4 Oct 2021 09:53:28 -0500 Subject: [PATCH 13/46] :package: switch the release package to use the multi-call server --- build_ptth_server.bash | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/build_ptth_server.bash b/build_ptth_server.bash index 71d612a..520f457 100755 --- a/build_ptth_server.bash +++ b/build_ptth_server.bash @@ -20,14 +20,9 @@ rm -rf "$TEMP_GIBBERISH" mkdir "$TEMP_GIBBERISH" mkdir "$DEST" -cargo build --release -p ptth_server -cargo build --release -p quic_demo --bin quic_demo_end_server +cargo build --release -p ptth_multi_call_server -mkdir -p "$DEST/handlebars/server" -rsync -r handlebars/server/ "$DEST/handlebars/server/" - -cp target/release/ptth_server "$DEST/" -cp target/release/quic_demo_end_server "$DEST/" +cp target/release/ptth_multi_call_server "$DEST/" ( cd "$TEMP_GIBBERISH" || exit From 35cc1d49b7a1c0402309d89471bb3560474dec4e Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 14:36:01 +0000 Subject: [PATCH 14/46] :recycle: refactor: begin extacting a struct for the end server --- .../quic_demo/src/executable_end_server.rs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs index bcadac4..f0afa11 100644 --- a/prototypes/quic_demo/src/executable_end_server.rs +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -19,12 +19,18 @@ struct Opt { pub async fn main (args: &[OsString]) -> anyhow::Result <()> { let opt = Arc::new (Opt::from_iter (args)); - let server_cert = match opt.cert_url.as_ref () { - Some (url) => reqwest::get (url).await?.bytes ().await?, - None => tokio::fs::read ("quic_server.crt").await?.into (), + let server_cert: Vec = match opt.cert_url.as_ref () { + Some (url) => reqwest::get (url).await?.bytes ().await?.into_iter ().collect (), + None => tokio::fs::read ("quic_server.crt").await?, }; - let relay_addr = opt.relay_addr.clone ().unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; - let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; + let relay_addr: SocketAddr = opt.relay_addr.clone ().unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; + + let end_server = P4EndServer { + relay_addr: relay_addr, + server_cert: server_cert, + }; + + let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&end_server.server_cert])?; trace! ("Connecting to relay server"); @@ -33,7 +39,7 @@ pub async fn main (args: &[OsString]) -> anyhow::Result <()> { let quinn::NewConnection { mut bi_streams, .. - } = protocol::p4_connect_to_p3 (&endpoint, &relay_addr, &server_id).await?; + } = protocol::p4_connect_to_p3 (&endpoint, &end_server.relay_addr, &server_id).await?; debug! ("Connected to relay server"); trace! ("Accepting bi streams from P3"); @@ -45,6 +51,11 @@ pub async fn main (args: &[OsString]) -> anyhow::Result <()> { } } +struct P4EndServer { + relay_addr: SocketAddr, + server_cert: Vec , +} + async fn handle_bi_stream ( opt: Arc , relay_send: quinn::SendStream, From ee31d105c905f8550fb8c623e0a1004f8315127e Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 14:40:18 +0000 Subject: [PATCH 15/46] :rotating_light: fix cargo check warnings --- prototypes/quic_demo/src/bin/quic_demo_client.rs | 3 ++- .../quic_demo/src/bin/quic_demo_relay_server.rs | 11 +++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 9407d1d..1024ef0 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -50,7 +50,8 @@ async fn main () -> anyhow::Result <()> { // Beginning of per-connection stuff let task_tcp_server = tokio::spawn (async move { - loop { + let running = true; + while running { let (tcp_socket, _) = listener.accept ().await?; let connection = connection.clone (); let server_id = server_id.clone (); diff --git a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs index dcb5d5e..9b2dc51 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -89,24 +89,23 @@ async fn main () -> anyhow::Result <()> { let task_tcp_server = { let relay_state = Arc::clone (&relay_state); tokio::spawn (async move { - loop { + let running = true; + while running { let (tcp_socket, _) = tcp_listener.accept ().await?; - let server_id = "bogus_server".to_string (); - let relay_state = Arc::clone (&relay_state); tokio::spawn (async move { - let (client_recv, client_send) = tcp_socket.into_split (); + let (_client_recv, _client_send) = tcp_socket.into_split (); debug! ("Accepted direct TCP connection P1 --> P3"); let p4_server_proxies = relay_state.p4_server_proxies.lock ().await; - let p4 = match p4_server_proxies.get ("bogus_server") { + let _p4 = match p4_server_proxies.get ("bogus_server") { Some (x) => x, None => bail! ("That server isn't connected"), }; - unimplemented! (); + // unimplemented! (); /* p4.req_channel.send (RequestP2ToP4 { client_send, From 953254e55042b057d3dcf3fa411d19fab412004a Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 14:49:02 +0000 Subject: [PATCH 16/46] :recycle: refactor: continue extracting end server struct --- .../quic_demo/src/executable_end_server.rs | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs index f0afa11..ebfffb9 100644 --- a/prototypes/quic_demo/src/executable_end_server.rs +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -19,41 +19,59 @@ struct Opt { pub async fn main (args: &[OsString]) -> anyhow::Result <()> { let opt = Arc::new (Opt::from_iter (args)); - let server_cert: Vec = match opt.cert_url.as_ref () { + let relay_cert: Vec = match opt.cert_url.as_ref () { Some (url) => reqwest::get (url).await?.bytes ().await?.into_iter ().collect (), None => tokio::fs::read ("quic_server.crt").await?, }; let relay_addr: SocketAddr = opt.relay_addr.clone ().unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; - let end_server = P4EndServer { - relay_addr: relay_addr, - server_cert: server_cert, - }; + let id = opt.server_id.clone ().unwrap_or_else (|| "bogus_server".to_string ()); - let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&end_server.server_cert])?; + let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&relay_cert])?; trace! ("Connecting to relay server"); - let server_id = opt.server_id.clone ().unwrap_or_else (|| "bogus_server".to_string ()); - let quinn::NewConnection { - mut bi_streams, + bi_streams, .. - } = protocol::p4_connect_to_p3 (&endpoint, &end_server.relay_addr, &server_id).await?; + } = protocol::p4_connect_to_p3 (&endpoint, &relay_addr, &id).await?; + + let mut end_server = P4EndServer { + bi_streams, + id, + relay_addr, + relay_cert, + }; debug! ("Connected to relay server"); trace! ("Accepting bi streams from P3"); loop { - let (relay_send, relay_recv) = bi_streams.next ().await.ok_or_else (|| anyhow::anyhow! ("Relay server didn't open a bi stream"))??; + let (relay_send, relay_recv) = end_server.bi_streams.next ().await.ok_or_else (|| anyhow::anyhow! ("Relay server didn't open a bi stream"))??; tokio::spawn (handle_bi_stream (Arc::clone (&opt), relay_send, relay_recv)); } } -struct P4EndServer { +pub struct P4EndServer { + bi_streams: quinn::IncomingBiStreams, + id: String, relay_addr: SocketAddr, - server_cert: Vec , + relay_cert: Vec , +} + +impl P4EndServer { + pub fn id (&self) -> &str { + &self.id + } + + pub fn relay_addr (&self) -> SocketAddr { + self.relay_addr + } + + pub fn relay_cert (&self) -> &[u8] { + &self.relay_cert + } } async fn handle_bi_stream ( From a2d4ae81e0f2ab6a1080958ebf10cbefa6689c15 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 15:19:48 +0000 Subject: [PATCH 17/46] :recycle: refactor --- .../quic_demo/src/executable_end_server.rs | 119 +++++++++++------- 1 file changed, 77 insertions(+), 42 deletions(-) diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs index ebfffb9..3c1ee9f 100644 --- a/prototypes/quic_demo/src/executable_end_server.rs +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -4,6 +4,8 @@ use tokio::net::TcpStream; use crate::prelude::*; use protocol::PeerId; +/// A partially-filled-out config that structopt can deal with +/// Try to turn this into a Config as soon as possible. #[derive (Debug, StructOpt)] struct Opt { #[structopt (long)] @@ -17,65 +19,98 @@ struct Opt { } pub async fn main (args: &[OsString]) -> anyhow::Result <()> { - let opt = Arc::new (Opt::from_iter (args)); + let opt = Opt::from_iter (args); + let conf = opt.into_config ().await?; - let relay_cert: Vec = match opt.cert_url.as_ref () { - Some (url) => reqwest::get (url).await?.bytes ().await?.into_iter ().collect (), - None => tokio::fs::read ("quic_server.crt").await?, - }; - let relay_addr: SocketAddr = opt.relay_addr.clone ().unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; + let mut end_server = P4EndServer::connect (conf).await?; - let id = opt.server_id.clone ().unwrap_or_else (|| "bogus_server".to_string ()); + end_server.run ().await?; + Ok (()) +} + +/// A filled-out config for constructing an end server +#[derive (Clone)] +pub struct Config { + pub debug_echo: bool, + pub id: String, + pub relay_addr: SocketAddr, + pub relay_cert: Vec , +} + +impl Opt { + /// Converts self into a Config that the server can use. + /// Performs I/O to load the relay cert from disk or from HTTP. + /// Fails if arguments can't be parsed or if I/O fails. - let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&relay_cert])?; - - trace! ("Connecting to relay server"); - - let quinn::NewConnection { - bi_streams, - .. - } = protocol::p4_connect_to_p3 (&endpoint, &relay_addr, &id).await?; - - let mut end_server = P4EndServer { - bi_streams, - id, - relay_addr, - relay_cert, - }; - - debug! ("Connected to relay server"); - trace! ("Accepting bi streams from P3"); - - loop { - let (relay_send, relay_recv) = end_server.bi_streams.next ().await.ok_or_else (|| anyhow::anyhow! ("Relay server didn't open a bi stream"))??; + pub async fn into_config (self) -> anyhow::Result { + let id = self.server_id.clone ().unwrap_or_else (|| "bogus_server".to_string ()); - tokio::spawn (handle_bi_stream (Arc::clone (&opt), relay_send, relay_recv)); + let relay_addr: SocketAddr = self.relay_addr.clone ().unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; + + // Do I/O after all parsing is done. + // We don't want to waste a network request only to come back and error + // out on like "127.oooo.1" not parsing into a relay address. + + let relay_cert: Vec = match self.cert_url.as_ref () { + Some (url) => reqwest::get (url).await?.bytes ().await?.into_iter ().collect (), + None => tokio::fs::read ("quic_server.crt").await?, + }; + + Ok (Config { + debug_echo: self.debug_echo, + id, + relay_addr, + relay_cert, + }) } } +/// An end server that is connected to its relay server pub struct P4EndServer { bi_streams: quinn::IncomingBiStreams, - id: String, - relay_addr: SocketAddr, - relay_cert: Vec , + conf: Arc , } impl P4EndServer { - pub fn id (&self) -> &str { - &self.id + /// Tries to connect to a relay server and return an end server. + /// Fails if there's a network issue while making the QUIC connection + /// to the relay server. + + pub async fn connect (conf: Config) -> anyhow::Result { + trace! ("P4 end server making its QUIC endpoint"); + let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&conf.relay_cert])?; + + trace! ("P4 end server connecting to P3 relay server"); + let quinn::NewConnection { + bi_streams, + .. + } = protocol::p4_connect_to_p3 (&endpoint, &conf.relay_addr, &conf.id).await?; + + debug! ("Connected to relay server"); + + Ok (P4EndServer { + bi_streams, + conf: Arc::new (conf), + }) } - pub fn relay_addr (&self) -> SocketAddr { - self.relay_addr + pub fn config (&self) -> &Config { + &*self.conf } - pub fn relay_cert (&self) -> &[u8] { - &self.relay_cert + pub async fn run (&mut self) -> anyhow::Result <()> { + trace! ("Accepting bi streams from P3"); + + loop { + let (relay_send, relay_recv) = self.bi_streams.next ().await.ok_or_else (|| anyhow::anyhow! ("Relay server didn't open a bi stream"))??; + + tokio::spawn (handle_bi_stream (Arc::clone (&self.conf), relay_send, relay_recv)); + } } } async fn handle_bi_stream ( - opt: Arc , + conf: Arc , relay_send: quinn::SendStream, mut relay_recv: quinn::RecvStream, ) -> anyhow::Result <()> @@ -84,14 +119,14 @@ async fn handle_bi_stream ( protocol::P3ToP4Stream::NewPtthConnection { client_id, .. - } => handle_new_ptth_connection (opt, relay_send, relay_recv, client_id).await?, + } => handle_new_ptth_connection (conf, relay_send, relay_recv, client_id).await?, } Ok (()) } async fn handle_new_ptth_connection ( - opt: Arc , + conf: Arc , mut relay_send: quinn::SendStream, mut relay_recv: quinn::RecvStream, _client_id: String, @@ -108,7 +143,7 @@ async fn handle_new_ptth_connection ( debug! ("Started PTTH connection"); - if opt.debug_echo { + if conf.debug_echo { relay_send.write (b"Connected to P4=P5 debug echo server\n").await?; debug! ("Relaying bytes using internal debug echo server (P4=P5)"); tokio::io::copy (&mut relay_recv, &mut relay_send).await?; From 2b60396a266a4b8ae8bdd92f951cb7a2045c0150 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 16:18:02 +0000 Subject: [PATCH 18/46] :heavy_plus_sign: start adding graceful shutdown to the end server I think it only works if there are no streams running. So, might want to double-check this before it goes into prod --- Cargo.lock | 13 +-- prototypes/quic_demo/Cargo.toml | 1 + .../quic_demo/src/bin/quic_demo_end_server.rs | 13 ++- .../quic_demo/src/executable_end_server.rs | 92 ++++++++++++++----- 4 files changed, 91 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 52fbe6c..baec8a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,9 +93,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "blake3" @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "377c9b002a72a0b2c1a18c62e2f3864bdfea4a015e3683a96e24aa45dd6c02d1" +checksum = "a19c6cedffdc8c03a3346d723eb20bd85a13362bb96dc2ac000842c6381ec7bf" dependencies = [ "nix", "winapi", @@ -875,9 +875,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.22.2" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3bb9a13fa32bc5aeb64150cd3f32d6cf4c748f8f8a417cce5d2eb976a8370ba" +checksum = "f305c2c2e4c39a82f7bf0bf65fb557f9070ce06781d4f2454295cc34b1c43188" dependencies = [ "bitflags", "cc", @@ -1364,6 +1364,7 @@ version = "0.1.0" dependencies = [ "anyhow", "base64", + "ctrlc", "futures-util", "hyper", "quinn", diff --git a/prototypes/quic_demo/Cargo.toml b/prototypes/quic_demo/Cargo.toml index d10125b..9e591f3 100644 --- a/prototypes/quic_demo/Cargo.toml +++ b/prototypes/quic_demo/Cargo.toml @@ -10,6 +10,7 @@ license = "AGPL-3.0" [dependencies] anyhow = "1.0.38" base64 = "0.13.0" +ctrlc = "3.2.1" # fltk = "1.1.1" futures-util = "0.3.9" hyper = { version = "0.14.4", features = ["http1", "server", "stream", "tcp"] } diff --git a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs index f2d9f75..6453666 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs @@ -2,11 +2,22 @@ use std::{ iter::FromIterator, }; +use tokio::sync::watch; + +use quic_demo::prelude::*; + #[tokio::main] async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); let args = Vec::from_iter (std::env::args_os ()); - quic_demo::executable_end_server::main (&args).await + let (shutdown_tx, shutdown_rx) = watch::channel (false); + + ctrlc::set_handler (move || { + shutdown_tx.send (true).expect ("Couldn't forward Ctrl+C signal"); + })?; + trace! ("Set Ctrl+C handler"); + + quic_demo::executable_end_server::main (&args, Some (shutdown_rx)).await } diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs index 3c1ee9f..08a31a4 100644 --- a/prototypes/quic_demo/src/executable_end_server.rs +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -1,5 +1,8 @@ use structopt::StructOpt; -use tokio::net::TcpStream; +use tokio::{ + net::TcpStream, + sync::watch, +}; use crate::prelude::*; use protocol::PeerId; @@ -18,13 +21,31 @@ struct Opt { cert_url: Option , } -pub async fn main (args: &[OsString]) -> anyhow::Result <()> { +pub async fn main (args: &[OsString], shutdown_rx: Option >) -> anyhow::Result <()> { let opt = Opt::from_iter (args); let conf = opt.into_config ().await?; - let mut end_server = P4EndServer::connect (conf).await?; + let end_server = Arc::new (P4EndServer::connect (conf).await?); + + let run_task = { + let end_server = Arc::clone (&end_server); + tokio::spawn (async move { + end_server.run ().await?; + Ok::<_, anyhow::Error> (()) + }) + }; + + if let Some (mut shutdown_rx) = shutdown_rx { + while ! *shutdown_rx.borrow () { + shutdown_rx.changed ().await?; + } + end_server.shut_down ()?; + } + + run_task.await??; + + trace! ("P4 end server shut down gracefully."); - end_server.run ().await?; Ok (()) } @@ -67,30 +88,24 @@ impl Opt { /// An end server that is connected to its relay server pub struct P4EndServer { - bi_streams: quinn::IncomingBiStreams, + endpoint: quinn::Endpoint, conf: Arc , + shutdown_tx: watch::Sender , + shutdown_rx: watch::Receiver , } impl P4EndServer { - /// Tries to connect to a relay server and return an end server. - /// Fails if there's a network issue while making the QUIC connection - /// to the relay server. - pub async fn connect (conf: Config) -> anyhow::Result { trace! ("P4 end server making its QUIC endpoint"); let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&conf.relay_cert])?; - trace! ("P4 end server connecting to P3 relay server"); - let quinn::NewConnection { - bi_streams, - .. - } = protocol::p4_connect_to_p3 (&endpoint, &conf.relay_addr, &conf.id).await?; - - debug! ("Connected to relay server"); + let (shutdown_tx, shutdown_rx) = watch::channel (false); Ok (P4EndServer { - bi_streams, conf: Arc::new (conf), + endpoint, + shutdown_tx, + shutdown_rx, }) } @@ -98,14 +113,49 @@ impl P4EndServer { &*self.conf } - pub async fn run (&mut self) -> anyhow::Result <()> { + pub async fn run (&self) -> anyhow::Result <()> { + trace! ("P4 end server connecting to P3 relay server"); + let quinn::NewConnection { + mut bi_streams, + .. + } = protocol::p4_connect_to_p3 ( + &self.endpoint, + &self.conf.relay_addr, + &self.conf.id + ).await?; + + debug! ("Connected to relay server"); + trace! ("Accepting bi streams from P3"); + let mut shutdown_rx = self.shutdown_rx.clone (); + loop { - let (relay_send, relay_recv) = self.bi_streams.next ().await.ok_or_else (|| anyhow::anyhow! ("Relay server didn't open a bi stream"))??; - - tokio::spawn (handle_bi_stream (Arc::clone (&self.conf), relay_send, relay_recv)); + tokio::select! { + _ = shutdown_rx.changed () => { + if *shutdown_rx.borrow () { + trace! ("P4 incoming bi streams task caught graceful shutdown"); + break; + } + } + stream_opt = bi_streams.next () => { + let (relay_send, relay_recv) = stream_opt.ok_or_else (|| anyhow::anyhow! ("P4 ran out of incoming streams. Maybe P3 shut down or disconnected?"))??; + + tokio::spawn (handle_bi_stream (Arc::clone (&self.conf), relay_send, relay_recv)); + } + }; } + + Ok (()) + } + + pub fn shut_down (&self) -> anyhow::Result <()> { + trace! ("P4 end server shutting down..."); + Ok (self.shutdown_tx.send (true)?) + } + + pub fn shutting_down (&self) -> bool { + *self.shutdown_rx.borrow () } } From fc6a9c9e1e944171aae25343996794af2f18ac54 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 16:23:21 +0000 Subject: [PATCH 19/46] fix P2 and P4 to use the default cert path and print the client port for easier testing --- prototypes/quic_demo/src/bin/quic_demo_client.rs | 4 ++-- prototypes/quic_demo/src/executable_end_server.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 1024ef0..66fb152 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -24,7 +24,7 @@ async fn main () -> anyhow::Result <()> { let opt = Opt::from_args (); - let server_cert = tokio::fs::read ("quic_server.crt").await?; + let server_cert = tokio::fs::read ("ptth_quic_output/quic_server.crt").await?; let relay_addr = opt.relay_addr.unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; @@ -83,7 +83,7 @@ async fn main () -> anyhow::Result <()> { Ok::<_, anyhow::Error> (()) }); - debug! ("Accepting local TCP connections from P1"); + debug! ("Accepting local TCP connections from P1 at {}", client_tcp_port); task_tcp_server.await??; diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs index 08a31a4..43d7833 100644 --- a/prototypes/quic_demo/src/executable_end_server.rs +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -74,7 +74,7 @@ impl Opt { let relay_cert: Vec = match self.cert_url.as_ref () { Some (url) => reqwest::get (url).await?.bytes ().await?.into_iter ().collect (), - None => tokio::fs::read ("quic_server.crt").await?, + None => tokio::fs::read ("ptth_quic_output/quic_server.crt").await?, }; Ok (Config { From a906472adddbf3dee0e78969af0d713c3f0f21e4 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 16:33:14 +0000 Subject: [PATCH 20/46] :recycle: refactor: clean up client to match the end server style --- .../quic_demo/src/bin/quic_demo_client.rs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 66fb152..2f45cb8 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -24,6 +24,8 @@ async fn main () -> anyhow::Result <()> { let opt = Opt::from_args (); + //let conf = opt.into_config (); + let server_cert = tokio::fs::read ("ptth_quic_output/quic_server.crt").await?; let relay_addr = opt.relay_addr.unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; @@ -89,3 +91,37 @@ async fn main () -> anyhow::Result <()> { Ok (()) } + +/// A filled-out config for constructing a P2 client +#[derive (Clone)] +pub struct Config { + client_tcp_port: u16, + server_tcp_port: u16, + client_id: String, + server_id: String, + relay_addr: SocketAddr, + relay_cert: Vec , +} + +impl Opt { + pub async fn into_config (self) -> anyhow::Result { + let client_tcp_port = self.client_tcp_port.unwrap_or (30381); + let server_tcp_port = self.server_tcp_port.unwrap_or (30382); + let client_id = self.client_id.unwrap_or_else (|| "bogus_client".to_string ()); + let server_id = self.server_id.unwrap_or_else (|| "bogus_server".to_string ()); + let relay_addr = self.relay_addr.unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; + + // Begin I/O + + let relay_cert = tokio::fs::read ("ptth_quic_output/quic_server.crt").await?; + + Ok (Config { + client_tcp_port, + server_tcp_port, + client_id, + server_id, + relay_addr, + relay_cert, + }) + } +} From 88fab238716ff98a8c84d57fb34933adf20f769f Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 16:36:06 +0000 Subject: [PATCH 21/46] :recycle: refactor --- .../quic_demo/src/bin/quic_demo_client.rs | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 2f45cb8..1060751 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -23,30 +23,20 @@ async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); let opt = Opt::from_args (); + let conf = opt.into_config ().await?; - //let conf = opt.into_config (); - - let server_cert = tokio::fs::read ("ptth_quic_output/quic_server.crt").await?; - let relay_addr = opt.relay_addr.unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; - let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; + let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&conf.relay_cert])?; debug! ("Connecting to relay server"); - let client_id = opt.client_id.unwrap_or_else (|| "bogus_client".to_string ()); - let quinn::NewConnection { connection, .. - } = protocol::p2_connect_to_p3 (&endpoint, &relay_addr, &client_id).await?; + } = protocol::p2_connect_to_p3 (&endpoint, &conf.relay_addr, &conf.client_id).await?; - // End of per-client stuff - // Beginning of per-port stuff + let listener = TcpListener::bind (("127.0.0.1", conf.client_tcp_port)).await?; - let server_id = opt.server_id.unwrap_or_else (|| "bogus_server".to_string ()); - - let client_tcp_port = opt.client_tcp_port.unwrap_or (30381); - let server_tcp_port = opt.server_tcp_port.unwrap_or (30382); - let listener = TcpListener::bind (("127.0.0.1", client_tcp_port)).await?; + debug! ("Accepting local TCP connections from P1 at {}", conf.client_tcp_port); // End of per-port stuff // Beginning of per-connection stuff @@ -56,7 +46,8 @@ async fn main () -> anyhow::Result <()> { while running { let (tcp_socket, _) = listener.accept ().await?; let connection = connection.clone (); - let server_id = server_id.clone (); + let server_id = conf.server_id.clone (); + let server_tcp_port = conf.server_tcp_port; tokio::spawn (async move { let (local_recv, local_send) = tcp_socket.into_split (); @@ -85,8 +76,6 @@ async fn main () -> anyhow::Result <()> { Ok::<_, anyhow::Error> (()) }); - debug! ("Accepting local TCP connections from P1 at {}", client_tcp_port); - task_tcp_server.await??; Ok (()) From 6fbe35379b2ac20812f3dd92d017c57b6b9dcb8e Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 16:48:25 +0000 Subject: [PATCH 22/46] :recycle: refactor --- .../quic_demo/src/bin/quic_demo_client.rs | 128 +++++++++++------- .../quic_demo/src/executable_end_server.rs | 5 +- 2 files changed, 78 insertions(+), 55 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 1060751..64e252d 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -25,62 +25,86 @@ async fn main () -> anyhow::Result <()> { let opt = Opt::from_args (); let conf = opt.into_config ().await?; - let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&conf.relay_cert])?; - - debug! ("Connecting to relay server"); - - let quinn::NewConnection { - connection, - .. - } = protocol::p2_connect_to_p3 (&endpoint, &conf.relay_addr, &conf.client_id).await?; - - let listener = TcpListener::bind (("127.0.0.1", conf.client_tcp_port)).await?; - - debug! ("Accepting local TCP connections from P1 at {}", conf.client_tcp_port); - - // End of per-port stuff - // Beginning of per-connection stuff - - let task_tcp_server = tokio::spawn (async move { - let running = true; - while running { - let (tcp_socket, _) = listener.accept ().await?; - let connection = connection.clone (); - let server_id = conf.server_id.clone (); - let server_tcp_port = conf.server_tcp_port; - - tokio::spawn (async move { - let (local_recv, local_send) = tcp_socket.into_split (); - - debug! ("Starting PTTH connection"); - - let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (&connection, &server_id, server_tcp_port).await?; - - trace! ("Relaying bytes..."); - - let ptth_conn = quic_demo::connection::NewConnection { - local_send, - local_recv, - relay_send, - relay_recv, - }.build (); - - ptth_conn.wait_for_close ().await?; - - debug! ("Ended PTTH connection"); - - Ok::<_, anyhow::Error> (()) - }); - } - - Ok::<_, anyhow::Error> (()) - }); - - task_tcp_server.await??; + let client = P2Client::connect (conf)?; + client.run ().await?; Ok (()) } +pub struct P2Client { + endpoint: quinn::Endpoint, + conf: Arc , +} + +impl P2Client { + pub fn connect (conf: Config) -> anyhow::Result { + let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&conf.relay_cert])?; + let conf = Arc::new (conf); + + Ok (Self { + endpoint, + conf, + }) + } + + pub async fn run (&self) -> anyhow::Result <()> { + debug! ("P2 client connecting to P3 relay server"); + + let conf = Arc::clone (&self.conf); + + let quinn::NewConnection { + connection, + .. + } = protocol::p2_connect_to_p3 (&self.endpoint, &conf.relay_addr, &conf.client_id).await?; + + let listener = TcpListener::bind (("127.0.0.1", conf.client_tcp_port)).await?; + + debug! ("Accepting local TCP connections from P1 at {}", conf.client_tcp_port); + + // End of per-port stuff + // Beginning of per-connection stuff + + let task_tcp_server = tokio::spawn (async move { + let running = true; + while running { + let (tcp_socket, _) = listener.accept ().await?; + let connection = connection.clone (); + let server_id = conf.server_id.clone (); + let server_tcp_port = conf.server_tcp_port; + + tokio::spawn (async move { + let (local_recv, local_send) = tcp_socket.into_split (); + + debug! ("Starting PTTH connection"); + + let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (&connection, &server_id, server_tcp_port).await?; + + trace! ("Relaying bytes..."); + + let ptth_conn = quic_demo::connection::NewConnection { + local_send, + local_recv, + relay_send, + relay_recv, + }.build (); + + ptth_conn.wait_for_close ().await?; + + debug! ("Ended PTTH connection"); + + Ok::<_, anyhow::Error> (()) + }); + } + + Ok::<_, anyhow::Error> (()) + }); + + task_tcp_server.await??; + + Ok (()) + } +} + /// A filled-out config for constructing a P2 client #[derive (Clone)] pub struct Config { diff --git a/prototypes/quic_demo/src/executable_end_server.rs b/prototypes/quic_demo/src/executable_end_server.rs index 43d7833..769eda1 100644 --- a/prototypes/quic_demo/src/executable_end_server.rs +++ b/prototypes/quic_demo/src/executable_end_server.rs @@ -25,7 +25,7 @@ pub async fn main (args: &[OsString], shutdown_rx: Option , @@ -95,7 +94,7 @@ pub struct P4EndServer { } impl P4EndServer { - pub async fn connect (conf: Config) -> anyhow::Result { + pub fn connect (conf: Config) -> anyhow::Result { trace! ("P4 end server making its QUIC endpoint"); let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&conf.relay_cert])?; From a3b62b012d4a0e72ae94ff32cabf2f938e666aeb Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 16:56:12 +0000 Subject: [PATCH 23/46] :recycle: refactor --- .../quic_demo/src/bin/quic_demo_client.rs | 115 ++++++++++++------ 1 file changed, 81 insertions(+), 34 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 64e252d..20bd5c1 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -1,5 +1,8 @@ use structopt::StructOpt; -use tokio::net::TcpListener; +use tokio::net::{ + TcpListener, + TcpStream, +}; use quic_demo::prelude::*; use protocol::PeerId; @@ -64,45 +67,89 @@ impl P2Client { // End of per-port stuff // Beginning of per-connection stuff - let task_tcp_server = tokio::spawn (async move { - let running = true; - while running { - let (tcp_socket, _) = listener.accept ().await?; - let connection = connection.clone (); - let server_id = conf.server_id.clone (); - let server_tcp_port = conf.server_tcp_port; - - tokio::spawn (async move { - let (local_recv, local_send) = tcp_socket.into_split (); - - debug! ("Starting PTTH connection"); - - let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (&connection, &server_id, server_tcp_port).await?; - - trace! ("Relaying bytes..."); - - let ptth_conn = quic_demo::connection::NewConnection { - local_send, - local_recv, - relay_send, - relay_recv, - }.build (); - - ptth_conn.wait_for_close ().await?; - - debug! ("Ended PTTH connection"); - - Ok::<_, anyhow::Error> (()) - }); - } + let task_tcp_server = { + let connection = connection.clone (); - Ok::<_, anyhow::Error> (()) - }); + tokio::spawn (async move { + Self::run_tcp_server (listener, connection, &*conf).await + }) + }; task_tcp_server.await??; Ok (()) } + + /// Runs a TCP listen to forward a single TCP port + + async fn run_tcp_server ( + listener: TcpListener, + connection: quinn::Connection, + conf: &Config, + ) -> anyhow::Result <()> { + let running = true; + while running { + let (tcp_socket, _) = listener.accept ().await?; + let connection = connection.clone (); + let server_id = conf.server_id.clone (); + let server_tcp_port = conf.server_tcp_port; + + tokio::spawn (async move { + let (local_recv, local_send) = tcp_socket.into_split (); + + debug! ("Starting PTTH connection"); + + let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (&connection, &server_id, server_tcp_port).await?; + + trace! ("Relaying bytes..."); + + let ptth_conn = quic_demo::connection::NewConnection { + local_send, + local_recv, + relay_send, + relay_recv, + }.build (); + + ptth_conn.wait_for_close ().await?; + + debug! ("Ended PTTH connection"); + + Ok::<_, anyhow::Error> (()) + }); + } + + Ok (()) + } + + /// Forwards a single TCP stream + + async fn run_tcp_stream ( + connection: quinn::Connection, + tcp_socket: TcpStream, + server_id: &str, + server_tcp_port: u16, + ) -> anyhow::Result <()> { + let (local_recv, local_send) = tcp_socket.into_split (); + + debug! ("Starting PTTH connection"); + + let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (&connection, server_id, server_tcp_port).await?; + + trace! ("Relaying bytes..."); + + let ptth_conn = quic_demo::connection::NewConnection { + local_send, + local_recv, + relay_send, + relay_recv, + }.build (); + + ptth_conn.wait_for_close ().await?; + + debug! ("Ended PTTH connection"); + + Ok (()) + } } /// A filled-out config for constructing a P2 client From c2caeb405cbd1da81d29d5d262639e5a977fb249 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 16:58:12 +0000 Subject: [PATCH 24/46] :recycle: refactor --- .../quic_demo/src/bin/quic_demo_client.rs | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 20bd5c1..41817e6 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -89,30 +89,13 @@ impl P2Client { ) -> anyhow::Result <()> { let running = true; while running { - let (tcp_socket, _) = listener.accept ().await?; + let (tcp_stream, _) = listener.accept ().await?; let connection = connection.clone (); let server_id = conf.server_id.clone (); let server_tcp_port = conf.server_tcp_port; tokio::spawn (async move { - let (local_recv, local_send) = tcp_socket.into_split (); - - debug! ("Starting PTTH connection"); - - let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (&connection, &server_id, server_tcp_port).await?; - - trace! ("Relaying bytes..."); - - let ptth_conn = quic_demo::connection::NewConnection { - local_send, - local_recv, - relay_send, - relay_recv, - }.build (); - - ptth_conn.wait_for_close ().await?; - - debug! ("Ended PTTH connection"); + Self::run_tcp_stream (&connection, tcp_stream, &server_id, server_tcp_port).await?; Ok::<_, anyhow::Error> (()) }); @@ -124,16 +107,16 @@ impl P2Client { /// Forwards a single TCP stream async fn run_tcp_stream ( - connection: quinn::Connection, - tcp_socket: TcpStream, + connection: &quinn::Connection, + tcp_stream: TcpStream, server_id: &str, server_tcp_port: u16, ) -> anyhow::Result <()> { - let (local_recv, local_send) = tcp_socket.into_split (); + let (local_recv, local_send) = tcp_stream.into_split (); debug! ("Starting PTTH connection"); - let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (&connection, server_id, server_tcp_port).await?; + let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (connection, server_id, server_tcp_port).await?; trace! ("Relaying bytes..."); From c002665f6c0e5a3054aa9f341533133824185827 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 17:14:32 +0000 Subject: [PATCH 25/46] :recycle: refactor: use the code from client_proxy instead --- .../quic_demo/src/bin/quic_demo_client.rs | 85 ++++++------------- prototypes/quic_demo/src/client_proxy.rs | 5 +- 2 files changed, 29 insertions(+), 61 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 41817e6..57e149c 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -1,10 +1,15 @@ use structopt::StructOpt; -use tokio::net::{ - TcpListener, - TcpStream, +use tokio::{ + sync::watch, }; -use quic_demo::prelude::*; +use quic_demo::{ + client_proxy::{ + ForwardingParams, + forward_port, + }, + prelude::*, +}; use protocol::PeerId; #[derive (Debug, StructOpt)] @@ -60,76 +65,36 @@ impl P2Client { .. } = protocol::p2_connect_to_p3 (&self.endpoint, &conf.relay_addr, &conf.client_id).await?; - let listener = TcpListener::bind (("127.0.0.1", conf.client_tcp_port)).await?; + let client_tcp_port = conf.client_tcp_port; - debug! ("Accepting local TCP connections from P1 at {}", conf.client_tcp_port); + debug! ("Accepting local TCP connections from P1 at {}", client_tcp_port); // End of per-port stuff // Beginning of per-connection stuff + let (_shutdown_flag_tx, shutdown_flag_rx) = watch::channel (true); + let task_tcp_server = { let connection = connection.clone (); - - tokio::spawn (async move { - Self::run_tcp_server (listener, connection, &*conf).await - }) - }; - - task_tcp_server.await??; - - Ok (()) - } - - /// Runs a TCP listen to forward a single TCP port - - async fn run_tcp_server ( - listener: TcpListener, - connection: quinn::Connection, - conf: &Config, - ) -> anyhow::Result <()> { - let running = true; - while running { - let (tcp_stream, _) = listener.accept ().await?; - let connection = connection.clone (); let server_id = conf.server_id.clone (); let server_tcp_port = conf.server_tcp_port; tokio::spawn (async move { - Self::run_tcp_stream (&connection, tcp_stream, &server_id, server_tcp_port).await?; + forward_port ( + connection, + ForwardingParams { + client_tcp_port, + server_id, + server_tcp_port, + }, + shutdown_flag_rx, + ).await?; Ok::<_, anyhow::Error> (()) - }); - } + }) + }; - Ok (()) - } - - /// Forwards a single TCP stream - - async fn run_tcp_stream ( - connection: &quinn::Connection, - tcp_stream: TcpStream, - server_id: &str, - server_tcp_port: u16, - ) -> anyhow::Result <()> { - let (local_recv, local_send) = tcp_stream.into_split (); - - debug! ("Starting PTTH connection"); - - let (relay_send, relay_recv) = protocol::p2_connect_to_p5 (connection, server_id, server_tcp_port).await?; - - trace! ("Relaying bytes..."); - - let ptth_conn = quic_demo::connection::NewConnection { - local_send, - local_recv, - relay_send, - relay_recv, - }.build (); - - ptth_conn.wait_for_close ().await?; - - debug! ("Ended PTTH connection"); + task_tcp_server.await??; Ok (()) } diff --git a/prototypes/quic_demo/src/client_proxy.rs b/prototypes/quic_demo/src/client_proxy.rs index 0701ffc..8780efc 100644 --- a/prototypes/quic_demo/src/client_proxy.rs +++ b/prototypes/quic_demo/src/client_proxy.rs @@ -44,7 +44,10 @@ pub struct ForwardingParams { pub server_tcp_port: u16, } -async fn forward_port ( +/// Starts a TCP listener that can forward any number of TCP streams to +/// the same client:server port combination + +pub async fn forward_port ( connection_p2_p3: quinn::Connection, params: ForwardingParams, shutdown_flag_rx: tokio::sync::watch::Receiver , From 68eb6f911b05a11b3476d397fd01965df4dab6f6 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 17:22:04 +0000 Subject: [PATCH 26/46] :rotating_light: clean up clippy warnings --- prototypes/quic_demo/src/bin/quic_demo_relay_server.rs | 6 ++++-- prototypes/quic_demo/src/protocol.rs | 2 +- prototypes/quic_demo/src/quinn_utils.rs | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs index 9b2dc51..e7be1a3 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -10,6 +10,7 @@ use hyper::{ StatusCode, }; use structopt::StructOpt; +use tokio::sync::watch; use quic_demo::prelude::*; use protocol::PeerId; @@ -56,6 +57,8 @@ async fn main () -> anyhow::Result <()> { let tcp_port = 30382; let tcp_listener = TcpListener::bind (("127.0.0.1", tcp_port)).await?; + let (_running_tx, running_rx) = watch::channel (true); + let task_quic_server = { let relay_state = Arc::clone (&relay_state); tokio::spawn (async move { @@ -89,8 +92,7 @@ async fn main () -> anyhow::Result <()> { let task_tcp_server = { let relay_state = Arc::clone (&relay_state); tokio::spawn (async move { - let running = true; - while running { + while *running_rx.borrow () { let (tcp_socket, _) = tcp_listener.accept ().await?; let relay_state = Arc::clone (&relay_state); diff --git a/prototypes/quic_demo/src/protocol.rs b/prototypes/quic_demo/src/protocol.rs index 9abb0e4..56f05a8 100644 --- a/prototypes/quic_demo/src/protocol.rs +++ b/prototypes/quic_demo/src/protocol.rs @@ -61,7 +61,7 @@ pub async fn p2_connect_to_p5 ( let cmd_type = Command::CONNECT_P2_TO_P4.0; send.write_all (&[cmd_type, 0, 0, 0]).await?; - send_lv_string (&mut send, &server_id).await?; + send_lv_string (&mut send, server_id).await?; expect_exact_response (&mut recv, [Command::OKAY.0, cmd_type, 0, 0]).await .context ("P2 didn't get OK response when asking P3 to connect P2 to P4")?; diff --git a/prototypes/quic_demo/src/quinn_utils.rs b/prototypes/quic_demo/src/quinn_utils.rs index c99effc..2eaba64 100644 --- a/prototypes/quic_demo/src/quinn_utils.rs +++ b/prototypes/quic_demo/src/quinn_utils.rs @@ -58,7 +58,7 @@ pub fn make_server_endpoint(bind_addr: SocketAddr) -> anyhow::Result<(Incoming, fn configure_client(server_certs: &[&[u8]]) -> anyhow::Result { let mut cfg_builder = ClientConfigBuilder::default(); for cert in server_certs { - cfg_builder.add_certificate_authority(Certificate::from_der(&cert)?)?; + cfg_builder.add_certificate_authority(Certificate::from_der(cert)?)?; } Ok(cfg_builder.build()) } From 07fa3b97c33c71163ce27f158c0157256986db9a Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 17:39:51 +0000 Subject: [PATCH 27/46] update client GUI default cert path for easier testing --- prototypes/ptth_quic_client_gui/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prototypes/ptth_quic_client_gui/src/main.rs b/prototypes/ptth_quic_client_gui/src/main.rs index e11bfbe..544bd65 100644 --- a/prototypes/ptth_quic_client_gui/src/main.rs +++ b/prototypes/ptth_quic_client_gui/src/main.rs @@ -107,7 +107,7 @@ fn main () -> anyhow::Result <()> { let connection_p2_p3 = rt.block_on (async move { let server_cert = match opt.cert_url.as_ref () { Some (url) => reqwest::get (url).await?.bytes ().await?, - None => tokio::fs::read ("quic_server.crt").await?.into (), + None => tokio::fs::read ("ptth_quic_output/quic_server.crt").await?.into (), }; let relay_addr = opt.relay_addr From 11ee6292ba61238343adba0bedb75098036e9c99 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 10 Oct 2021 17:56:13 +0000 Subject: [PATCH 28/46] :recycle: refactor: extract GuiClient struct --- prototypes/ptth_quic_client_gui/src/main.rs | 81 +++++++++++++++------ 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/prototypes/ptth_quic_client_gui/src/main.rs b/prototypes/ptth_quic_client_gui/src/main.rs index 544bd65..438184d 100644 --- a/prototypes/ptth_quic_client_gui/src/main.rs +++ b/prototypes/ptth_quic_client_gui/src/main.rs @@ -10,6 +10,7 @@ use fltk::{ window::Window }; use structopt::StructOpt; +use tokio::runtime::Runtime; use quic_demo::{ client_proxy::*, @@ -35,9 +36,50 @@ enum Message { ClosePort (usize), } +struct GuiClient <'a> { + rt: &'a Runtime, + frame_status: Frame, + forwarding_instances: Vec