pub struct Endpoint { /* private fields */ }
Expand description
Represents a socket using the QUIC protocol to communicate with peers.
Stream
Receives incoming Connection
s through [Stream
].
Implementations§
§impl Endpoint
impl Endpoint
pub fn new_client() -> Result<Endpoint, Config>
pub fn new_client() -> Result<Endpoint, Config>
Simplified version of creating a client. See Builder
for more
sophisticated configuration options. Must be called from inside a Tokio
Runtime
.
Notes
This configuration will not be able to receive incoming
Connection
s.
Errors
std::io::Error
if the socket couldn’t be bound to the given
address
.
Panics
If not called from inside a Tokio Runtime
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
pub fn new_server(port: u16, key_pair: KeyPair) -> Result<Endpoint, Config>
pub fn new_server(port: u16, key_pair: KeyPair) -> Result<Endpoint, Config>
Simplified version of creating a server. See Builder
for more
sophisticated configuration options. Must be called from inside a Tokio
Runtime
.
Errors
std::io::Error
if the socket couldn’t be bound to the given
address
.
Panics
- if the given
KeyPair
is invalid - can’t happen if properly validated throughKeyPair::from_parts
- if not called from inside a Tokio
Runtime
Examples
use fabruic::{Endpoint, KeyPair};
let endpoint = Endpoint::new_server(0, KeyPair::new_self_signed("self-signed"))?;
pub async fn connect<U>(&self, url: U) -> Result<Connecting, Connect>
pub async fn connect<U>(&self, url: U) -> Result<Connecting, Connect>
Establishes a new Connection
to a server. The
servers Certificate
will be validated aggainst the root certificate
store and the domain in the URL.
Attempts to resolve the IP from the given URL. Uses
trust-dns
by default if the crate feature trust-dns
is enabled.
Otherwise ToSocketAddrs
is used.
See Builder::set_trust_dns
or Builder::disable_trust_dns
for
more control.
Notes
The following settings are used when using
trust-dns
:
- all system configurations are ignored, see
Builder::set_hosts_file
- Cloudflare with DoH is used as the name server
- DNSSEC is enabled, see
Builder::set_dnssec
- IPv6 is preferred over IPv4 if the bound socket is IPv6
Errors
error::Connect::ParseUrl
if the URL couldn’t be parsederror::Connect::Domain
if the URL didn’t contain a domainerror::Connect::Port
if the URL didn’t contain a porterror::Connect::ParseDomain
if the domain couldn’t be parsederror::Connect::TrustDns
if the URL couldn’t be resolved to an IP address withtrust-dns
error::Connect::StdDns
if the URL couldn’t be resolved to an IP address withToSocketAddrs
error::Connect::NoIp
if no IP address was found for that domain
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
// not going to actually work because `localhost` can't have a valid certificate
let connecting = endpoint.connect("quic://localhost:443").await?;
pub async fn connect_pinned<U>(
&self,
url: U,
server_certificate: &Certificate,
client_key_pair: Option<KeyPair>
) -> Result<Connecting, Connect>
pub async fn connect_pinned<U>( &self, url: U, server_certificate: &Certificate, client_key_pair: Option<KeyPair> ) -> Result<Connecting, Connect>
Establishes a new Connection
to a server.
See connect
for more information on host name
resolution.
Notes
The root certificate store will be ignored and the given Certificate
will validate the server.
A client certificate KeyPair
set with
Builder::set_client_key_pair
will be ignored, use client_key_pair
to add a client certificate to this connection.
This method is intended for direct connection to a known server, the
domain name in the URL is not checked against the Certificate
.
Multiple domain names in the Certificate
aren’t supported.
Errors
error::Connect::MultipleDomains
if multiple domains are present in theCertificate
, which isn’t supportederror::Connect::ParseUrl
if the URL couldn’t be parsederror::Connect::Domain
if the URL didn’t contain a domainerror::Connect::Port
if the URL didn’t contain a porterror::Connect::ParseDomain
if the domain couldn’t be parsederror::Connect::TrustDns
if the URL couldn’t be resolved to an IP address withtrust-dns
error::Connect::StdDns
if the URL couldn’t be resolved to an IP address withToSocketAddrs
error::Connect::NoIp
if no IP address was found for that domain
Panics
Panics if the given Certificate
or KeyPair
are invalid. Can’t
happen if they were properly validated through Certificate::from_der
or KeyPair::from_parts
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
// the server certificate has to be imported from somewhere else
let connecting = endpoint
.connect_pinned("quic://localhost:443", &server_certificate, None)
.await?;
pub fn local_address(&self) -> Result<SocketAddr, Error>
pub fn local_address(&self) -> Result<SocketAddr, Error>
Get the local SocketAddr
the underlying socket is bound to.
Errors
std::io::Error
if aquiring the local address failed.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
assert!(endpoint.local_address().is_ok());
pub async fn close(&self)
pub async fn close(&self)
Close all of this Endpoint
’s Connection
s
immediately and cease accepting new Connection
s.
To close an Endpoint
gracefully use
close_incoming
,
Sender::finish
and
wait_idle
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
endpoint.close();
pub async fn close_incoming(&self) -> Result<(), AlreadyClosed>
pub async fn close_incoming(&self) -> Result<(), AlreadyClosed>
Prevents any new incoming connections. Already incoming connections will
finish first. This will always return error::AlreadyClosed
if the
Endpoint
wasn’t started with a listener.
See Builder::set_server_key_pair
.
Errors
error::AlreadyClosed
if it was already closed.
Examples
use fabruic::{Endpoint, KeyPair};
let endpoint = Endpoint::new_server(0, KeyPair::new_self_signed("test"))?;
assert!(endpoint.close_incoming().await.is_ok());
pub async fn wait_idle(&self)
pub async fn wait_idle(&self)
Wait for all Connection
s to the Endpoint
to
be cleanly shut down. Does not close existing connections or cause
incoming connections to be rejected. See
close_incoming
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
endpoint.wait_idle().await;
Trait Implementations§
§impl Dangerous for Endpoint
impl Dangerous for Endpoint
§fn connect_unverified<'life0, 'async_trait, U>(
endpoint: &'life0 Endpoint,
url: U,
client_key_pair: Option<KeyPair>
) -> Pin<Box<dyn Future<Output = Result<Connecting, Connect>> + Send + 'async_trait>>
fn connect_unverified<'life0, 'async_trait, U>( endpoint: &'life0 Endpoint, url: U, client_key_pair: Option<KeyPair> ) -> Pin<Box<dyn Future<Output = Result<Connecting, Connect>> + Send + 'async_trait>>
Connection
to a server without
verifying the servers Certificate
. The servers
CertificateChain
can still be manually
insepcted through
Connection::peer_identity
. Read more§impl FusedStream for Endpoint
impl FusedStream for Endpoint
§fn is_terminated(&self) -> bool
fn is_terminated(&self) -> bool
true
if the stream should no longer be polled.§impl Stream for Endpoint
impl Stream for Endpoint
§type Item = Connecting
type Item = Connecting
Auto Trait Implementations§
impl !RefUnwindSafe for Endpoint
impl Send for Endpoint
impl Sync for Endpoint
impl Unpin for Endpoint
impl !UnwindSafe for Endpoint
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<St> StreamExt for Stwhere
St: Stream + ?Sized,
impl<St> StreamExt for Stwhere
St: Stream + ?Sized,
§fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
None
if the
stream is finished. Read more§fn try_next<T, E>(&mut self) -> TryNext<'_, Self>
fn try_next<T, E>(&mut self) -> TryNext<'_, Self>
§fn map<T, F>(self, f: F) -> Map<Self, F>
fn map<T, F>(self, f: F) -> Map<Self, F>
§fn map_while<T, F>(self, f: F) -> MapWhile<Self, F>
fn map_while<T, F>(self, f: F) -> MapWhile<Self, F>
None
. Read more§fn then<F, Fut>(self, f: F) -> Then<Self, Fut, F>
fn then<F, Fut>(self, f: F) -> Then<Self, Fut, F>
§fn merge<U>(self, other: U) -> Merge<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
fn merge<U>(self, other: U) -> Merge<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
§fn filter<F>(self, f: F) -> Filter<Self, F>
fn filter<F>(self, f: F) -> Filter<Self, F>
§fn filter_map<T, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<T, F>(self, f: F) -> FilterMap<Self, F>
§fn fuse(self) -> Fuse<Self>where
Self: Sized,
fn fuse(self) -> Fuse<Self>where
Self: Sized,
None
. Read more§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n
items of the underlying stream. Read more§fn take_while<F>(self, f: F) -> TakeWhile<Self, F>
fn take_while<F>(self, f: F) -> TakeWhile<Self, F>
true
. Read more§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n
first items of the
underlying stream. Read more§fn skip_while<F>(self, f: F) -> SkipWhile<Self, F>
fn skip_while<F>(self, f: F) -> SkipWhile<Self, F>
true
. Read more§fn all<F>(&mut self, f: F) -> AllFuture<'_, Self, F>
fn all<F>(&mut self, f: F) -> AllFuture<'_, Self, F>
§fn any<F>(&mut self, f: F) -> AnyFuture<'_, Self, F>
fn any<F>(&mut self, f: F) -> AnyFuture<'_, Self, F>
§fn chain<U>(self, other: U) -> Chain<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
fn chain<U>(self, other: U) -> Chain<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
§fn fold<B, F>(self, init: B, f: F) -> FoldFuture<Self, B, F>
fn fold<B, F>(self, init: B, f: F) -> FoldFuture<Self, B, F>
§fn collect<T>(self) -> Collect<Self, T>where
T: FromStream<Self::Item>,
Self: Sized,
fn collect<T>(self) -> Collect<Self, T>where
T: FromStream<Self::Item>,
Self: Sized,
§fn timeout(self, duration: Duration) -> Timeout<Self>where
Self: Sized,
fn timeout(self, duration: Duration) -> Timeout<Self>where
Self: Sized,
§fn timeout_repeating(self, interval: Interval) -> TimeoutRepeating<Self>where
Self: Sized,
fn timeout_repeating(self, interval: Interval) -> TimeoutRepeating<Self>where
Self: Sized,
§impl<T> StreamExt for Twhere
T: Stream + ?Sized,
impl<T> StreamExt for Twhere
T: Stream + ?Sized,
§fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
§fn into_future(self) -> StreamFuture<Self>
fn into_future(self) -> StreamFuture<Self>
§fn map<T, F>(self, f: F) -> Map<Self, F>
fn map<T, F>(self, f: F) -> Map<Self, F>
§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
§fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>
fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>
§fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>
fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>
§fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
§fn collect<C>(self) -> Collect<Self, C>
fn collect<C>(self) -> Collect<Self, C>
§fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB>
fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB>
§fn concat(self) -> Concat<Self>
fn concat(self) -> Concat<Self>
§fn count(self) -> Count<Self>where
Self: Sized,
fn count(self) -> Count<Self>where
Self: Sized,
§fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F>
fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F>
§fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F>
fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F>
true
if any element in stream satisfied a predicate. Read more§fn all<Fut, F>(self, f: F) -> All<Self, Fut, F>
fn all<Fut, F>(self, f: F) -> All<Self, Fut, F>
true
if all element in stream satisfied a predicate. Read more§fn flatten(self) -> Flatten<Self>where
Self::Item: Stream,
Self: Sized,
fn flatten(self) -> Flatten<Self>where
Self::Item: Stream,
Self: Sized,
§fn flatten_unordered(
self,
limit: impl Into<Option<usize>>
) -> FlattenUnorderedWithFlowController<Self, ()>
fn flatten_unordered( self, limit: impl Into<Option<usize>> ) -> FlattenUnorderedWithFlowController<Self, ()>
§fn flat_map_unordered<U, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> FlatMapUnordered<Self, U, F>
fn flat_map_unordered<U, F>( self, limit: impl Into<Option<usize>>, f: F ) -> FlatMapUnordered<Self, U, F>
StreamExt::map
] but flattens nested Stream
s
and polls them concurrently, yielding items in any order, as they made
available. Read more§fn scan<S, B, Fut, F>(self, initial_state: S, f: F) -> Scan<Self, S, Fut, F>
fn scan<S, B, Fut, F>(self, initial_state: S, f: F) -> Scan<Self, S, Fut, F>
StreamExt::fold
] that holds internal state
and produces a new stream. Read more§fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F>
fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F>
true
. Read more§fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>
fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>
true
. Read more§fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>
fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>
§fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F>
fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F>
§fn for_each_concurrent<Fut, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> ForEachConcurrent<Self, Fut, F>
fn for_each_concurrent<Fut, F>( self, limit: impl Into<Option<usize>>, f: F ) -> ForEachConcurrent<Self, Fut, F>
§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n
items of the underlying stream. Read more§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n
items of the underlying stream. Read more§fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
§fn boxed<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a>>
fn boxed<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a>>
§fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a>>where
Self: Sized + 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a>>where
Self: Sized + 'a,
§fn buffered(self, n: usize) -> Buffered<Self>
fn buffered(self, n: usize) -> Buffered<Self>
§fn buffer_unordered(self, n: usize) -> BufferUnordered<Self>
fn buffer_unordered(self, n: usize) -> BufferUnordered<Self>
§fn zip<St>(self, other: St) -> Zip<Self, St>where
St: Stream,
Self: Sized,
fn zip<St>(self, other: St) -> Zip<Self, St>where
St: Stream,
Self: Sized,
§fn chain<St>(self, other: St) -> Chain<Self, St>where
St: Stream<Item = Self::Item>,
Self: Sized,
fn chain<St>(self, other: St) -> Chain<Self, St>where
St: Stream<Item = Self::Item>,
Self: Sized,
§fn peekable(self) -> Peekable<Self>where
Self: Sized,
fn peekable(self) -> Peekable<Self>where
Self: Sized,
peek
method. Read more§fn chunks(self, capacity: usize) -> Chunks<Self>where
Self: Sized,
fn chunks(self, capacity: usize) -> Chunks<Self>where
Self: Sized,
§fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>where
Self: Sized,
fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>where
Self: Sized,
§fn forward<S>(self, sink: S) -> Forward<Self, S>where
S: Sink<Self::Ok, Error = Self::Error>,
Self: TryStream + Sized,
fn forward<S>(self, sink: S) -> Forward<Self, S>where
S: Sink<Self::Ok, Error = Self::Error>,
Self: TryStream + Sized,
§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
§fn left_stream<B>(self) -> Either<Self, B>where
B: Stream<Item = Self::Item>,
Self: Sized,
fn left_stream<B>(self) -> Either<Self, B>where
B: Stream<Item = Self::Item>,
Self: Sized,
§fn right_stream<B>(self) -> Either<B, Self>where
B: Stream<Item = Self::Item>,
Self: Sized,
fn right_stream<B>(self) -> Either<B, Self>where
B: Stream<Item = Self::Item>,
Self: Sized,
§fn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>>where
Self: Unpin,
fn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>>where
Self: Unpin,
Stream::poll_next
] on Unpin
stream types.