From 1dc2f44d9cb2ecc9e3ac1cadfa48516e0651e37d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Fri, 3 Jul 2020 00:22:14 +0200 Subject: [PATCH] restructure aquatic_common_tcp, move more into it from aquatic_http --- Cargo.lock | 1 + aquatic_common_tcp/Cargo.toml | 1 + aquatic_common_tcp/src/common.rs | 7 +++ aquatic_common_tcp/src/lib.rs | 1 + aquatic_common_tcp/src/network/mod.rs | 66 +------------------------ aquatic_common_tcp/src/network/utils.rs | 65 ++++++++++++++++++++++++ aquatic_http/src/lib/common.rs | 1 - aquatic_http/src/lib/lib.rs | 2 +- aquatic_http/src/lib/network/mod.rs | 2 +- 9 files changed, 78 insertions(+), 68 deletions(-) create mode 100644 aquatic_common_tcp/src/common.rs create mode 100644 aquatic_common_tcp/src/network/utils.rs diff --git a/Cargo.lock b/Cargo.lock index d7c64c7..c6d17e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,6 +62,7 @@ dependencies = [ "aquatic_common", "mio", "native-tls", + "parking_lot", "serde", "socket2", ] diff --git a/aquatic_common_tcp/Cargo.toml b/aquatic_common_tcp/Cargo.toml index ddbd123..21baad0 100644 --- a/aquatic_common_tcp/Cargo.toml +++ b/aquatic_common_tcp/Cargo.toml @@ -13,5 +13,6 @@ anyhow = "1" aquatic_common = { path = "../aquatic_common" } mio = { version = "0.7", features = ["tcp", "os-poll", "os-util"] } native-tls = "0.2" +parking_lot = "0.10" serde = { version = "1", features = ["derive"] } socket2 = { version = "0.3", features = ["reuseport"] } \ No newline at end of file diff --git a/aquatic_common_tcp/src/common.rs b/aquatic_common_tcp/src/common.rs new file mode 100644 index 0000000..7fa0974 --- /dev/null +++ b/aquatic_common_tcp/src/common.rs @@ -0,0 +1,7 @@ +use std::sync::Arc; + +use parking_lot::Mutex; + + +pub type SocketWorkerStatus = Option>; +pub type SocketWorkerStatuses = Arc>>; \ No newline at end of file diff --git a/aquatic_common_tcp/src/lib.rs b/aquatic_common_tcp/src/lib.rs index b0e8d58..0bbe482 100644 --- a/aquatic_common_tcp/src/lib.rs +++ b/aquatic_common_tcp/src/lib.rs @@ -1,2 +1,3 @@ pub mod config; +pub mod common; pub mod network; \ No newline at end of file diff --git a/aquatic_common_tcp/src/network/mod.rs b/aquatic_common_tcp/src/network/mod.rs index d7fbfc2..1ad3a64 100644 --- a/aquatic_common_tcp/src/network/mod.rs +++ b/aquatic_common_tcp/src/network/mod.rs @@ -1,66 +1,2 @@ pub mod stream; - -use std::fs::File; -use std::io::Read; -use std::net::SocketAddr; - -use anyhow::Context; -use native_tls::{Identity, TlsAcceptor}; -use socket2::{Socket, Domain, Type, Protocol}; - -use crate::config::TlsConfig; - - -pub fn create_tls_acceptor( - config: &TlsConfig, -) -> anyhow::Result> { - if config.use_tls { - let mut identity_bytes = Vec::new(); - let mut file = File::open(&config.tls_pkcs12_path) - .context("Couldn't open pkcs12 identity file")?; - - file.read_to_end(&mut identity_bytes) - .context("Couldn't read pkcs12 identity file")?; - - let identity = Identity::from_pkcs12( - &mut identity_bytes, - &config.tls_pkcs12_password - ).context("Couldn't parse pkcs12 identity file")?; - - let acceptor = TlsAcceptor::new(identity) - .context("Couldn't create TlsAcceptor from pkcs12 identity")?; - - Ok(Some(acceptor)) - } else { - Ok(None) - } -} - - -pub fn create_listener( - address: SocketAddr, - ipv6_only: bool -) -> ::anyhow::Result<::std::net::TcpListener> { - let builder = if address.is_ipv4(){ - Socket::new(Domain::ipv4(), Type::stream(), Some(Protocol::tcp())) - } else { - Socket::new(Domain::ipv6(), Type::stream(), Some(Protocol::tcp())) - }.context("Couldn't create socket2::Socket")?; - - if ipv6_only { - builder.set_only_v6(true) - .context("Couldn't put socket in ipv6 only mode")? - } - - builder.set_nonblocking(true) - .context("Couldn't put socket in non-blocking mode")?; - builder.set_reuse_port(true) - .context("Couldn't put socket in reuse_port mode")?; - builder.bind(&address.into()).with_context(|| - format!("Couldn't bind socket to address {}", address) - )?; - builder.listen(128) - .context("Couldn't listen for connections on socket")?; - - Ok(builder.into_tcp_listener()) -} \ No newline at end of file +pub mod utils; \ No newline at end of file diff --git a/aquatic_common_tcp/src/network/utils.rs b/aquatic_common_tcp/src/network/utils.rs new file mode 100644 index 0000000..fbfe32b --- /dev/null +++ b/aquatic_common_tcp/src/network/utils.rs @@ -0,0 +1,65 @@ + +use std::fs::File; +use std::io::Read; +use std::net::SocketAddr; + +use anyhow::Context; +use native_tls::{Identity, TlsAcceptor}; +use socket2::{Socket, Domain, Type, Protocol}; + +use crate::config::TlsConfig; + + +pub fn create_tls_acceptor( + config: &TlsConfig, +) -> anyhow::Result> { + if config.use_tls { + let mut identity_bytes = Vec::new(); + let mut file = File::open(&config.tls_pkcs12_path) + .context("Couldn't open pkcs12 identity file")?; + + file.read_to_end(&mut identity_bytes) + .context("Couldn't read pkcs12 identity file")?; + + let identity = Identity::from_pkcs12( + &mut identity_bytes, + &config.tls_pkcs12_password + ).context("Couldn't parse pkcs12 identity file")?; + + let acceptor = TlsAcceptor::new(identity) + .context("Couldn't create TlsAcceptor from pkcs12 identity")?; + + Ok(Some(acceptor)) + } else { + Ok(None) + } +} + + +pub fn create_listener( + address: SocketAddr, + ipv6_only: bool +) -> ::anyhow::Result<::std::net::TcpListener> { + let builder = if address.is_ipv4(){ + Socket::new(Domain::ipv4(), Type::stream(), Some(Protocol::tcp())) + } else { + Socket::new(Domain::ipv6(), Type::stream(), Some(Protocol::tcp())) + }.context("Couldn't create socket2::Socket")?; + + if ipv6_only { + builder.set_only_v6(true) + .context("Couldn't put socket in ipv6 only mode")? + } + + builder.set_nonblocking(true) + .context("Couldn't put socket in non-blocking mode")?; + builder.set_reuse_port(true) + .context("Couldn't put socket in reuse_port mode")?; + builder.bind(&address.into()).with_context(|| + format!("Couldn't bind socket to address {}", address) + )?; + builder.listen(128) + .context("Couldn't listen for connections on socket")?; + + Ok(builder.into_tcp_listener()) +} \ No newline at end of file diff --git a/aquatic_http/src/lib/common.rs b/aquatic_http/src/lib/common.rs index cb91c2b..21258d4 100644 --- a/aquatic_http/src/lib/common.rs +++ b/aquatic_http/src/lib/common.rs @@ -13,7 +13,6 @@ pub use aquatic_common::ValidUntil; use crate::protocol::*; - // identical to ws version #[derive(Clone, Copy, Debug)] pub struct ConnectionMeta { diff --git a/aquatic_http/src/lib/lib.rs b/aquatic_http/src/lib/lib.rs index 032c75b..a639536 100644 --- a/aquatic_http/src/lib/lib.rs +++ b/aquatic_http/src/lib/lib.rs @@ -6,7 +6,7 @@ use anyhow::Context; use parking_lot::Mutex; use privdrop::PrivDrop; -use aquatic_common_tcp::network::create_tls_acceptor; +use aquatic_common_tcp::network::utils::create_tls_acceptor; pub mod common; pub mod config; diff --git a/aquatic_http/src/lib/network/mod.rs b/aquatic_http/src/lib/network/mod.rs index 6265d6b..cee0597 100644 --- a/aquatic_http/src/lib/network/mod.rs +++ b/aquatic_http/src/lib/network/mod.rs @@ -10,7 +10,7 @@ use native_tls::TlsAcceptor; use mio::{Events, Poll, Interest, Token}; use mio::net::TcpListener; -use aquatic_common_tcp::network::create_listener; +use aquatic_common_tcp::network::utils::create_listener; use crate::common::*; use crate::config::Config;