From 49d109544028b2e0e9cea44441826e0cfce9f34e Mon Sep 17 00:00:00 2001 From: _ <> Date: Mon, 19 Jul 2021 09:53:08 -0500 Subject: [PATCH 01/14] :construction: patch out FLTK so the relay can build --- prototypes/quic_demo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prototypes/quic_demo/Cargo.toml b/prototypes/quic_demo/Cargo.toml index ea603c0..2b9c2ac 100644 --- a/prototypes/quic_demo/Cargo.toml +++ b/prototypes/quic_demo/Cargo.toml @@ -10,7 +10,7 @@ license = "AGPL-3.0" [dependencies] anyhow = "1.0.38" base64 = "0.13.0" -fltk = "1.1.1" +# fltk = "1.1.1" futures-util = "0.3.9" quinn = "0.7.2" rcgen = "0.8.11" From 584654a6b4c191b41625c0b86341499a82ccadcf Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 10 Sep 2021 11:50:45 -0500 Subject: [PATCH 02/14] :pencil: testing plan for PTTH_QUIC --- docs/how-to/test-ptth-quic.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 docs/how-to/test-ptth-quic.md diff --git a/docs/how-to/test-ptth-quic.md b/docs/how-to/test-ptth-quic.md new file mode 100644 index 0000000..ba2fca8 --- /dev/null +++ b/docs/how-to/test-ptth-quic.md @@ -0,0 +1,8 @@ +# How-to: Test PTTH_QUIC + +- Put a couple terminals in `prototypes/quic_demo` +- Set up a relay `cargo run --bin quic_demo_relay_server` +- Verify that the relay has no servers connected +- Set up a server +- The relay should refuse the server's connection if its API key is not recognized +- Once the relay recognizes the API key, the server should automatically reconnect From 5ffdb5800dd1aafbac3c29fc303067f5ec4bc1a5 Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 10 Sep 2021 12:08:15 -0500 Subject: [PATCH 03/14] add HTTP server to the relay server for debugging --- Cargo.lock | 1 + prototypes/quic_demo/Cargo.toml | 1 + .../src/bin/quic_demo_relay_server.rs | 42 +++++++++++++++++++ prototypes/quic_demo/src/prelude.rs | 1 + 4 files changed, 45 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 5dd14f0..e062511 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1328,6 +1328,7 @@ dependencies = [ "anyhow", "base64", "futures-util", + "hyper", "quinn", "rcgen", "rmp-serde", diff --git a/prototypes/quic_demo/Cargo.toml b/prototypes/quic_demo/Cargo.toml index 2b9c2ac..a2e7d78 100644 --- a/prototypes/quic_demo/Cargo.toml +++ b/prototypes/quic_demo/Cargo.toml @@ -12,6 +12,7 @@ anyhow = "1.0.38" base64 = "0.13.0" # fltk = "1.1.1" futures-util = "0.3.9" +hyper = { version = "0.14.4", features = ["http1", "server", "stream", "tcp"] } quinn = "0.7.2" rcgen = "0.8.11" rmp-serde = "0.15.5" 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 171fc7c..3c57459 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -1,3 +1,14 @@ +use hyper::{ + Body, + Request, + Response, + Server, + service::{ + make_service_fn, + service_fn, + }, + StatusCode, +}; use structopt::StructOpt; use quic_demo::prelude::*; @@ -23,6 +34,26 @@ async fn main () -> anyhow::Result <()> { let relay_state = RelayState::default (); let relay_state = Arc::new (relay_state); + let make_svc = make_service_fn (|_conn| { + + + async { + Ok::<_, String> (service_fn (move |req| { + + + handle_http (req, ()) + })) + } + }); + + let http_addr = SocketAddr::from (([0, 0, 0, 0], 4004)); + + let http_server = Server::bind (&http_addr); + + tokio::spawn (async move { + http_server.serve (make_svc).await + }); + while let Some (conn) = incoming.next ().await { let relay_state = Arc::clone (&relay_state); @@ -44,6 +75,17 @@ async fn main () -> anyhow::Result <()> { Ok (()) } +async fn handle_http (req: Request , _state: ()) +-> anyhow::Result > +{ + let resp = Response::builder () + .status (StatusCode::OK) + .header ("content-type", "text/plain") + .body (Body::from ("pong\n"))?; + + Ok (resp) +} + #[derive (Default)] struct RelayState { p4_server_proxies: Mutex >, diff --git a/prototypes/quic_demo/src/prelude.rs b/prototypes/quic_demo/src/prelude.rs index 0315eda..ef31ce8 100644 --- a/prototypes/quic_demo/src/prelude.rs +++ b/prototypes/quic_demo/src/prelude.rs @@ -1,5 +1,6 @@ pub use std::{ collections::*, + net::SocketAddr, sync::{ Arc, atomic::{ From f26748035f74333e6a7ccd2e12c490a321e84259 Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 10 Sep 2021 12:30:12 -0500 Subject: [PATCH 04/14] the HTTP server now lists which end servers are connected --- .../src/bin/quic_demo_relay_server.rs | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 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 3c57459..72e47d5 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -31,20 +31,22 @@ async fn main () -> anyhow::Result <()> { println! ("Base64 cert: {}", base64::encode (&server_cert)); tokio::fs::write ("quic_server.crt", &server_cert).await?; - let relay_state = RelayState::default (); - let relay_state = Arc::new (relay_state); + let relay_state = Arc::new (RelayState::default ()); - let make_svc = make_service_fn (|_conn| { - - - async { - Ok::<_, String> (service_fn (move |req| { - - - handle_http (req, ()) - })) - } - }); + let make_svc = { + let relay_state = Arc::clone (&relay_state); + make_service_fn (move |_conn| { + let relay_state = Arc::clone (&relay_state); + + async move { + Ok::<_, String> (service_fn (move |req| { + let relay_state = Arc::clone (&relay_state); + + handle_http (req, relay_state) + })) + } + }) + }; let http_addr = SocketAddr::from (([0, 0, 0, 0], 4004)); @@ -75,13 +77,20 @@ async fn main () -> anyhow::Result <()> { Ok (()) } -async fn handle_http (req: Request , _state: ()) +async fn handle_http (req: Request , relay_state: Arc ) -> anyhow::Result > { + let debug_string; + { + let p4_server_proxies = relay_state.p4_server_proxies.lock ().await; + + debug_string = format! ("{:#?}\n", p4_server_proxies.keys ().collect::> ()); + } + let resp = Response::builder () .status (StatusCode::OK) .header ("content-type", "text/plain") - .body (Body::from ("pong\n"))?; + .body (Body::from (debug_string))?; Ok (resp) } From d9949f3f688a565171e448272a7ddf2572288031 Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 10 Sep 2021 12:42:46 -0500 Subject: [PATCH 05/14] :white_check_mark: working on manual test plans for PTTH_QUIC --- docs/how-to/test-ptth-quic.md | 24 ++++++++++++++----- .../quic_demo/src/bin/quic_demo_end_server.rs | 1 + .../src/bin/quic_demo_relay_server.rs | 2 ++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/docs/how-to/test-ptth-quic.md b/docs/how-to/test-ptth-quic.md index ba2fca8..3bc15a8 100644 --- a/docs/how-to/test-ptth-quic.md +++ b/docs/how-to/test-ptth-quic.md @@ -1,8 +1,20 @@ # How-to: Test PTTH_QUIC -- Put a couple terminals in `prototypes/quic_demo` -- Set up a relay `cargo run --bin quic_demo_relay_server` -- Verify that the relay has no servers connected -- Set up a server -- The relay should refuse the server's connection if its API key is not recognized -- Once the relay recognizes the API key, the server should automatically reconnect +## Initial setup + +- Open 3 terminals in `prototypes/quic_demo` +- Use `export RUST_LOG=quic_demo_relay_server=debug` to enable debug logging +for the terminal that will run the relay server +- Use `export RUST_LOG=quic_demo_end_server=debug` for the terminal that +will run the end server + +When the relay server is running, use curl to get the list of connected +end servers: `curl 127.0.0.1:4004` + +## Test loop - Happy path + +- Start a relay `cargo run --bin quic_demo_relay_server` +- Verify that the relay has no end servers connected +- Start an end server `cargo run --bin quic_demo_end_server` +- Verify that the end server connected + 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 19ba94d..c5a9feb 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs @@ -31,6 +31,7 @@ async fn main () -> anyhow::Result <()> { .. } = protocol::p4_connect_to_p3 (&endpoint, &relay_addr, &server_id).await?; + debug! ("Connected to relay server"); trace! ("Accepting bi streams from P3"); loop { 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 72e47d5..f2e51c9 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -56,6 +56,8 @@ async fn main () -> anyhow::Result <()> { http_server.serve (make_svc).await }); + debug! ("Serving HTTP on {:?}", http_addr); + while let Some (conn) = incoming.next ().await { let relay_state = Arc::clone (&relay_state); From e1da97a5171a58c6c7907a675d149326b9f9e15c Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 10 Sep 2021 14:16:38 -0500 Subject: [PATCH 06/14] add `--debug-echo` option for P4 end servers to run a simulated P5 TCP echo server This makes it possible to debug with only 4 processes instead of 5. --- docs/how-to/test-ptth-quic.md | 12 +++-- .../quic_demo/src/bin/quic_demo_end_server.rs | 47 ++++++++++++------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/docs/how-to/test-ptth-quic.md b/docs/how-to/test-ptth-quic.md index 3bc15a8..ff92c1f 100644 --- a/docs/how-to/test-ptth-quic.md +++ b/docs/how-to/test-ptth-quic.md @@ -4,9 +4,11 @@ - Open 3 terminals in `prototypes/quic_demo` - Use `export RUST_LOG=quic_demo_relay_server=debug` to enable debug logging -for the terminal that will run the relay server +for the terminal that will run the relay server (P3) - Use `export RUST_LOG=quic_demo_end_server=debug` for the terminal that -will run the end server +will run the end server (P4) +- Use `export RUST_LOG=quic_demo_client=debug` for the terminal that +will run the client (P2) When the relay server is running, use curl to get the list of connected end servers: `curl 127.0.0.1:4004` @@ -15,6 +17,8 @@ end servers: `curl 127.0.0.1:4004` - Start a relay `cargo run --bin quic_demo_relay_server` - Verify that the relay has no end servers connected -- Start an end server `cargo run --bin quic_demo_end_server` +- Start an end server `cargo run --bin quic_demo_end_server -- --debug-echo` - Verify that the end server connected - +- Start a client `cargo run --bin quic_demo_client` +- Connect to the client and verify that the debug echo server is running +`nc 127.0.0.1 30381` 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 c5a9feb..26c6c6d 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs @@ -10,21 +10,23 @@ struct Opt { relay_addr: Option , #[structopt (long)] server_id: Option , + #[structopt (long)] + debug_echo: bool, } #[tokio::main] async fn main () -> anyhow::Result <()> { tracing_subscriber::fmt::init (); - let opt = Opt::from_args (); + let opt = Arc::new (Opt::from_args ()); let server_cert = tokio::fs::read ("quic_server.crt").await?; - let relay_addr = opt.relay_addr.unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; + 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.unwrap_or_else (|| "bogus_server".to_string ()); + let server_id = opt.server_id.clone ().unwrap_or_else (|| "bogus_server".to_string ()); let quinn::NewConnection { mut bi_streams, @@ -37,11 +39,12 @@ async fn main () -> anyhow::Result <()> { 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 (relay_send, relay_recv)); + 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 <()> @@ -50,13 +53,14 @@ async fn handle_bi_stream ( protocol::P3ToP4Stream::NewPtthConnection { client_id, .. - } => handle_new_ptth_connection (relay_send, relay_recv, client_id).await?, + } => 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, @@ -73,19 +77,26 @@ async fn handle_new_ptth_connection ( debug! ("Started PTTH connection"); - 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?; + 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 (()) } From 16bde3a2cfb8a06e2474bb78847042e8a1511b4b Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 10 Sep 2021 15:36:03 -0500 Subject: [PATCH 07/14] :construction: wip: working on a way to make P2 optional --- .../quic_demo/src/bin/quic_demo_client.rs | 66 +++++++------ .../src/bin/quic_demo_relay_server.rs | 92 ++++++++++++++----- prototypes/quic_demo/src/prelude.rs | 1 + 3 files changed, 109 insertions(+), 50 deletions(-) diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs index 6dbb1f6..9407d1d 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_client.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -46,37 +46,45 @@ async fn main () -> anyhow::Result <()> { 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"); - // End of per-port stuff // Beginning of per-connection stuff - loop { - let (tcp_socket, _) = listener.accept ().await?; - let connection = connection.clone (); - let server_id = server_id.clone (); + let task_tcp_server = tokio::spawn (async move { + loop { + let (tcp_socket, _) = listener.accept ().await?; + let connection = connection.clone (); + let server_id = server_id.clone (); + + 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> (()) + }); + } - 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> (()) + }); + + debug! ("Accepting local TCP connections from P1"); + + task_tcp_server.await??; + + Ok (()) } 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 f2e51c9..064c928 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -49,37 +49,87 @@ async fn main () -> anyhow::Result <()> { }; let http_addr = SocketAddr::from (([0, 0, 0, 0], 4004)); - let http_server = Server::bind (&http_addr); - tokio::spawn (async move { - http_server.serve (make_svc).await + let tcp_port = 30382; + let tcp_listener = TcpListener::bind (("127.0.0.1", tcp_port)).await?; + + let task_quic_server = { + let relay_state = Arc::clone (&relay_state); + tokio::spawn (async move { + while let Some (conn) = incoming.next ().await { + let relay_state = Arc::clone (&relay_state); + + // Each new peer QUIC connection gets its own task + tokio::spawn (async move { + let active = relay_state.stats.quic.connect (); + debug! ("QUIC connections: {}", active); + + match handle_quic_connection (Arc::clone (&relay_state), conn).await { + Ok (_) => (), + Err (e) => warn! ("handle_quic_connection {:?}", e), + } + + let active = relay_state.stats.quic.disconnect (); + debug! ("QUIC connections: {}", active); + }); + } + + Ok::<_, anyhow::Error> (()) + }) + }; + + let task_http_server = tokio::spawn (async move { + http_server.serve (make_svc).await?; + Ok::<_, anyhow::Error> (()) }); + let task_tcp_server = { + let relay_state = Arc::clone (&relay_state); + tokio::spawn (async move { + loop { + 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 (); + + 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") { + Some (x) => x, + None => bail! ("That server isn't connected"), + }; + + unimplemented! (); + /* + p4.req_channel.send (RequestP2ToP4 { + client_send, + client_recv, + client_id: "bogus_client".to_string (), + }).await.map_err (|_| anyhow::anyhow! ("Can't send request to P4 server"))?; + */ + Ok (()) + }); + } + + Ok::<_, anyhow::Error> (()) + }) + }; + debug! ("Serving HTTP on {:?}", http_addr); - while let Some (conn) = incoming.next ().await { - let relay_state = Arc::clone (&relay_state); - - // Each new peer QUIC connection gets its own task - tokio::spawn (async move { - let active = relay_state.stats.quic.connect (); - debug! ("QUIC connections: {}", active); - - match handle_quic_connection (Arc::clone (&relay_state), conn).await { - Ok (_) => (), - Err (e) => warn! ("handle_quic_connection {:?}", e), - } - - let active = relay_state.stats.quic.disconnect (); - debug! ("QUIC connections: {}", active); - }); - } + task_quic_server.await??; + task_http_server.await??; + task_tcp_server.await??; Ok (()) } -async fn handle_http (req: Request , relay_state: Arc ) +async fn handle_http (_req: Request , relay_state: Arc ) -> anyhow::Result > { let debug_string; diff --git a/prototypes/quic_demo/src/prelude.rs b/prototypes/quic_demo/src/prelude.rs index ef31ce8..03fc349 100644 --- a/prototypes/quic_demo/src/prelude.rs +++ b/prototypes/quic_demo/src/prelude.rs @@ -21,6 +21,7 @@ pub use tokio::{ AsyncReadExt, AsyncWriteExt, }, + net::TcpListener, sync::{ Mutex, mpsc, From 05ba4822f831cba1e3e15798722da766a8f0f46a Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 10 Sep 2021 16:02:36 -0500 Subject: [PATCH 08/14] :construction: wip --- prototypes/quic_demo/src/bin/quic_demo_relay_server.rs | 6 +++--- prototypes/quic_demo/src/prelude.rs | 2 ++ 2 files changed, 5 insertions(+), 3 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 064c928..948eda9 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -199,8 +199,8 @@ struct RequestP2ToP4 { client_id: String, } -struct PtthNewConnection { - client_send: quinn::SendStream, +struct PtthNewConnection { + client_send: ClientSend, client_recv: quinn::RecvStream, server_send: quinn::SendStream, server_recv: quinn::RecvStream, @@ -211,7 +211,7 @@ struct PtthConnection { downlink_task: JoinHandle >, } -impl PtthNewConnection { +impl PtthNewConnection { fn build (self) -> PtthConnection { let Self { mut client_send, diff --git a/prototypes/quic_demo/src/prelude.rs b/prototypes/quic_demo/src/prelude.rs index 03fc349..b94e1d6 100644 --- a/prototypes/quic_demo/src/prelude.rs +++ b/prototypes/quic_demo/src/prelude.rs @@ -18,7 +18,9 @@ pub use anyhow::{ pub use futures_util::StreamExt; pub use tokio::{ io::{ + AsyncRead, AsyncReadExt, + AsyncWrite, AsyncWriteExt, }, net::TcpListener, From 7408d41d4778c1abc8bd18e589e5e0cf0a487c23 Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 1 Oct 2021 10:41:44 -0500 Subject: [PATCH 09/14] Revert ":construction: wip" This reverts commit 05ba4822f831cba1e3e15798722da766a8f0f46a. --- prototypes/quic_demo/src/bin/quic_demo_relay_server.rs | 6 +++--- prototypes/quic_demo/src/prelude.rs | 2 -- 2 files changed, 3 insertions(+), 5 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 948eda9..064c928 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -199,8 +199,8 @@ struct RequestP2ToP4 { client_id: String, } -struct PtthNewConnection { - client_send: ClientSend, +struct PtthNewConnection { + client_send: quinn::SendStream, client_recv: quinn::RecvStream, server_send: quinn::SendStream, server_recv: quinn::RecvStream, @@ -211,7 +211,7 @@ struct PtthConnection { downlink_task: JoinHandle >, } -impl PtthNewConnection { +impl PtthNewConnection { fn build (self) -> PtthConnection { let Self { mut client_send, diff --git a/prototypes/quic_demo/src/prelude.rs b/prototypes/quic_demo/src/prelude.rs index b94e1d6..03fc349 100644 --- a/prototypes/quic_demo/src/prelude.rs +++ b/prototypes/quic_demo/src/prelude.rs @@ -18,9 +18,7 @@ pub use anyhow::{ pub use futures_util::StreamExt; pub use tokio::{ io::{ - AsyncRead, AsyncReadExt, - AsyncWrite, AsyncWriteExt, }, net::TcpListener, From 3a4d7c934e46efedc762629549efe6acb75748c3 Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 1 Oct 2021 10:44:51 -0500 Subject: [PATCH 10/14] move cert output into a subdir so I can break it out into a Docker volume --- prototypes/quic_demo/src/bin/quic_demo_relay_server.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 064c928..dcb5d5e 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_relay_server.rs @@ -29,7 +29,9 @@ async fn main () -> anyhow::Result <()> { let listen_addr = opt.listen_addr.unwrap_or_else (|| String::from ("0.0.0.0:30380")).parse ()?; let (mut incoming, server_cert) = make_server_endpoint (listen_addr)?; println! ("Base64 cert: {}", base64::encode (&server_cert)); - tokio::fs::write ("quic_server.crt", &server_cert).await?; + + tokio::fs::create_dir_all ("ptth_quic_output").await?; + tokio::fs::write ("ptth_quic_output/quic_server.crt", &server_cert).await?; let relay_state = Arc::new (RelayState::default ()); From f7bd179bba17731b0a5c15ed93cd85532604f8a1 Mon Sep 17 00:00:00 2001 From: Trisha Date: Fri, 1 Oct 2021 12:19:23 -0500 Subject: [PATCH 11/14] add `--cert-url` to GUI client --- Cargo.lock | 5 +++-- prototypes/ptth_quic_client_gui/Cargo.toml | 1 + prototypes/ptth_quic_client_gui/src/main.rs | 16 +++++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e062511..2a4a2f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1209,6 +1209,7 @@ dependencies = [ "fltk", "quic_demo", "quinn", + "reqwest", "structopt", "tokio", "tracing", @@ -1500,9 +1501,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf12057f289428dbf5c591c74bf10392e4a8003f993405a902f20117019022d4" +checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" dependencies = [ "base64", "bytes", diff --git a/prototypes/ptth_quic_client_gui/Cargo.toml b/prototypes/ptth_quic_client_gui/Cargo.toml index 7281233..995a913 100644 --- a/prototypes/ptth_quic_client_gui/Cargo.toml +++ b/prototypes/ptth_quic_client_gui/Cargo.toml @@ -12,6 +12,7 @@ anyhow = "1.0.38" fltk = "1.1.1" quic_demo = { path = "../quic_demo" } quinn = "0.7.2" +reqwest = "0.11.4" structopt = "0.3.20" tokio = { version = "1.8.1", features = ["full"] } tracing-subscriber = "0.2.16" diff --git a/prototypes/ptth_quic_client_gui/src/main.rs b/prototypes/ptth_quic_client_gui/src/main.rs index 4cfdfda..e11bfbe 100644 --- a/prototypes/ptth_quic_client_gui/src/main.rs +++ b/prototypes/ptth_quic_client_gui/src/main.rs @@ -25,6 +25,8 @@ struct Opt { relay_addr: Option , #[structopt (long)] client_id: Option , + #[structopt (long)] + cert_url: Option , } #[derive (Clone, Copy)] @@ -103,8 +105,15 @@ fn main () -> anyhow::Result <()> { wind.show (); let connection_p2_p3 = rt.block_on (async move { - let server_cert = tokio::fs::read ("quic_server.crt").await?; - let relay_addr = opt.relay_addr.unwrap_or_else (|| String::from ("127.0.0.1:30380")).parse ()?; + 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 + .unwrap_or_else (|| String::from ("127.0.0.1:30380")) + .parse () + .context ("relay_addr should be like 127.0.0.1:30380")?; let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; trace! ("Connecting to relay server"); @@ -114,7 +123,8 @@ fn main () -> anyhow::Result <()> { let quinn::NewConnection { connection, .. - } = protocol::p2_connect_to_p3 (&endpoint, &relay_addr, &client_id).await?; + } = protocol::p2_connect_to_p3 (&endpoint, &relay_addr, &client_id).await + .context ("P2 can't connect to P3")?; Ok::<_, anyhow::Error> (connection) })?; From da10ad28dcacad83b9b0c86d89c15468d7db567a Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 1 Oct 2021 12:44:20 -0500 Subject: [PATCH 12/14] add `--cert-url` to end server too --- Cargo.lock | 1 + prototypes/quic_demo/Cargo.toml | 1 + prototypes/quic_demo/src/bin/quic_demo_end_server.rs | 7 ++++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 2a4a2f6..ae75527 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1332,6 +1332,7 @@ dependencies = [ "hyper", "quinn", "rcgen", + "reqwest", "rmp-serde", "structopt", "tokio", diff --git a/prototypes/quic_demo/Cargo.toml b/prototypes/quic_demo/Cargo.toml index a2e7d78..d10125b 100644 --- a/prototypes/quic_demo/Cargo.toml +++ b/prototypes/quic_demo/Cargo.toml @@ -15,6 +15,7 @@ futures-util = "0.3.9" hyper = { version = "0.14.4", features = ["http1", "server", "stream", "tcp"] } quinn = "0.7.2" rcgen = "0.8.11" +reqwest = "0.11.4" rmp-serde = "0.15.5" structopt = "0.3.20" tokio = { version = "1.8.1", features = ["full"] } 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 26c6c6d..5f28433 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs @@ -12,6 +12,8 @@ struct Opt { server_id: Option , #[structopt (long)] debug_echo: bool, + #[structopt (long)] + cert_url: Option , } #[tokio::main] @@ -20,7 +22,10 @@ async fn main () -> anyhow::Result <()> { let opt = Arc::new (Opt::from_args ()); - let server_cert = tokio::fs::read ("quic_server.crt").await?; + 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])?; From c5aadbe632c6cb34cbe6a9e5f2b9ab66f36ff6b9 Mon Sep 17 00:00:00 2001 From: _ <> Date: Fri, 1 Oct 2021 12:50:24 -0500 Subject: [PATCH 13/14] :package: add PTTH_QUIC end server to PTTH subpackage --- build_ptth_server.bash | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build_ptth_server.bash b/build_ptth_server.bash index 6334552..71d612a 100755 --- a/build_ptth_server.bash +++ b/build_ptth_server.bash @@ -15,15 +15,19 @@ export LC_ALL="C" TEMP_GIBBERISH="ptth_server_build_BIHWLQXQ" DEST="$TEMP_GIBBERISH/ptth" +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 mkdir -p "$DEST/handlebars/server" rsync -r handlebars/server/ "$DEST/handlebars/server/" -cp target/release/ptth_server "$DEST/ptth_server" +cp target/release/ptth_server "$DEST/" +cp target/release/quic_demo_end_server "$DEST/" ( cd "$TEMP_GIBBERISH" || exit From b8c370a0a6b37ce41078c1fd3e03c6b60e3ab2c2 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 2 Oct 2021 16:55:04 +0000 Subject: [PATCH 14/14] :pencil: readme draft --- readme_draft.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme_draft.md b/readme_draft.md index 5a0bee0..72ae65e 100644 --- a/readme_draft.md +++ b/readme_draft.md @@ -1,5 +1,7 @@ ![The PTTH logo, a green box sitting on a black conveyor belt. The box has an arrow pointing left, and the text "PTTH", in white. The conveyor belt has an arrow pointing right, in white.](assets/logo-128-pixel.png) +TODO: "Splitting a server in half" diagram + # PTTH PTTH lets you run file servers from behind NAT / firewalls.