diff --git a/actix-server-config/Cargo.toml b/actix-server-config/Cargo.toml index 0c405e55..e33a9137 100644 --- a/actix-server-config/Cargo.toml +++ b/actix-server-config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-server-config" -version = "0.1.0" +version = "0.1.1" authors = ["Nikolay Kim "] description = "Actix server config utils" homepage = "https://actix.rs" @@ -13,5 +13,22 @@ workspace = ".." name = "actix_server_config" path = "src/lib.rs" +[package.metadata.docs.rs] +features = ["ssl", "rust-tls"] + +[features] +default = [] + +# openssl +ssl = ["tokio-openssl"] + +# rustls +rust-tls = ["rustls", "tokio-rustls"] + [dependencies] futures = "0.1.25" +tokio-io = "0.1.12" +tokio-tcp = "0.1" +tokio-openssl = { version="0.3.0", optional = true } +rustls = { version = "0.15.2", optional = true } +tokio-rustls = { version = "0.9.1", optional = true } diff --git a/actix-server-config/changes.md b/actix-server-config/changes.md new file mode 100644 index 00000000..9b5b1e09 --- /dev/null +++ b/actix-server-config/changes.md @@ -0,0 +1,7 @@ +# Changes + +## [0.1.1] - 2019-04-16 + +### Added + +* `IoStream` trait and impls for TcpStream, SslStream and TlsStream diff --git a/actix-server-config/src/lib.rs b/actix-server-config/src/lib.rs index 6eccaf4c..557d1893 100644 --- a/actix-server-config/src/lib.rs +++ b/actix-server-config/src/lib.rs @@ -1,7 +1,10 @@ use std::cell::Cell; -use std::fmt; use std::net::SocketAddr; use std::rc::Rc; +use std::{fmt, io, net, time}; + +use tokio_io::{AsyncRead, AsyncWrite}; +use tokio_tcp::TcpStream; #[derive(Debug, Clone)] pub struct ServerConfig { @@ -130,3 +133,86 @@ impl fmt::Debug for Io { write!(f, "Io {{{:?}}}", self.io) } } + +/// Low-level io stream operations +pub trait IoStream: AsyncRead + AsyncWrite { + /// Returns the socket address of the remote peer of this TCP connection. + fn peer_addr(&self) -> Option { + None + } + + /// Sets the value of the TCP_NODELAY option on this socket. + fn set_nodelay(&mut self, nodelay: bool) -> io::Result<()>; + + fn set_linger(&mut self, dur: Option) -> io::Result<()>; + + fn set_keepalive(&mut self, dur: Option) -> io::Result<()>; +} + +impl IoStream for TcpStream { + #[inline] + fn peer_addr(&self) -> Option { + TcpStream::peer_addr(self).ok() + } + + #[inline] + fn set_nodelay(&mut self, nodelay: bool) -> io::Result<()> { + TcpStream::set_nodelay(self, nodelay) + } + + #[inline] + fn set_linger(&mut self, dur: Option) -> io::Result<()> { + TcpStream::set_linger(self, dur) + } + + #[inline] + fn set_keepalive(&mut self, dur: Option) -> io::Result<()> { + TcpStream::set_keepalive(self, dur) + } +} + +#[cfg(any(feature = "ssl"))] +impl IoStream for tokio_openssl::SslStream { + #[inline] + fn peer_addr(&self) -> Option { + self.get_ref().get_ref().peer_addr() + } + + #[inline] + fn set_nodelay(&mut self, nodelay: bool) -> io::Result<()> { + self.get_mut().get_mut().set_nodelay(nodelay) + } + + #[inline] + fn set_linger(&mut self, dur: Option) -> io::Result<()> { + self.get_mut().get_mut().set_linger(dur) + } + + #[inline] + fn set_keepalive(&mut self, dur: Option) -> io::Result<()> { + self.get_mut().get_mut().set_keepalive(dur) + } +} + +#[cfg(any(feature = "rust-tls"))] +impl IoStream for tokio_rustls::TlsStream { + #[inline] + fn peer_addr(&self) -> Option { + self.get_ref().0.peer_addr() + } + + #[inline] + fn set_nodelay(&mut self, nodelay: bool) -> io::Result<()> { + self.get_mut().0.set_nodelay(nodelay) + } + + #[inline] + fn set_linger(&mut self, dur: Option) -> io::Result<()> { + self.get_mut().0.set_linger(dur) + } + + #[inline] + fn set_keepalive(&mut self, dur: Option) -> io::Result<()> { + self.get_mut().0.set_keepalive(dur) + } +} diff --git a/actix-server/CHANGES.md b/actix-server/CHANGES.md index cb4ca802..2a6814d0 100644 --- a/actix-server/CHANGES.md +++ b/actix-server/CHANGES.md @@ -1,5 +1,16 @@ # Changes +## [0.4.3] - 2019-04-16 + +### Added + +* Re-export `IoStream` trait + +### Changed + +* Deppend on `ssl` and `rust-tls` features from actix-server-config + + ## [0.4.2] - 2019-03-30 ### Fixed diff --git a/actix-server/Cargo.toml b/actix-server/Cargo.toml index bde1ce9a..68c6a810 100644 --- a/actix-server/Cargo.toml +++ b/actix-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-server" -version = "0.4.2" +version = "0.4.3" authors = ["Nikolay Kim "] description = "Actix server - General purpose tcp server" keywords = ["network", "framework", "async", "futures"] @@ -27,20 +27,20 @@ default = [] tls = ["native-tls"] # openssl -ssl = ["openssl", "tokio-openssl"] +ssl = ["openssl", "tokio-openssl", "actix-server-config/ssl"] # rustls -rust-tls = ["rustls", "tokio-rustls", "webpki", "webpki-roots"] +rust-tls = ["rustls", "tokio-rustls", "webpki", "webpki-roots", "actix-server-config/rust-tls"] [dependencies] actix-rt = "0.2.1" actix-service = "0.3.4" -actix-server-config = "0.1.0" +actix-server-config = "0.1.1" log = "0.4" num_cpus = "1.0" -mio = "^0.6.13" +mio = "0.6.13" net2 = "0.2" futures = "0.1" slab = "0.4" @@ -58,12 +58,12 @@ openssl = { version="0.10", optional = true } tokio-openssl = { version="0.3", optional = true } #rustls -rustls = { version = "^0.15", optional = true } -tokio-rustls = { version = "^0.9", optional = true } +rustls = { version = "0.15.2", optional = true } +tokio-rustls = { version = "0.9.1", optional = true } webpki = { version = "0.19", optional = true } webpki-roots = { version = "0.16", optional = true } [dev-dependencies] bytes = "0.4" -actix-codec = "0.1.0" +actix-codec = "0.1.2" env_logger = "0.6" diff --git a/actix-server/src/lib.rs b/actix-server/src/lib.rs index f9eb5721..3948fbf9 100644 --- a/actix-server/src/lib.rs +++ b/actix-server/src/lib.rs @@ -10,7 +10,7 @@ mod signals; pub mod ssl; mod worker; -pub use actix_server_config::{Io, Protocol, ServerConfig}; +pub use actix_server_config::{Io, IoStream, Protocol, ServerConfig}; pub use self::builder::ServerBuilder; pub use self::config::{ServiceConfig, ServiceRuntime};