pub enum StreamListener {
Unix(UnixListener),
Tcp(TcpListener),
OpenSsl(TcpListener, SslAcceptor, Duration),
}Expand description
ProSA socket object to handle TCP/SSL server socket
Variants§
Unix(UnixListener)
Available on
target_family=unix only.Unix server socket (only on unix systems)
Tcp(TcpListener)
TCP server socket
OpenSsl(TcpListener, SslAcceptor, Duration)
Available on crate feature
openssl only.OpenSSL server socket
Implementations§
Source§impl StreamListener
impl StreamListener
Sourcepub const DEFAULT_SSL_TIMEOUT: Duration
pub const DEFAULT_SSL_TIMEOUT: Duration
Default SSL handshake timeout
Sourcepub fn local_addr(&self) -> Result<SocketAddr, Error>
pub fn local_addr(&self) -> Result<SocketAddr, Error>
Returns the local address that this listener is bound to.
This can be useful, for example, when binding to port 0 to figure out which port was actually bound.
use tokio::io;
use prosa::io::listener::StreamListener;
use prosa::io::SocketAddr;
use std::net::{Ipv4Addr, SocketAddrV4};
async fn accepting() -> Result<(), io::Error> {
let stream_listener: StreamListener = StreamListener::bind("0.0.0.0:10000").await?;
assert_eq!(stream_listener.local_addr()?,
SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(0, 0, 0, 0), 10000)));
Ok(())
}Sourcepub async fn bind<A: ToSocketAddrs>(addr: A) -> Result<StreamListener, Error>
pub async fn bind<A: ToSocketAddrs>(addr: A) -> Result<StreamListener, Error>
Accept TCP connections from clients
graph LR
clients[Clients]
server[Server]
clients -- TCP --> server
use tokio::io;
use prosa::io::listener::StreamListener;
async fn accepting() -> Result<(), io::Error> {
let stream_listener: StreamListener = StreamListener::bind("0.0.0.0:10000").await?;
loop {
let (stream, addr) = stream_listener.accept().await?;
// Handle the stream like any tokio stream
}
Ok(())
}Sourcepub fn ssl_acceptor(
self,
ssl_acceptor: SslAcceptor,
ssl_timeout: Option<Duration>,
) -> StreamListener
pub fn ssl_acceptor( self, ssl_acceptor: SslAcceptor, ssl_timeout: Option<Duration>, ) -> StreamListener
Set an OpenSSL acceptor to accept SSL connections from clients By default, the SSL connect timeout is 3 seconds
graph LR
clients[Clients]
server[Server]
clients -- TLS --> server
use tokio::io;
use prosa_utils::config::ssl::{SslConfig, SslConfigContext};
use prosa::io::listener::StreamListener;
async fn accepting() -> Result<(), io::Error> {
let ssl_acceptor = SslConfig::default().init_tls_server_context(None).unwrap().build();
let stream_listener: StreamListener = StreamListener::bind("0.0.0.0:10000").await?.ssl_acceptor(ssl_acceptor, None);
loop {
// The client SSL handshake will happen here
let (stream, addr) = stream_listener.accept().await?;
// Handle the stream like any tokio stream
}
Ok(())
}Sourcepub async fn accept(&self) -> Result<(Stream, SocketAddr), Error>
pub async fn accept(&self) -> Result<(Stream, SocketAddr), Error>
Method to accept a client after a bind
use tokio::io;
use prosa_utils::config::ssl::{SslConfig, SslConfigContext};
use prosa::io::listener::StreamListener;
async fn accepting() -> Result<(), io::Error> {
let ssl_acceptor = SslConfig::default().init_tls_server_context(None).unwrap().build();
let stream_listener: StreamListener = StreamListener::bind("0.0.0.0:10000").await?.ssl_acceptor(ssl_acceptor, None);
loop {
// The client SSL handshake will happen here
let (stream, addr) = stream_listener.accept().await?;
// Handle the stream like any tokio stream
}
Ok(())
}Sourcepub async fn accept_raw(&self) -> Result<(Stream, SocketAddr), Error>
pub async fn accept_raw(&self) -> Result<(Stream, SocketAddr), Error>
Method to accept a client after a bind without SSL handshake (must be done with handshake after)
use tokio::io;
use prosa_utils::config::ssl::{SslConfig, SslConfigContext};
use prosa::io::listener::StreamListener;
async fn accepting() -> Result<(), io::Error> {
let ssl_acceptor = SslConfig::default().init_tls_server_context(None).unwrap().build();
let stream_listener: StreamListener = StreamListener::bind("0.0.0.0:10000").await?.ssl_acceptor(ssl_acceptor, None);
loop {
let (stream, addr) = stream_listener.accept_raw().await?;
// The client SSL handshake will happen here
let stream = stream_listener.handshake(stream).await?;
// Handle the stream like any tokio stream
}
Ok(())
}Trait Implementations§
Source§impl AsFd for StreamListener
impl AsFd for StreamListener
Source§fn as_fd(&self) -> BorrowedFd<'_>
fn as_fd(&self) -> BorrowedFd<'_>
Borrows the file descriptor. Read more
Source§impl AsRawFd for StreamListener
impl AsRawFd for StreamListener
Source§impl Debug for StreamListener
impl Debug for StreamListener
Source§impl Display for StreamListener
impl Display for StreamListener
Source§impl From<TcpListener> for StreamListener
impl From<TcpListener> for StreamListener
Source§fn from(listener: TcpListener) -> Self
fn from(listener: TcpListener) -> Self
Converts to this type from the input type.
Source§impl From<UnixListener> for StreamListener
Available on target_family=unix only.
impl From<UnixListener> for StreamListener
Available on
target_family=unix only.Source§fn from(listener: UnixListener) -> Self
fn from(listener: UnixListener) -> Self
Converts to this type from the input type.
Auto Trait Implementations§
impl !Freeze for StreamListener
impl RefUnwindSafe for StreamListener
impl Send for StreamListener
impl Sync for StreamListener
impl Unpin for StreamListener
impl UnwindSafe for StreamListener
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::RequestSource§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
Source§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.