1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-30 18:34:36 +01:00

Optionally support tokio-uds's UnixStream as IoStream (#472)

This commit is contained in:
Kornel 2018-08-17 17:04:16 +01:00 committed by Douman
parent 8fe30a5b66
commit bdc9a8bb07
6 changed files with 44 additions and 0 deletions

View File

@ -10,6 +10,8 @@
* Allow to customize connection handshake process via `HttpServer::listen_with()` * Allow to customize connection handshake process via `HttpServer::listen_with()`
and `HttpServer::bind_with()` methods and `HttpServer::bind_with()` methods
* Support making client connections via `tokio-uds`'s `UnixStream` when "uds" feature is enabled #472
### Changed ### Changed
* It is allowed to use function with up to 10 parameters for handler with `extractor parameters`. * It is allowed to use function with up to 10 parameters for handler with `extractor parameters`.

View File

@ -40,6 +40,9 @@ alpn = ["openssl", "tokio-openssl"]
# rustls # rustls
rust-tls = ["rustls", "tokio-rustls", "webpki", "webpki-roots"] rust-tls = ["rustls", "tokio-rustls", "webpki", "webpki-roots"]
# unix sockets
uds = ["tokio-uds"]
# sessions feature, session require "ring" crate and c compiler # sessions feature, session require "ring" crate and c compiler
session = ["cookie/secure"] session = ["cookie/secure"]
@ -112,6 +115,9 @@ tokio-rustls = { version = "0.7", optional = true }
webpki = { version = "0.18", optional = true } webpki = { version = "0.18", optional = true }
webpki-roots = { version = "0.15", optional = true } webpki-roots = { version = "0.15", optional = true }
# unix sockets
tokio-uds = { version="0.2", optional = true }
# forked url_encoded # forked url_encoded
itoa = "0.4" itoa = "0.4"
dtoa = "0.4" dtoa = "0.4"

View File

@ -1287,6 +1287,10 @@ impl Connection {
} }
/// Create a new connection from an IO Stream /// Create a new connection from an IO Stream
///
/// The stream can be a `UnixStream` if the Unix-only "uds" feature is enabled.
///
/// See also `ClientRequestBuilder::with_connection()`.
pub fn from_stream<T: IoStream + Send>(io: T) -> Connection { pub fn from_stream<T: IoStream + Send>(io: T) -> Connection {
Connection::new(Key::empty(), None, Box::new(io)) Connection::new(Key::empty(), None, Box::new(io))
} }

View File

@ -66,6 +66,8 @@
//! * `tls` - enables ssl support via `native-tls` crate //! * `tls` - enables ssl support via `native-tls` crate
//! * `alpn` - enables ssl support via `openssl` crate, require for `http/2` //! * `alpn` - enables ssl support via `openssl` crate, require for `http/2`
//! support //! support
//! * `uds` - enables support for making client requests via Unix Domain Sockets.
//! Unix only. Not necessary for *serving* requests.
//! * `session` - enables session support, includes `ring` crate as //! * `session` - enables session support, includes `ring` crate as
//! dependency //! dependency
//! * `brotli` - enables `brotli` compression support, requires `c` //! * `brotli` - enables `brotli` compression support, requires `c`
@ -120,6 +122,8 @@ extern crate tokio_io;
extern crate tokio_reactor; extern crate tokio_reactor;
extern crate tokio_tcp; extern crate tokio_tcp;
extern crate tokio_timer; extern crate tokio_timer;
#[cfg(all(unix, feature = "uds"))]
extern crate tokio_uds;
extern crate url; extern crate url;
#[macro_use] #[macro_use]
extern crate serde; extern crate serde;

View File

@ -421,6 +421,24 @@ pub trait IoStream: AsyncRead + AsyncWrite + 'static {
} }
} }
#[cfg(all(unix, feature = "uds"))]
impl IoStream for ::tokio_uds::UnixStream {
#[inline]
fn shutdown(&mut self, how: Shutdown) -> io::Result<()> {
::tokio_uds::UnixStream::shutdown(self, how)
}
#[inline]
fn set_nodelay(&mut self, _nodelay: bool) -> io::Result<()> {
Ok(())
}
#[inline]
fn set_linger(&mut self, _dur: Option<time::Duration>) -> io::Result<()> {
Ok(())
}
}
impl IoStream for TcpStream { impl IoStream for TcpStream {
#[inline] #[inline]
fn shutdown(&mut self, how: Shutdown) -> io::Result<()> { fn shutdown(&mut self, how: Shutdown) -> io::Result<()> {

View File

@ -5,6 +5,8 @@ extern crate bytes;
extern crate flate2; extern crate flate2;
extern crate futures; extern crate futures;
extern crate rand; extern crate rand;
#[cfg(all(unix, feature = "uds"))]
extern crate tokio_uds;
use std::io::Read; use std::io::Read;
@ -198,6 +200,14 @@ fn test_client_gzip_encoding_large_random() {
assert_eq!(bytes, Bytes::from(data)); assert_eq!(bytes, Bytes::from(data));
} }
#[cfg(all(unix, feature = "uds"))]
#[test]
fn test_compatible_with_unix_socket_stream() {
let (stream, _) = tokio_uds::UnixStream::pair().unwrap();
let _ = client::Connection::from_stream(stream);
}
#[cfg(feature = "brotli")] #[cfg(feature = "brotli")]
#[test] #[test]
fn test_client_brotli_encoding() { fn test_client_brotli_encoding() {