Struct SVCB
pub struct SVCB { /* private fields */ }
Expand description
RFC 9460 SVCB and HTTPS Resource Records, Nov 2023
2.2. RDATA wire format
The RDATA for the SVCB RR consists of:
* a 2 octet field for SvcPriority as an integer in network byte
order.
* the uncompressed, fully-qualified TargetName, represented as a
sequence of length-prefixed labels as in Section 3.1 of [RFC1035].
* the SvcParams, consuming the remainder of the record (so smaller
than 65535 octets and constrained by the RDATA and DNS message
sizes).
When the list of SvcParams is non-empty (ServiceMode), it contains a
series of SvcParamKey=SvcParamValue pairs, represented as:
* a 2 octet field containing the SvcParamKey as an integer in
network byte order. (See Section 14.3.2 for the defined values.)
* a 2 octet field containing the length of the SvcParamValue as an
integer between 0 and 65535 in network byte order
* an octet string of this length whose contents are the SvcParamValue
in a format determined by the SvcParamKey
SvcParamKeys SHALL appear in increasing numeric order.
Clients MUST consider an RR malformed if:
* the end of the RDATA occurs within a SvcParam.
* SvcParamKeys are not in strictly increasing numeric order.
* the SvcParamValue for an SvcParamKey does not have the expected
format.
Note that the second condition implies that there are no duplicate
SvcParamKeys.
If any RRs are malformed, the client MUST reject the entire RRSet and
fall back to non-SVCB connection establishment.
Implementations§
§impl SVCB
impl SVCB
pub fn new(
svc_priority: u16,
target_name: Name,
svc_params: Vec<(SvcParamKey, SvcParamValue)>,
) -> SVCB
pub fn new( svc_priority: u16, target_name: Name, svc_params: Vec<(SvcParamKey, SvcParamValue)>, ) -> SVCB
Create a new SVCB record from parts
It is up to the caller to validate the data going into the record
pub fn svc_priority(&self) -> u16
pub fn svc_priority(&self) -> u16
RFC 9460 SVCB and HTTPS Resource Records, Nov 2023
2.4.1. SvcPriority
When SvcPriority is 0 the SVCB record is in AliasMode
(Section 2.4.2). Otherwise, it is in ServiceMode (Section 2.4.3).
Within a SVCB RRSet, all RRs SHOULD have the same Mode. If an RRSet
contains a record in AliasMode, the recipient MUST ignore any
ServiceMode records in the set.
RRSets are explicitly unordered collections, so the SvcPriority field
is used to impose an ordering on SVCB RRs. A smaller SvcPriority indicates
that the domain owner recommends the use of this record over ServiceMode
RRs with a larger SvcPriority value.
When receiving an RRSet containing multiple SVCB records with the
same SvcPriority value, clients SHOULD apply a random shuffle within
a priority level to the records before using them, to ensure uniform
load-balancing.
pub fn target_name(&self) -> &Name
pub fn target_name(&self) -> &Name
RFC 9460 SVCB and HTTPS Resource Records, Nov 2023
2.5. Special handling of "." in TargetName
If TargetName has the value "." (represented in the wire format as a
zero-length label), special rules apply.
2.5.1. AliasMode
For AliasMode SVCB RRs, a TargetName of "." indicates that the
service is not available or does not exist. This indication is
advisory: clients encountering this indication MAY ignore it and
attempt to connect without the use of SVCB.
2.5.2. ServiceMode
For ServiceMode SVCB RRs, if TargetName has the value ".", then the
owner name of this record MUST be used as the effective TargetName.
If the record has a wildcard owner name in the zone file, the recipient
SHALL use the response's synthesized owner name as the effective TargetName.
Here, for example, "svc2.example.net" is the effective TargetName:
example.com. 7200 IN HTTPS 0 svc.example.net.
svc.example.net. 7200 IN CNAME svc2.example.net.
svc2.example.net. 7200 IN HTTPS 1 . port=8002
svc2.example.net. 300 IN A 192.0.2.2
svc2.example.net. 300 IN AAAA 2001:db8::2
pub fn svc_params(&self) -> &[(SvcParamKey, SvcParamValue)]
pub fn svc_params(&self) -> &[(SvcParamKey, SvcParamValue)]
See SvcParamKey
for details on each parameter
Trait Implementations§
§impl BinEncodable for SVCB
impl BinEncodable for SVCB
§fn emit(&self, encoder: &mut BinEncoder<'_>) -> Result<(), ProtoError>
fn emit(&self, encoder: &mut BinEncoder<'_>) -> Result<(), ProtoError>
Write the type to the stream
§impl Display for SVCB
impl Display for SVCB
simple.example. 7200 IN HTTPS 1 . alpn=h3
pool 7200 IN HTTPS 1 h3pool alpn=h2,h3 ech="123..."
HTTPS 2 . alpn=h2 ech="abc..."
@ 7200 IN HTTPS 0 www
_8765._baz.api.example.com. 7200 IN SVCB 0 svc4-baz.example.net.
§impl RecordData for SVCB
impl RecordData for SVCB
§fn try_from_rdata(data: RData) -> Result<SVCB, RData>
fn try_from_rdata(data: RData) -> Result<SVCB, RData>
Attempts to convert to this RecordData from the RData type, if it is not the correct type the original is returned
§fn try_borrow(data: &RData) -> Option<&SVCB>
fn try_borrow(data: &RData) -> Option<&SVCB>
Attempts to borrow this RecordData from the RData type, if it is not the correct type the original is returned
§fn record_type(&self) -> RecordType
fn record_type(&self) -> RecordType
Get the associated RecordType for the RecordData
§fn into_rdata(self) -> RData
fn into_rdata(self) -> RData
Converts this RecordData into generic RecordData
impl Eq for SVCB
impl StructuralPartialEq for SVCB
Auto Trait Implementations§
impl Freeze for SVCB
impl RefUnwindSafe for SVCB
impl Send for SVCB
impl Sync for SVCB
impl Unpin for SVCB
impl UnwindSafe for SVCB
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key
and return true
if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Checks if this value is equivalent to the given key. Read more
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§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> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§fn and<P, B, E>(self, other: P) -> And<T, P>
fn and<P, B, E>(self, other: P) -> And<T, P>
Create a new
Policy
that returns Action::Follow
only if self
and other
return
Action::Follow
. Read more§impl<T, U> RamaTryFrom<T> for Uwhere
U: TryFrom<T>,
impl<T, U> RamaTryFrom<T> for Uwhere
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
fn rama_try_from(value: T) -> Result<U, <U as RamaTryFrom<T>>::Error>
§impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for Twhere
U: RamaTryFrom<T, CrateMarker>,
impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for Twhere
U: RamaTryFrom<T, CrateMarker>,
type Error = <U as RamaTryFrom<T, CrateMarker>>::Error
fn rama_try_into(self) -> Result<U, <U as RamaTryFrom<T, CrateMarker>>::Error>
§impl<T> ToSmolStr for T
impl<T> ToSmolStr for T
fn to_smolstr(&self) -> SmolStr
§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string
, but without panic on OOM.